ZGlmZiAtLWdpdCBhL0RvYy9BQ0tTIGIvRG9jL0FDS1MKaW5kZXggYmJiMzI0MS4uM2MyNjYyZCAxMDA2NDQKLS0tIGEvRG9jL0FDS1MKKysrIGIvRG9jL0FDS1MKQEAgLTE5MCw2ICsxOTAsNyBAQAogTWF0cyBXaWNobWFubgogR2VycnkgV2llbmVyCiBUaW1vdGh5IFdpbGQKK0NvbGxpbiBXaW50ZXIKIEJsYWtlIFdpbnRvbgogRGFuIFdvbGZlCiBTdGV2ZW4gV29yawpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlIGIvRG9jL01ha2VmaWxlCmluZGV4IDBkMzkxYWYuLmE0MzVmMTEgMTAwNjQ0Ci0tLSBhL0RvYy9NYWtlZmlsZQorKysgYi9Eb2MvTWFrZWZpbGUKQEAgLTY5MSw3ICs2OTEsNyBAQAogIyBUaGUgc21hbGwgYW1vdW50IG9mIGFkZGl0aW9uYWwgd29yayBpcyBhIHNtYWxsIHByaWNlIHRvIHBheSBmb3Igbm90CiAjIGhhdmluZyB0byByZW1lbWJlciB3aGljaCBvcmRlciB0byBkbyBpdCBpbi4gOykKIHBhcGVyZGlzdDoJZGlzdHBkZiBkaXN0cHMgcGtnbGlzdAotZWRpc3Q6CQlkaXN0aHRtbCBkaXN0aW5mbyB6aXBpc2lsbyBwa2dsaXN0CitlZGlzdDoJCWRpc3RodG1sIHBrZ2xpc3QKIAogIyBUaGUgcGtnbGlzdC5odG1sIGZpbGUgaXMgdXNlZCBhcyBwYXJ0IG9mIHRoZSBkb3dubG9hZC5odG1sIHBhZ2Ugb24KICMgcHl0aG9uLm9yZzsgaXQgaXMgbm90IHVzZWQgYXMgaW50ZXJtZWRpYXRlIGlucHV0IGhlcmUgb3IgYXMgcGFydCBvZgpkaWZmIC0tZ2l0IGEvRG9jL01ha2VmaWxlLmRlcHMgYi9Eb2MvTWFrZWZpbGUuZGVwcwppbmRleCAyZmMzMjUwLi5mODI4ZTFiIDEwMDY0NAotLS0gYS9Eb2MvTWFrZWZpbGUuZGVwcworKysgYi9Eb2MvTWFrZWZpbGUuZGVwcwpAQCAtMjcwLDYgKzI3MCw3IEBACiAJbGliL3htbHNheGhhbmRsZXIudGV4IFwKIAlsaWIveG1sc2F4dXRpbHMudGV4IFwKIAlsaWIveG1sc2F4cmVhZGVyLnRleCBcCisJbGliL2xpYmV0cmVlLnRleCBcCiAJbGliL2xpYnF1ZXVlLnRleCBcCiAJbGliL2xpYmxvY2FsZS50ZXggXAogCWxpYi9saWJnZXR0ZXh0LnRleCBcCmRpZmYgLS1naXQgYS9Eb2MvYXBpL2FwaS50ZXggYi9Eb2MvYXBpL2FwaS50ZXgKaW5kZXggNmZhOGM0MS4uY2YyOGY1YiAxMDA2NDQKLS0tIGEvRG9jL2FwaS9hcGkudGV4CisrKyBiL0RvYy9hcGkvYXBpLnRleApAQCAtNDgsMTEgKzQ4LDYgQEAKIFxpbnB1dHtuZXd0eXBlc30KIAogCi0lIFxjaGFwdGVye0RlYnVnZ2luZyBcbGFiZWx7ZGVidWdnaW5nfX0KLSUKLSUgWFhYIEV4cGxhaW4gUHlfREVCVUcsIFB5X1RSQUNFX1JFRlMsIFB5X1JFRl9ERUJVRy4KLQotCiBcYXBwZW5kaXgKIFxjaGFwdGVye1JlcG9ydGluZyBCdWdzfQogXGlucHV0e3JlcG9ydGluZ2J1Z3N9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2NvbmNyZXRlLnRleCBiL0RvYy9hcGkvY29uY3JldGUudGV4CmluZGV4IDEwMjQ3YWIuLjRjNzQ4N2MgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvY29uY3JldGUudGV4CisrKyBiL0RvYy9hcGkvY29uY3JldGUudGV4CkBAIC0zMSw3ICszMSw3IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlPYmplY3QqfXtQeVR5cGVfVHlwZX0KICAgVGhpcyBpcyB0aGUgdHlwZSBvYmplY3QgZm9yIHR5cGUgb2JqZWN0czsgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzCi0gIFxjb2Rle3R5cGVzLlR5cGVUeXBlfSBpbiB0aGUgUHl0aG9uIGxheWVyLgorICBcY29kZXt0eXBlfSBhbmQgXGNvZGV7dHlwZXMuVHlwZVR5cGV9IGluIHRoZSBQeXRob24gbGF5ZXIuCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHlwZVR5cGV9fQogXGVuZHtjdmFyZGVzY30KIApAQCAtMTE3LDcgKzExNyw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUludF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBwbGFpbgotICBpbnRlZ2VyIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5JbnRUeXBlfS4KKyAgaW50ZWdlciB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7aW50fSBhbmQKKyAgXGNvZGV7dHlwZXMuSW50VHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0ludFR5cGV9fQogXGVuZHtjdmFyZGVzY30KIApAQCAtMjYwLDcgKzI2MSw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUxvbmdfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gbG9uZwotICBpbnRlZ2VyIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5Mb25nVHlwZX0uCisgIGludGVnZXIgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle2xvbmd9IGFuZAorICBcY29kZXt0eXBlcy5Mb25nVHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0xvbmdUeXBlfX0KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTM3Niw3ICszNzgsNyBAQAogICBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7Y2Z1bmNkZXNjfQogCi1cYmVnaW57Y2Z1bmNkZXNjfXt1bnNpZ25lZCBsb25nfXtQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFza317UHlPYmplY3QgKmlvfQorXGJlZ2lue2NmdW5jZGVzY317dW5zaWduZWQgUFlfTE9OR19MT05HfXtQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nTWFza317UHlPYmplY3QgKmlvfQogICBSZXR1cm4gYSBDIFxjdHlwZXt1bnNpZ25lZCBsb25nIGxvbmd9IGZyb20gYSBQeXRob24gbG9uZyBpbnRlZ2VyLCB3aXRob3V0CiAgIGNoZWNraW5nIGZvciBvdmVyZmxvdy4KICAgXHZlcnNpb25hZGRlZHsyLjN9CkBAIC00MTEsNyArNDEzLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5RmxvYXRfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24gZmxvYXRpbmcKLSAgcG9pbnQgdHlwZS4gIFRoaXMgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle3R5cGVzLkZsb2F0VHlwZX0uCisgIHBvaW50IHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtmbG9hdH0gYW5kCisgIFxjb2Rle3R5cGVzLkZsb2F0VHlwZX0uCiAgIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlcyB0eXBlcyl9e1x0dGluZGV4e0Zsb2F0VHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCkBAIC01MjAsNyArNTIzLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5Q29tcGxleF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBjb21wbGV4Ci0gIG51bWJlciB0eXBlLgorICBudW1iZXIgdHlwZS4gSXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle2NvbXBsZXh9IGFuZAorICBcY29kZXt0eXBlcy5Db21wbGV4VHlwZX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5Q29tcGxleF9DaGVja317UHlPYmplY3QgKnB9CkBAIC01ODAsOCArNTg0LDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5U3RyaW5nX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIHN0cmluZwotICB0eXBlOyBpdCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7dHlwZXMuVHlwZVR5cGV9IGluIHRoZSBQeXRob24KLSAgbGF5ZXIuCisgIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtzdHJ9IGFuZCBcY29kZXt0eXBlcy5TdHJpbmdUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e1N0cmluZ1R5cGV9fS4KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTg1MCw3ICs4NTQsOCBAQAogCiBcYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlVbmljb2RlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIFVuaWNvZGUKLSAgdHlwZS4KKyAgdHlwZS4gIEl0IGlzIGV4cG9zZWQgdG8gUHl0aG9uIGNvZGUgYXMgXGNvZGV7dW5pY29kZX0gYW5kCisgIFxjb2Rle3R5cGVzLlVuaWNvZGVUeXBlfS4KIFxlbmR7Y3ZhcmRlc2N9CiAKIFRoZSBmb2xsb3dpbmcgQVBJcyBhcmUgcmVhbGx5IEMgbWFjcm9zIGFuZCBjYW4gYmUgdXNlZCB0byBkbyBmYXN0CkBAIC0xMDAxLDIxICsxMDA2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnN9CiAgIENvZXJjZSBhbiBlbmNvZGVkIG9iamVjdCBcdmFye29ian0gdG8gYW4gVW5pY29kZSBvYmplY3QgYW5kIHJldHVybiBhCiAgIHJlZmVyZW5jZSB3aXRoIGluY3JlbWVudGVkIHJlZmNvdW50LgorICAKKyAgU3RyaW5nIGFuZCBvdGhlciBjaGFyIGJ1ZmZlciBjb21wYXRpYmxlIG9iamVjdHMgYXJlIGRlY29kZWQKKyAgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nCisgIGRlZmluZWQgYnkgZXJyb3JzLiAgQm90aCBjYW4gYmUgXE5VTEx7fSB0byBoYXZlIHRoZSBpbnRlcmZhY2UKKyAgdXNlIHRoZSBkZWZhdWx0IHZhbHVlcyAoc2VlIHRoZSBuZXh0IHNlY3Rpb24gZm9yIGRldGFpbHMpLgogCi0gIENvZXJjaW9uIGlzIGRvbmUgaW4gdGhlIGZvbGxvd2luZyB3YXk6Ci0KLVxiZWdpbntlbnVtZXJhdGV9Ci1caXRlbSAgVW5pY29kZSBvYmplY3RzIGFyZSBwYXNzZWQgYmFjayBhcy1pcyB3aXRoIGluY3JlbWVudGVkCi0gICAgICAgcmVmY291bnQuIFxub3Rle1RoZXNlIGNhbm5vdCBiZSBkZWNvZGVkOyBwYXNzaW5nIGEgbm9uLVxOVUxMe30KLSAgICAgICB2YWx1ZSBmb3IgZW5jb2Rpbmcgd2lsbCByZXN1bHQgaW4gYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0ufQotCi1caXRlbSBTdHJpbmcgYW5kIG90aGVyIGNoYXIgYnVmZmVyIGNvbXBhdGlibGUgb2JqZWN0cyBhcmUgZGVjb2RlZAotICAgICAgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBlbmNvZGluZyBhbmQgdXNpbmcgdGhlIGVycm9yIGhhbmRsaW5nCi0gICAgICBkZWZpbmVkIGJ5IGVycm9ycy4gIEJvdGggY2FuIGJlIFxOVUxMe30gdG8gaGF2ZSB0aGUgaW50ZXJmYWNlCi0gICAgICB1c2UgdGhlIGRlZmF1bHQgdmFsdWVzIChzZWUgdGhlIG5leHQgc2VjdGlvbiBmb3IgZGV0YWlscykuCi0KLVxpdGVtIEFsbCBvdGhlciBvYmplY3RzIGNhdXNlIGFuIGV4Y2VwdGlvbi4KLVxlbmR7ZW51bWVyYXRlfQorICBBbGwgb3RoZXIgb2JqZWN0cywgaW5jbHVkaW5nIFVuaWNvZGUgb2JqZWN0cywgY2F1c2UgYQorICBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gdG8gYmUgc2V0LgogCiAgIFRoZSBBUEkgcmV0dXJucyBcTlVMTHt9IGlmIHRoZXJlIHdhcyBhbiBlcnJvci4gIFRoZSBjYWxsZXIgaXMKICAgcmVzcG9uc2libGUgZm9yIGRlY3JlZidpbmcgdGhlIHJldHVybmVkIG9iamVjdHMuCkBAIC0xNDMxLDYgKzE0MjksMTggQEAKICAgcmFpc2VkIGJ5IHRoZSBjb2RlYy4KIFxlbmR7Y2Z1bmNkZXNjfQogCitcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWx9e2NvbnN0IGNoYXIgKnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICplcnJvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqY29uc3VtZWR9CisgIElmIFx2YXJ7Y29uc3VtZWR9IGlzIFxOVUxMe30sIGJlaGF2ZSBsaWtlCisgIFxjZnVuY3Rpb257UHlVbmljb2RlX0RlY29kZU1CQ1MoKX0uIElmIFx2YXJ7Y29uc3VtZWR9IGlzIG5vdCBcTlVMTHt9LAorICBcY2Z1bmN0aW9ue1B5VW5pY29kZV9EZWNvZGVNQkNTU3RhdGVmdWwoKX0gd2lsbCBub3QgZGVjb2RlIHRyYWlsaW5nIGxlYWQKKyAgYnl0ZSBhbmQgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBkZWNvZGVkIHdpbGwgYmUgc3RvcmVkIGluCisgIFx2YXJ7Y29uc3VtZWR9LgorICBcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2Z1bmNkZXNjfQorCiBcYmVnaW57Y2Z1bmNkZXNjfXtQeU9iamVjdCp9e1B5VW5pY29kZV9FbmNvZGVNQkNTfXtjb25zdCBQeV9VTklDT0RFICpzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVycm9yc30KQEAgLTE2MTgsOCArMTYyOCw5IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeUJ1ZmZlcl9UeXBlfQogICBUaGUgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gd2hpY2ggcmVwcmVzZW50cyB0aGUgUHl0aG9uCi0gIGJ1ZmZlciB0eXBlOyBpdCBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7dHlwZXMuQnVmZmVyVHlwZX0gaW4gdGhlCi0gIFB5dGhvbiBsYXllci5cd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e0J1ZmZlclR5cGV9fS4KKyAgYnVmZmVyIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXtidWZmZXJ9IGFuZCAKKyAgXGNvZGV7dHlwZXMuQnVmZmVyVHlwZX0gaW4gdGhlIFB5dGhvbiBsYXllci4KKyAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtCdWZmZXJUeXBlfX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y3ZhcmRlc2N9e2ludH17UHlfRU5EX09GX0JVRkZFUn0KQEAgLTE2OTMsOCArMTcwNCw4IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVR1cGxlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIHR1cGxlCi0gIHR5cGU7IGl0IGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5UdXBsZVR5cGV9IGluIHRoZSBQeXRob24KLSAgbGF5ZXIuXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtUdXBsZVR5cGV9fS4KKyAgdHlwZTsgaXQgaXMgdGhlIHNhbWUgb2JqZWN0IGFzIFxjb2Rle3R1cGxlfSBhbmQgXGNvZGV7dHlwZXMuVHVwbGVUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLlx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7VHVwbGVUeXBlfX0uCiBcZW5ke2N2YXJkZXNjfQogCiBcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5VHVwbGVfQ2hlY2t9e1B5T2JqZWN0ICpwfQpAQCAtMTc5MCw4ICsxODAxLDggQEAKIAogXGJlZ2lue2N2YXJkZXNjfXtQeVR5cGVPYmplY3R9e1B5TGlzdF9UeXBlfQogICBUaGlzIGluc3RhbmNlIG9mIFxjdHlwZXtQeVR5cGVPYmplY3R9IHJlcHJlc2VudHMgdGhlIFB5dGhvbiBsaXN0Ci0gIHR5cGUuICBUaGlzIGlzIHRoZSBzYW1lIG9iamVjdCBhcyBcY29kZXt0eXBlcy5MaXN0VHlwZX0uCi0gIFx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7TGlzdFR5cGV9fQorICB0eXBlLiAgVGhpcyBpcyB0aGUgc2FtZSBvYmplY3QgYXMgXGNvZGV7bGlzdH0gYW5kIFxjb2Rle3R5cGVzLkxpc3RUeXBlfQorICBpbiB0aGUgUHl0aG9uIGxheWVyLlx3aXRoc3ViaXRlbXsoaW4gbW9kdWxlIHR5cGVzKX17XHR0aW5kZXh7TGlzdFR5cGV9fQogXGVuZHtjdmFyZGVzY30KIAogXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUxpc3RfQ2hlY2t9e1B5T2JqZWN0ICpwfQpAQCAtMTkxOSw3ICsxOTMwLDcgQEAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeURpY3RfVHlwZX0KICAgVGhpcyBpbnN0YW5jZSBvZiBcY3R5cGV7UHlUeXBlT2JqZWN0fSByZXByZXNlbnRzIHRoZSBQeXRob24KICAgZGljdGlvbmFyeSB0eXBlLiAgVGhpcyBpcyBleHBvc2VkIHRvIFB5dGhvbiBwcm9ncmFtcyBhcwotICBcY29kZXt0eXBlcy5EaWN0VHlwZX0gYW5kIFxjb2Rle3R5cGVzLkRpY3Rpb25hcnlUeXBlfS4KKyAgXGNvZGV7ZGljdH0gYW5kIFxjb2Rle3R5cGVzLkRpY3RUeXBlfS4KICAgXHdpdGhzdWJpdGVteyhpbiBtb2R1bGUgdHlwZXMpfXtcdHRpbmRleHtEaWN0VHlwZX1cdHRpbmRleHtEaWN0aW9uYXJ5VHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCkBAIC0yMTM0LDcgKzIxNDUsOCBAQAogCiBcYmVnaW57Y3ZhcmRlc2N9e1B5VHlwZU9iamVjdH17UHlGaWxlX1R5cGV9CiAgIFRoaXMgaW5zdGFuY2Ugb2YgXGN0eXBle1B5VHlwZU9iamVjdH0gcmVwcmVzZW50cyB0aGUgUHl0aG9uIGZpbGUKLSAgdHlwZS4gIFRoaXMgaXMgZXhwb3NlZCB0byBQeXRob24gcHJvZ3JhbXMgYXMgXGNvZGV7dHlwZXMuRmlsZVR5cGV9LgorICB0eXBlLiAgVGhpcyBpcyBleHBvc2VkIHRvIFB5dGhvbiBwcm9ncmFtcyBhcyBcY29kZXtmaWxlfSBhbmQKKyAgXGNvZGV7dHlwZXMuRmlsZVR5cGV9LgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e0ZpbGVUeXBlfX0KIFxlbmR7Y3ZhcmRlc2N9CiAKQEAgLTI1ODMsNyArMjU5NSw3IEBACiAKIFxiZWdpbntjdmFyZGVzY317UHlUeXBlT2JqZWN0fXtQeVNsaWNlX1R5cGV9CiAgIFRoZSB0eXBlIG9iamVjdCBmb3Igc2xpY2Ugb2JqZWN0cy4gIFRoaXMgaXMgdGhlIHNhbWUgYXMKLSAgXGNvZGV7dHlwZXMuU2xpY2VUeXBlfS4KKyAgXGNvZGV7c2xpY2V9IGFuZCBcY29kZXt0eXBlcy5TbGljZVR5cGV9LgogICBcd2l0aHN1Yml0ZW17KGluIG1vZHVsZSB0eXBlcyl9e1x0dGluZGV4e1NsaWNlVHlwZX19CiBcZW5ke2N2YXJkZXNjfQogCmRpZmYgLS1naXQgYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4IGIvRG9jL2FwaS9leGNlcHRpb25zLnRleAppbmRleCA2ZGJlODE4Li4yYTlkYjU0IDEwMDY0NAotLS0gYS9Eb2MvYXBpL2V4Y2VwdGlvbnMudGV4CisrKyBiL0RvYy9hcGkvZXhjZXB0aW9ucy50ZXgKQEAgLTI1NiwxMCArMjU2LDE0IEBACiAgIGFyZ3VtZW50LiAgSXQgaXMgbW9zdGx5IGZvciBpbnRlcm5hbCB1c2UuCiBcZW5ke2NmdW5jZGVzY30KIAotXGJlZ2lue2NmdW5jZGVzY317aW50fXtQeUVycl9XYXJufXtQeU9iamVjdCAqY2F0ZWdvcnksIGNoYXIgKm1lc3NhZ2V9CitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX1dhcm5FeH17UHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICptZXNzYWdlLCBpbnQgc3RhY2tsZXZlbH0KICAgSXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgXHZhcntjYXRlZ29yeX0gYXJndW1lbnQgaXMgYSB3YXJuaW5nCiAgIGNhdGVnb3J5IChzZWUgYmVsb3cpIG9yIFxOVUxMOyB0aGUgXHZhcnttZXNzYWdlfSBhcmd1bWVudCBpcyBhCi0gIG1lc3NhZ2Ugc3RyaW5nLgorICBtZXNzYWdlIHN0cmluZy4gIFx2YXJ7c3RhY2tsZXZlbH0gaXMgYSBwb3NpdGl2ZSBudW1iZXIgZ2l2aW5nIGEKKyAgbnVtYmVyIG9mIHN0YWNrIGZyYW1lczsgdGhlIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgZnJvbSB0aGUgCisgIGN1cnJlbnRseSBleGVjdXRpbmcgbGluZSBvZiBjb2RlIGluIHRoYXQgc3RhY2sgZnJhbWUuICBBIFx2YXJ7c3RhY2tsZXZlbH0KKyAgb2YgMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyAKKyAgdGhlIGZ1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4KIAogICBUaGlzIGZ1bmN0aW9uIG5vcm1hbGx5IHByaW50cyBhIHdhcm5pbmcgbWVzc2FnZSB0byBcdmFye3N5cy5zdGRlcnJ9OwogICBob3dldmVyLCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGF0CkBAIC0yOTEsNiArMjk1LDE2IEBACiAgIGNvbW1hbmQgbGluZSBkb2N1bWVudGF0aW9uLiAgVGhlcmUgaXMgbm8gQyBBUEkgZm9yIHdhcm5pbmcgY29udHJvbC4KIFxlbmR7Y2Z1bmNkZXNjfQogCitcYmVnaW57Y2Z1bmNkZXNjfXtpbnR9e1B5RXJyX1dhcm59e1B5T2JqZWN0ICpjYXRlZ29yeSwgY2hhciAqbWVzc2FnZX0KKyAgSXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGUgXHZhcntjYXRlZ29yeX0gYXJndW1lbnQgaXMgYSB3YXJuaW5nCisgIGNhdGVnb3J5IChzZWUgYmVsb3cpIG9yIFxOVUxMOyB0aGUgXHZhcnttZXNzYWdlfSBhcmd1bWVudCBpcyBhCisgIG1lc3NhZ2Ugc3RyaW5nLiAgVGhlIHdhcm5pbmcgd2lsbCBhcHBlYXIgdG8gYmUgaXNzdWVkIGZyb20gdGhlIGZ1bmN0aW9uCisgIGNhbGxpbmcgXGNmdW5jdGlvbntQeUVycl9XYXJuKCl9LCBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgXGNmdW5jdGlvbntQeUVycl9XYXJuRXgoKX0gd2l0aCBhIFx2YXJ7c3RhY2tsZXZlbH0gb2YgMS4KKyAgCisgIERlcHJlY2F0ZWQ7IHVzZSBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSBpbnN0ZWFkLgorXGVuZHtjZnVuY2Rlc2N9CisKIFxiZWdpbntjZnVuY2Rlc2N9e2ludH17UHlFcnJfV2FybkV4cGxpY2l0fXtQeU9iamVjdCAqY2F0ZWdvcnksCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWVzc2FnZSwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBsaW5lbm8sCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbW9kdWxlLCBQeU9iamVjdCAqcmVnaXN0cnl9CmRpZmYgLS1naXQgYS9Eb2MvYXBpL2ludHJvLnRleCBiL0RvYy9hcGkvaW50cm8udGV4CmluZGV4IDk2ZjE4ZWMuLmMyYzNmZWMgMTAwNjQ0Ci0tLSBhL0RvYy9hcGkvaW50cm8udGV4CisrKyBiL0RvYy9hcGkvaW50cm8udGV4CkBAIC01NzcsMyArNTc3LDU5IEBACiBOb3RpY2UgdGhhdCBcY2Z1bmN0aW9ue1B5X0ZpbmFsaXplfSBkb2VzIFxlbXBoe25vdH0gZnJlZSBhbGwgbWVtb3J5CiBhbGxvY2F0ZWQgYnkgdGhlIFB5dGhvbiBpbnRlcnByZXRlciwgZS5nLiBtZW1vcnkgYWxsb2NhdGVkIGJ5IGV4dGVuc2lvbgogbW9kdWxlcyBjdXJyZW50bHkgY2Fubm90IGJlIHJlbGVhc2VkLgorCisKK1xzZWN0aW9ue0RlYnVnZ2luZyBCdWlsZHMgXGxhYmVse2RlYnVnZ2luZ319CisKK1B5dGhvbiBjYW4gYmUgYnVpbHQgd2l0aCBzZXZlcmFsIG1hY3JvcyB0byBlbmFibGUgZXh0cmEgY2hlY2tzIG9mIHRoZQoraW50ZXJwcmV0ZXIgYW5kIGV4dGVuc2lvbiBtb2R1bGVzLiAgVGhlc2UgY2hlY2tzIHRlbmQgdG8gYWRkIGEgbGFyZ2UKK2Ftb3VudCBvZiBvdmVyaGVhZCB0byB0aGUgcnVudGltZSBzbyB0aGV5IGFyZSBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCitBIGZ1bGwgbGlzdCBvZiB0aGUgdmFyaW91cyB0eXBlcyBvZiBkZWJ1Z2dpbmcgYnVpbGRzIGlzIGluIHRoZSBmaWxlCitcZmlsZXtNaXNjL1NwZWNpYWxCdWlsZHMudHh0fSBpbiB0aGUgUHl0aG9uIHNvdXJjZSBkaXN0cmlidXRpb24uCitCdWlsZHMgYXJlIGF2YWlsYWJsZSB0aGF0IHN1cHBvcnQgdHJhY2luZyBvZiByZWZlcmVuY2UgY291bnRzLAorZGVidWdnaW5nIHRoZSBtZW1vcnkgYWxsb2NhdG9yLCBvciBsb3ctbGV2ZWwgcHJvZmlsaW5nIG9mIHRoZSBtYWluCitpbnRlcnByZXRlciBsb29wLiAgT25seSB0aGUgbW9zdCBmcmVxdWVudGx5LXVzZWQgYnVpbGRzIHdpbGwgYmUKK2Rlc2NyaWJlZCBpbiB0aGUgcmVtYWluZGVyIG9mIHRoaXMgc2VjdGlvbi4KKworQ29tcGlsaW5nIHRoZSBpbnRlcnByZXRlciB3aXRoIHRoZSBcY3NpbXBsZW1hY3Jve1B5X0RFQlVHfSBtYWNybworZGVmaW5lZCBwcm9kdWNlcyB3aGF0IGlzIGdlbmVyYWxseSBtZWFudCBieSAiYSBkZWJ1ZyBidWlsZCIgb2YgUHl0aG9uLgorXGNzaW1wbGVtYWNyb3tQeV9ERUJVR30gaXMgZW5hYmxlZCBpbiB0aGUgXFVOSVh7fSBidWlsZCBieSBhZGRpbmcKK1xsb25ncHJvZ3JhbW9wdHt3aXRoLXB5ZGVidWd9IHRvIHRoZSBcZmlsZXtjb25maWd1cmV9IGNvbW1hbmQuICBJdCBpcyBhbHNvCitpbXBsaWVkIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgbm90LVB5dGhvbi1zcGVjaWZpYworXGNzaW1wbGVtYWNyb3tfREVCVUd9IG1hY3JvLiAgV2hlbiBcY3NpbXBsZW1hY3Jve1B5X0RFQlVHfSBpcyBlbmFibGVkCitpbiB0aGUgXFVOSVh7fSBidWlsZCwgY29tcGlsZXIgb3B0aW1pemF0aW9uIGlzIGRpc2FibGVkLgorCitJbiBhZGRpdGlvbiB0byB0aGUgcmVmZXJlbmNlIGNvdW50IGRlYnVnZ2luZyBkZXNjcmliZWQgYmVsb3csIHRoZQorZm9sbG93aW5nIGV4dHJhIGNoZWNrcyBhcmUgcGVyZm9ybWVkOgorCitcYmVnaW57aXRlbWl6ZX0KKyAgICAgIFxpdGVtIEV4dHJhIGNoZWNrcyBhcmUgYWRkZWQgdG8gdGhlIG9iamVjdCBhbGxvY2F0b3IuCisgICAgICBcaXRlbSBFeHRyYSBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBwYXJzZXIgYW5kIGNvbXBpbGVyLgorICAgICAgXGl0ZW0gRG93bmNhc3RzIGZyb20gd2lkZSB0eXBlcyB0byBuYXJyb3cgdHlwZXMgYXJlIGNoZWNrZWQgZm9yCisgICAgICAgICAgICBsb3NzIG9mIGluZm9ybWF0aW9uLgorICAgICAgXGl0ZW0gQSBudW1iZXIgb2YgYXNzZXJ0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnkgYW5kIHNldAorICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zLiAgSW4gYWRkaXRpb24sIHRoZSBzZXQgb2JqZWN0IGFjcXVpcmVzIGEKKyAgICAgICAgICAgIFxtZXRob2R7dGVzdF9jX2FwaX0gbWV0aG9kLgorICAgICAgXGl0ZW0gU2FuaXR5IGNoZWNrcyBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIGFyZSBhZGRlZCB0byBmcmFtZQorICAgICAgICAgICAgY3JlYXRpb24uIAorICAgICAgXGl0ZW0gVGhlIHN0b3JhZ2UgZm9yIGxvbmcgaW50cyBpcyBpbml0aWFsaXplZCB3aXRoIGEga25vd24KKyAgICAgICAgICAgIGludmFsaWQgcGF0dGVybiB0byBjYXRjaCByZWZlcmVuY2UgdG8gdW5pbml0aWFsaXplZAorICAgICAgICAgICAgZGlnaXRzLiAKKyAgICAgIFxpdGVtIExvdy1sZXZlbCB0cmFjaW5nIGFuZCBleHRyYSBleGNlcHRpb24gY2hlY2tpbmcgYXJlIGFkZGVkCisgICAgICAgICAgICB0byB0aGUgcnVudGltZSB2aXJ0dWFsIG1hY2hpbmUuCisgICAgICBcaXRlbSBFeHRyYSBjaGVja3MgYXJlIGFkZGVkIHRvIHRoZSBtZW1vcnkgYXJlbmEgaW1wbGVtZW50YXRpb24uCisgICAgICBcaXRlbSBFeHRyYSBkZWJ1Z2dpbmcgaXMgYWRkZWQgdG8gdGhlIHRocmVhZCBtb2R1bGUuCitcZW5ke2l0ZW1pemV9CisKK1RoZXJlIG1heSBiZSBhZGRpdGlvbmFsIGNoZWNrcyBub3QgbWVudGlvbmVkIGhlcmUuCisKK0RlZmluaW5nIFxjc2ltcGxlbWFjcm97UHlfVFJBQ0VfUkVGU30gZW5hYmxlcyByZWZlcmVuY2UgdHJhY2luZy4gIFdoZW4KK2RlZmluZWQsIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGFjdGl2ZSBvYmplY3RzIGlzIG1haW50YWluZWQKK2J5IGFkZGluZyB0d28gZXh0cmEgZmllbGRzIHRvIGV2ZXJ5IFxjdHlwZXtQeU9iamVjdH0uICBUb3RhbAorYWxsb2NhdGlvbnMgYXJlIHRyYWNrZWQgYXMgd2VsbC4gIFVwb24gZXhpdCwgYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMKK2FyZSBwcmludGVkLiAgKEluIGludGVyYWN0aXZlIG1vZGUgdGhpcyBoYXBwZW5zIGFmdGVyIGV2ZXJ5IHN0YXRlbWVudAorcnVuIGJ5IHRoZSBpbnRlcnByZXRlci4pICBJbXBsaWVkIGJ5IFxjc2ltcGxlbWFjcm97UHlfREVCVUd9LgorCitQbGVhc2UgcmVmZXIgdG8gXGZpbGV7TWlzYy9TcGVjaWFsQnVpbGRzLnR4dH0gaW4gdGhlIFB5dGhvbiBzb3VyY2UKK2Rpc3RyaWJ1dGlvbiBmb3IgbW9yZSBkZXRhaWxlZCBpbmZvcm1hdGlvbi4KZGlmZiAtLWdpdCBhL0RvYy9hcGkvcmVmY291bnRzLmRhdCBiL0RvYy9hcGkvcmVmY291bnRzLmRhdAppbmRleCBhYjZkODY1Li5iOGFhYWQ1IDEwMDY0NAotLS0gYS9Eb2MvYXBpL3JlZmNvdW50cy5kYXQKKysrIGIvRG9jL2FwaS9yZWZjb3VudHMuZGF0CkBAIC0zMDMsNiArMzAzLDExIEBACiBQeUVycl9XYXJuOlB5T2JqZWN0KjpjYXRlZ29yeTowOgogUHlFcnJfV2FybjpjaGFyKjptZXNzYWdlOjoKIAorUHlFcnJfV2FybkV4OmludDo6OgorUHlFcnJfV2FybkV4OlB5T2JqZWN0KjpjYXRlZ29yeTowOgorUHlFcnJfV2FybkV4OmNvbnN0IGNoYXIqOm1lc3NhZ2U6OgorUHlFcnJfV2FybkV4OlB5X3NzaXplX3Q6c3RhY2tfbGV2ZWw6OgorCiBQeUV2YWxfQWNxdWlyZUxvY2s6dm9pZDo6OgogCiBQeUV2YWxfQWNxdWlyZVRocmVhZDp2b2lkOjo6CmRpZmYgLS1naXQgYS9Eb2MvY29tbW9udGV4L2JvaWxlcnBsYXRlLnRleCBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CmluZGV4IGI0YzlmNDguLjk3NDk0MzIgMTAwNjQ0Ci0tLSBhL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CisrKyBiL0RvYy9jb21tb250ZXgvYm9pbGVycGxhdGUudGV4CkBAIC01LDUgKzUsNSBAQAogCUVtYWlsOiBcZW1haWx7ZG9jc0BweXRob24ub3JnfQogfQogCi1cZGF0ZXtcdG9kYXl9CQkJJSBYWFggdXBkYXRlIGJlZm9yZSBmaW5hbCByZWxlYXNlIQorXGRhdGV7M3JkIEF1Z3VzdCwgMjAwNn0JCQklIFhYWCB1cGRhdGUgYmVmb3JlIGZpbmFsIHJlbGVhc2UhCiBcaW5wdXR7cGF0Y2hsZXZlbH0JCSUgaW5jbHVkZSBQeXRob24gdmVyc2lvbiBpbmZvcm1hdGlvbgpkaWZmIC0tZ2l0IGEvRG9jL2Rpc3QvZGlzdC50ZXggYi9Eb2MvZGlzdC9kaXN0LnRleAppbmRleCBlOTVjMGQzLi5jMWI3MmFkIDEwMDY0NAotLS0gYS9Eb2MvZGlzdC9kaXN0LnRleAorKysgYi9Eb2MvZGlzdC9kaXN0LnRleApAQCAtNTMwLDcgKzUzMCw3IEBACiB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgaGVhZGVyIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gYQogY29uc2lzdGVudCB3YXkgYnkgdGhlIERpc3R1dGlscyBcY29tbWFuZHtpbnN0YWxsXF9oZWFkZXJ9IGNvbW1hbmQuICBGb3IKIGV4YW1wbGUsIHRoZSBOdW1lcmljYWwgUHl0aG9uIGhlYWRlciBmaWxlcyBhcmUgaW5zdGFsbGVkIChvbiBhIHN0YW5kYXJkCi1Vbml4IGluc3RhbGxhdGlvbikgdG8gXGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNS9OdW1lcmljYWx9LgorXFVOSVh7fSBpbnN0YWxsYXRpb24pIHRvIFxmaWxley91c3IvbG9jYWwvaW5jbHVkZS9weXRob24xLjUvTnVtZXJpY2FsfS4KIChUaGUgZXhhY3QgbG9jYXRpb24gd2lsbCBkaWZmZXIgYWNjb3JkaW5nIHRvIHlvdXIgcGxhdGZvcm0gYW5kIFB5dGhvbgogaW5zdGFsbGF0aW9uLikgIFNpbmNlIHRoZSBQeXRob24gaW5jbHVkZQogZGlyZWN0b3J5LS0tXGZpbGV7L3Vzci9sb2NhbC9pbmNsdWRlL3B5dGhvbjEuNX0gaW4gdGhpcyBjYXNlLS0taXMgYWx3YXlzCkBAIC0yMzE3LDcgKzIzMTcsNyBAQAogXGxpbmVpaWl7bmFtZX17dGhlIGZ1bGwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uLCBpbmNsdWRpbmcgYW55IHBhY2thZ2VzCiAtLS0gaWUuIFxlbXBoe25vdH0gYSBmaWxlbmFtZSBvciBwYXRobmFtZSwgYnV0IFB5dGhvbiBkb3R0ZWQgbmFtZX17c3RyaW5nfQogXGxpbmVpaWl7c291cmNlc317bGlzdCBvZiBzb3VyY2UgZmlsZW5hbWVzLCByZWxhdGl2ZSB0byB0aGUgZGlzdHJpYnV0aW9uCi1yb290ICh3aGVyZSB0aGUgc2V0dXAgc2NyaXB0IGxpdmVzKSwgaW4gVW5peCBmb3JtIChzbGFzaC1zZXBhcmF0ZWQpIGZvcgorcm9vdCAod2hlcmUgdGhlIHNldHVwIHNjcmlwdCBsaXZlcyksIGluIFxVTklYe30gZm9ybSAoc2xhc2gtc2VwYXJhdGVkKSBmb3IKIHBvcnRhYmlsaXR5LiBTb3VyY2UgZmlsZXMgbWF5IGJlIEMsIFxDcHAsIFNXSUcgKC5pKSwgcGxhdGZvcm0tc3BlY2lmaWMKIHJlc291cmNlIGZpbGVzLCBvciB3aGF0ZXZlciBlbHNlIGlzIHJlY29nbml6ZWQgYnkgdGhlIFxjb21tYW5ke2J1aWxkX2V4dH0KIGNvbW1hbmQgYXMgc291cmNlIGZvciBhIFB5dGhvbiBleHRlbnNpb24ufXtzdHJpbmd9CkBAIC0yODczLDkgKzI4NzMsMjAgQEAKIFxtb2R1bGVzeW5vcHNpc3tNaWNyb3NvZnQgQ29tcGlsZXJ9CiAKIFRoaXMgbW9kdWxlIHByb3ZpZGVzIFxjbGFzc3tNU1ZDQ29tcGlsZXJ9LCBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJzdHJhY3QgCi1cY2xhc3N7Q0NvbXBpbGVyfSBjbGFzcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uIEl0IHNob3VsZCBhbHNvIHdvcmsgdXNpbmcKLXRoZSBmcmVlbHkgYXZhaWxhYmxlIGNvbXBpbGVyIHByb3ZpZGVkIGFzIHBhcnQgb2YgdGhlIC5OZXQgU0RLIGRvd25sb2FkLiBYWFgKLWRvd25sb2FkIGxpbmsuCitcY2xhc3N7Q0NvbXBpbGVyfSBjbGFzcyBmb3IgTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8uIFR5cGljYWxseSwgZXh0ZW5zaW9uCittb2R1bGVzIG5lZWQgdG8gYmUgY29tcGlsZWQgd2l0aCB0aGUgc2FtZSBjb21waWxlciB0aGF0IHdhcyB1c2VkIHRvIGNvbXBpbGUKK1B5dGhvbi4gRm9yIFB5dGhvbiAyLjMgYW5kIGVhcmxpZXIsIHRoZSBjb21waWxlciB3YXMgVmlzdWFsIFN0dWRpbyA2LiBGb3IKK1B5dGhvbiAyLjQgYW5kIDIuNSwgdGhlIGNvbXBpbGVyIGlzIFZpc3VhbCBTdHVkaW8gLk5FVCAyMDAzLiBUaGUgQU1ENjQKK2FuZCBJdGFuaXVtIGJpbmFyaWVzIGFyZSBjcmVhdGVkIHVzaW5nIHRoZSBQbGF0Zm9ybSBTREsuCisKK1xjbGFzc3tNU1ZDQ29tcGlsZXJ9IHdpbGwgbm9ybWFsbHkgY2hvb3NlIHRoZSByaWdodCBjb21waWxlciwgbGlua2VyIGV0Yy4KK29uIGl0cyBvd24uIFRvIG92ZXJyaWRlIHRoaXMgY2hvaWNlLCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCitcdmFye0RJU1RVVElMU1xfVVNFXF9TREt9IGFuZCBcdmFye01TU2RrfSBtdXN0IGJlIGJvdGggc2V0LiBcdmFye01TU2RrfQoraW5kaWNhdGVzIHRoYXQgdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQgaGFzIGJlZW4gc2V0dXAgYnkgdGhlIFNESydzCitcY29kZXtTZXRFbnYuQ21kfSBzY3JpcHQsIG9yIHRoYXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBoYWQgYmVlbgorcmVnaXN0ZXJlZCB3aGVuIHRoZSBTREsgd2FzIGluc3RhbGxlZDsgXHZhcntESVNUVVRJTFNcX1VTRVxfU0RLfSBpbmRpY2F0ZXMKK3RoYXQgdGhlIGRpc3R1dGlscyB1c2VyIGhhcyBtYWRlIGFuIGV4cGxpY2l0IGNob2ljZSB0byBvdmVycmlkZSB0aGUKK2NvbXBpbGVyIHNlbGVjdGlvbiBieSBcY2xhc3N7TVNWQ0NvbXBpbGVyfS4KIAogXHNlY3Rpb257XG1vZHVsZXtkaXN0dXRpbHMuYmNwcGNvbXBpbGVyfSAtLS0gQm9ybGFuZCBDb21waWxlcn0KIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtkaXN0dXRpbHMuYmNwcGNvbXBpbGVyfQpAQCAtMzA4OCw3ICszMDk5LDcgQEAKIE1vdmUgZmlsZSBcdmFye3NyY30gdG8gXHZhcntkc3R9LiBJZiBcdmFye2RzdH0gaXMgYSBkaXJlY3RvcnksIHRoZSBmaWxlIHdpbGwKIGJlIG1vdmVkIGludG8gaXQgd2l0aCB0aGUgc2FtZSBuYW1lOyBvdGhlcndpc2UsIFx2YXJ7c3JjfSBpcyBqdXN0IHJlbmFtZWQKIHRvIFx2YXJ7ZHN0fS4gIFJldHVybnMgdGhlIG5ldyBmdWxsIG5hbWUgb2YgdGhlIGZpbGUuCi1cd2FybmluZ3tIYW5kbGVzIGNyb3NzLWRldmljZSBtb3ZlcyBvbiBVbml4IHVzaW5nIFxmdW5jdGlvbntjb3B5X2ZpbGUoKX0uICAKK1x3YXJuaW5ne0hhbmRsZXMgY3Jvc3MtZGV2aWNlIG1vdmVzIG9uIFxVTklYe30gdXNpbmcgXGZ1bmN0aW9ue2NvcHlfZmlsZSgpfS4gIAogV2hhdCBhYm91dCBvdGhlciBzeXN0ZW1zPz8/fQogXGVuZHtmdW5jZGVzY30KIApAQCAtMzEzMSw3ICszMTQyLDcgQEAKIFJldHVybiAncGF0aG5hbWUnIGFzIGEgbmFtZSB0aGF0IHdpbGwgd29yayBvbiB0aGUgbmF0aXZlIGZpbGVzeXN0ZW0sCiBpLmUuIHNwbGl0IGl0IG9uICcvJyBhbmQgcHV0IGl0IGJhY2sgdG9nZXRoZXIgYWdhaW4gdXNpbmcgdGhlIGN1cnJlbnQKIGRpcmVjdG9yeSBzZXBhcmF0b3IuICBOZWVkZWQgYmVjYXVzZSBmaWxlbmFtZXMgaW4gdGhlIHNldHVwIHNjcmlwdCBhcmUKLWFsd2F5cyBzdXBwbGllZCBpbiBVbml4IHN0eWxlLCBhbmQgaGF2ZSB0byBiZSBjb252ZXJ0ZWQgdG8gdGhlIGxvY2FsCithbHdheXMgc3VwcGxpZWQgaW4gXFVOSVh7fSBzdHlsZSwgYW5kIGhhdmUgdG8gYmUgY29udmVydGVkIHRvIHRoZSBsb2NhbAogY29udmVudGlvbiBiZWZvcmUgd2UgY2FuIGFjdHVhbGx5IHVzZSB0aGVtIGluIHRoZSBmaWxlc3lzdGVtLiAgUmFpc2VzCiBcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IG9uIG5vbi1cVU5JWC1pc2ggc3lzdGVtcyBpZiBcdmFye3BhdGhuYW1lfSBlaXRoZXIgCiBzdGFydHMgb3IgZW5kcyB3aXRoIGEgc2xhc2guCkBAIC0zMTgwLDcgKzMxOTEsNyBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtzcGxpdF9xdW90ZWR9e3N9Ci1TcGxpdCBhIHN0cmluZyB1cCBhY2NvcmRpbmcgdG8gVW5peCBzaGVsbC1saWtlIHJ1bGVzIGZvciBxdW90ZXMgYW5kCitTcGxpdCBhIHN0cmluZyB1cCBhY2NvcmRpbmcgdG8gXFVOSVh7fSBzaGVsbC1saWtlIHJ1bGVzIGZvciBxdW90ZXMgYW5kCiBiYWNrc2xhc2hlcy4gIEluIHNob3J0OiB3b3JkcyBhcmUgZGVsaW1pdGVkIGJ5IHNwYWNlcywgYXMgbG9uZyBhcyB0aG9zZQogc3BhY2VzIGFyZSBub3QgZXNjYXBlZCBieSBhIGJhY2tzbGFzaCwgb3IgaW5zaWRlIGEgcXVvdGVkIHN0cmluZy4KIFNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcyBhcmUgZXF1aXZhbGVudCwgYW5kIHRoZSBxdW90ZSBjaGFyYWN0ZXJzIGNhbgpkaWZmIC0tZ2l0IGEvRG9jL2RvYy9kb2MudGV4IGIvRG9jL2RvYy9kb2MudGV4CmluZGV4IGU0YjkxYWMuLjFkMGYyNzkgMTAwNjQ0Ci0tLSBhL0RvYy9kb2MvZG9jLnRleAorKysgYi9Eb2MvZG9jL2RvYy50ZXgKQEAgLTE4Nyw2ICsxODcsMjAgQEAKICAgVG9waWNzIHdoaWNoIGFyZSBub3QgY292ZXJlZCBpbiB0aGUgQXBwbGUncyBzdHlsZSBndWlkZSB3aWxsIGJlCiAgIGRpc2N1c3NlZCBpbiB0aGlzIGRvY3VtZW50IGlmIG5lY2Vzc2FyeS4KIAorICBGb290bm90ZXMgYXJlIGdlbmVyYWxseSBkaXNjb3VyYWdlZCBkdWUgdG8gdGhlIHBhaW4gb2YgdXNpbmcKKyAgZm9vdG5vdGVzIGluIHRoZSBIVE1MIGNvbnZlcnNpb24gb2YgZG9jdW1lbnRzLiAgRm9vdG5vdGVzIG1heSBiZQorICB1c2VkIHdoZW4gdGhleSBhcmUgdGhlIGJlc3Qgd2F5IHRvIHByZXNlbnQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIFdoZW4gYSBmb290bm90ZSByZWZlcmVuY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUgc2VudGVuY2UsIGl0CisgIHNob3VsZCBmb2xsb3cgdGhlIHNlbnRlbmNlLWVuZGluZyBwdW5jdHVhdGlvbi4gIFRoZSBcTGFUZVh7fSBtYXJrdXAKKyAgc2hvdWxkIGFwcGVhciBzb21ldGhpbmcgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19CitUaGlzIHNlbnRlbmNlIGhhcyBhIGZvb3Rub3RlIHJlZmVyZW5jZS4lCisgIFxmb290bm90ZXtUaGlzIGlzIHRoZSBmb290bm90ZSB0ZXh0Ln0KK1xlbmR7dmVyYmF0aW19CisKKyAgRm9vdG5vdGVzIG1heSBhcHBlYXIgaW4gdGhlIG1pZGRsZSBvZiBzZW50ZW5jZXMgd2hlcmUgYXBwcm9wcmlhdGUuCisKICAgTWFueSBzcGVjaWFsIG5hbWVzIGFyZSB1c2VkIGluIHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCiAgIHRoZSBuYW1lcyBvZiBvcGVyYXRpbmcgc3lzdGVtcywgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLCBzdGFuZGFyZHMKICAgYm9kaWVzLCBhbmQgdGhlIGxpa2UuICBNYW55IG9mIHRoZXNlIHdlcmUgYXNzaWduZWQgXExhVGVYe30gbWFjcm9zCkBAIC0yODEsMTAgKzI5NSwxMCBAQAogICAgIHRvIGtub3cgYWJvdXQgXExhVGVYe30gc3ludGF4LgogCiAgICAgQSBcZGZue2NvbW1lbnR9IGlzIHN0YXJ0ZWQgYnkgdGhlIGBgcGVyY2VudCcnIGNoYXJhY3RlcgotICAgIChcY2hhcmFjdGVye1wlfSkgYW5kIGNvbnRpbnVlcyB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIGxpbmUgYW5kIGFsbAotICAgIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiB0aGUgZm9sbG93aW5nIGxpbmUuICBUaGlzIGlzIGEgbGl0dGxlCi0gICAgZGlmZmVyZW50IGZyb20gYW55IHByb2dyYW1taW5nIGxhbmd1YWdlIEkga25vdyBvZiwgc28gYW4gZXhhbXBsZQotICAgIGlzIGluIG9yZGVyOgorICAgIChcY2hhcmFjdGVye1wlfSkgYW5kIGNvbnRpbnVlcyB0aHJvdWdoIHRoZSBlbmQgb2YgdGhlIGxpbmUKKyAgICBcZW1waHthbmQgYWxsIGxlYWRpbmcgd2hpdGVzcGFjZSBvbiB0aGUgZm9sbG93aW5nIGxpbmV9LiAgVGhpcyBpcworICAgIGEgbGl0dGxlIGRpZmZlcmVudCBmcm9tIGFueSBwcm9ncmFtbWluZyBsYW5ndWFnZSBJIGtub3cgb2YsIHNvIGFuCisgICAgZXhhbXBsZSBpcyBpbiBvcmRlcjoKIAogXGJlZ2lue3ZlcmJhdGltfQogVGhpcyBpcyB0ZXh0LiUgY29tbWVudApkaWZmIC0tZ2l0IGEvRG9jL2V4dC9uZXd0eXBlcy50ZXggYi9Eb2MvZXh0L25ld3R5cGVzLnRleAppbmRleCBjZDJjMDQ1Li5hNDg1YTE1IDEwMDY0NAotLS0gYS9Eb2MvZXh0L25ld3R5cGVzLnRleAorKysgYi9Eb2MvZXh0L25ld3R5cGVzLnRleApAQCAtMTYsOCArMTYsOSBAQAogVGhlIHdheSBuZXcgdHlwZXMgYXJlIGRlZmluZWQgY2hhbmdlZCBkcmFtYXRpY2FsbHkgKGFuZCBmb3IgdGhlCiBiZXR0ZXIpIGluIFB5dGhvbiAyLjIuICBUaGlzIGRvY3VtZW50IGRvY3VtZW50cyBob3cgdG8gZGVmaW5lIG5ldwogdHlwZXMgZm9yIFB5dGhvbiAyLjIgYW5kIGxhdGVyLiAgSWYgeW91IG5lZWQgdG8gc3VwcG9ydCBvbGRlcgotdmVyc2lvbnMgb2YgUHl0aG9uLCB5b3Ugd2lsbCBuZWVkIHRvIHJlZmVyIHRvIG9sZGVyIHZlcnNpb25zIG9mIHRoaXMKLWRvY3VtZW50YXRpb24uCit2ZXJzaW9ucyBvZiBQeXRob24sIHlvdSB3aWxsIG5lZWQgdG8gcmVmZXIgdG8KK1x1bGlua3tvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIGRvY3VtZW50YXRpb259CisgICAgICB7aHR0cDovL3d3dy5weXRob24ub3JnL2RvYy92ZXJzaW9ucy99LgogXGVuZHtub3RpY2V9CiAKIFxzZWN0aW9ue1RoZSBCYXNpY3MKQEAgLTQ3OSw3ICs0ODAsNyBAQAogICAxCiBcaXRlbSB3aGVuIHdlIGtub3cgdGhhdCBkZWFsbG9jYXRpb24gb2YgdGhlIG9iamVjdFxmb290bm90ZXtUaGlzIGlzCiAgIHRydWUgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIG9iamVjdCBpcyBhIGJhc2ljIHR5cGUsIGxpa2UgYSBzdHJpbmcgb3IKLSAgYSBmbG9hdH0gd2lsbCBub3QgY2F1c2UgYW55CisgIGEgZmxvYXQufSB3aWxsIG5vdCBjYXVzZSBhbnkKICAgY2FsbHMgYmFjayBpbnRvIG91ciB0eXBlJ3MgY29kZQogXGl0ZW0gd2hlbiBkZWNyZW1lbnRpbmcgYSByZWZlcmVuY2UgY291bnQgaW4gYSBcbWVtYmVye3RwX2RlYWxsb2N9CiAgIGhhbmRsZXIgd2hlbiBnYXJiYWdlLWNvbGxlY3Rpb25zIGlzIG5vdCBzdXBwb3J0ZWRcZm9vdG5vdGV7V2UgcmVsaWVkCkBAIC03OTEsOSArNzkyLDkgQEAKIAogSW4gdGhlIHNlY29uZCB2ZXJzaW9uIG9mIHRoZSBcY2xhc3N7Tm9kZHl9IGV4YW1wbGUsIHdlIGFsbG93ZWQgYW55CiBraW5kIG9mIG9iamVjdCB0byBiZSBzdG9yZWQgaW4gdGhlIFxtZW1iZXJ7Zmlyc3R9IG9yIFxtZW1iZXJ7bGFzdH0KLWF0dHJpYnV0ZXNcZm9vdG5vdGV7RXZlbiBpbiB0aGUgdGhpcmQgdmVyc2lvbiwgd2UgYXJlbid0IGd1YXJhbnRlZWQgdG8KK2F0dHJpYnV0ZXMuXGZvb3Rub3Rle0V2ZW4gaW4gdGhlIHRoaXJkIHZlcnNpb24sIHdlIGFyZW4ndCBndWFyYW50ZWVkIHRvCiBhdm9pZCBjeWNsZXMuICBJbnN0YW5jZXMgb2Ygc3RyaW5nIHN1YmNsYXNzZXMgYXJlIGFsbG93ZWQgYW5kIHN0cmluZwotc3ViY2xhc3NlcyBjb3VsZCBhbGxvdyBjeWNsZXMgZXZlbiBpZiBub3JtYWwgc3RyaW5ncyBkb24ndC59LiBUaGlzCitzdWJjbGFzc2VzIGNvdWxkIGFsbG93IGN5Y2xlcyBldmVuIGlmIG5vcm1hbCBzdHJpbmdzIGRvbid0Ln0gVGhpcwogbWVhbnMgdGhhdCBcY2xhc3N7Tm9kZHl9IG9iamVjdHMgY2FuIHBhcnRpY2lwYXRlIGluIGN5Y2xlczoKIAogXGJlZ2lue3ZlcmJhdGltfQpAQCAtMTU2Myw2ICsxNTY0LDg1IEBACiBhdm9pZGluZyB0aGUgZXhjZXB0aW9uIGNhbiB5aWVsZCBzbGlnaHRseSBiZXR0ZXIgcGVyZm9ybWFuY2UuICBJZiBhbgogYWN0dWFsIGVycm9yIG9jY3VycywgaXQgc2hvdWxkIHNldCBhbiBleGNlcHRpb24gYW5kIHJldHVybiBcTlVMTC4KIAorCitcc3Vic2VjdGlvbntXZWFrIFJlZmVyZW5jZSBTdXBwb3J0XGxhYmVse3dlYWtyZWYtc3VwcG9ydH19CisKK09uZSBvZiB0aGUgZ29hbHMgb2YgUHl0aG9uJ3Mgd2Vhay1yZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gaXMgdG8gYWxsb3cKK2FueSB0eXBlIHRvIHBhcnRpY2lwYXRlIGluIHRoZSB3ZWFrIHJlZmVyZW5jZSBtZWNoYW5pc20gd2l0aG91dAoraW5jdXJyaW5nIHRoZSBvdmVyaGVhZCBvbiB0aG9zZSBvYmplY3RzIHdoaWNoIGRvIG5vdCBiZW5lZml0IGJ5IHdlYWsKK3JlZmVyZW5jaW5nIChzdWNoIGFzIG51bWJlcnMpLgorCitGb3IgYW4gb2JqZWN0IHRvIGJlIHdlYWtseSByZWZlcmVuY2FibGUsIHRoZSBleHRlbnNpb24gbXVzdCBpbmNsdWRlIGEKK1xjdHlwZXtQeU9iamVjdCp9IGZpZWxkIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgZm9yIHRoZSB1c2Ugb2YgdGhlCit3ZWFrIHJlZmVyZW5jZSBtZWNoYW5pc207IGl0IG11c3QgYmUgaW5pdGlhbGl6ZWQgdG8gXE5VTEx7fSBieSB0aGUKK29iamVjdCdzIGNvbnN0cnVjdG9yLiAgSXQgbXVzdCBhbHNvIHNldCB0aGUgXG1lbWJlcnt0cF93ZWFrbGlzdG9mZnNldH0KK2ZpZWxkIG9mIHRoZSBjb3JyZXNwb25kaW5nIHR5cGUgb2JqZWN0IHRvIHRoZSBvZmZzZXQgb2YgdGhlIGZpZWxkLgorRm9yIGV4YW1wbGUsIHRoZSBpbnN0YW5jZSB0eXBlIGlzIGRlZmluZWQgd2l0aCB0aGUgZm9sbG93aW5nCitzdHJ1Y3R1cmU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECisgICAgUHlDbGFzc09iamVjdCAqaW5fY2xhc3M7ICAgICAgIC8qIFRoZSBjbGFzcyBvYmplY3QgKi8KKyAgICBQeU9iamVjdCAgICAgICppbl9kaWN0OyAgICAgICAgLyogQSBkaWN0aW9uYXJ5ICovCisgICAgUHlPYmplY3QgICAgICAqaW5fd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCit9IFB5SW5zdGFuY2VPYmplY3Q7CitcZW5ke3ZlcmJhdGltfQorCitUaGUgc3RhdGljYWxseS1kZWNsYXJlZCB0eXBlIG9iamVjdCBmb3IgaW5zdGFuY2VzIGlzIGRlZmluZWQgdGhpcyB3YXk6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK1B5VHlwZU9iamVjdCBQeUluc3RhbmNlX1R5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKKyAgICAwLAorICAgICJtb2R1bGUuaW5zdGFuY2UiLAorCisgICAgLyogTG90cyBvZiBzdHVmZiBvbWl0dGVkIGZvciBicmV2aXR5Li4uICovCisKKyAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2ZsYWdzICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICBvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCit9OworXGVuZHt2ZXJiYXRpbX0KKworVGhlIHR5cGUgY29uc3RydWN0b3IgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgd2VhayByZWZlcmVuY2UKK2xpc3QgdG8gXE5VTEw6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK3N0YXRpYyBQeU9iamVjdCAqCitpbnN0YW5jZV9uZXcoKSB7CisgICAgLyogT3RoZXIgaW5pdGlhbGl6YXRpb24gc3R1ZmYgb21pdHRlZCBmb3IgYnJldml0eSAqLworCisgICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOworCisgICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOworfQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIG9ubHkgZnVydGhlciBhZGRpdGlvbiBpcyB0aGF0IHRoZSBkZXN0cnVjdG9yIG5lZWRzIHRvIGNhbGwgdGhlCit3ZWFrIHJlZmVyZW5jZSBtYW5hZ2VyIHRvIGNsZWFyIGFueSB3ZWFrIHJlZmVyZW5jZXMuICBUaGlzIHNob3VsZCBiZQorZG9uZSBiZWZvcmUgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBkZXN0cnVjdGlvbiBoYXZlIG9jY3VycmVkLCBidXQgaXMKK29ubHkgcmVxdWlyZWQgaWYgdGhlIHdlYWsgcmVmZXJlbmNlIGxpc3QgaXMgbm9uLVxOVUxMOgorCitcYmVnaW57dmVyYmF0aW19CitzdGF0aWMgdm9pZAoraW5zdGFuY2VfZGVhbGxvYyhQeUluc3RhbmNlT2JqZWN0ICppbnN0KQoreworICAgIC8qIEFsbG9jYXRlIHRlbXBvcmFyaWVzIGlmIG5lZWRlZCwgYnV0IGRvIG5vdCBiZWdpbgorICAgICAgIGRlc3RydWN0aW9uIGp1c3QgeWV0LgorICAgICAqLworCisgICAgaWYgKGluc3QtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCisgICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGluc3QpOworCisgICAgLyogUHJvY2VlZCB3aXRoIG9iamVjdCBkZXN0cnVjdGlvbiBub3JtYWxseS4gKi8KK30KK1xlbmR7dmVyYmF0aW19CisKKwogXHN1YnNlY3Rpb257TW9yZSBTdWdnZXN0aW9uc30KIAogUmVtZW1iZXIgdGhhdCB5b3UgY2FuIG9taXQgbW9zdCBvZiB0aGVzZSBmdW5jdGlvbnMsIGluIHdoaWNoIGNhc2UgeW91CmRpZmYgLS1naXQgYS9Eb2MvZXh0L3dpbmRvd3MudGV4IGIvRG9jL2V4dC93aW5kb3dzLnRleAppbmRleCBjYTE4YTFlLi5mOWRlNTQ4IDEwMDY0NAotLS0gYS9Eb2MvZXh0L3dpbmRvd3MudGV4CisrKyBiL0RvYy9leHQvd2luZG93cy50ZXgKQEAgLTI4LDEzICsyOCwxNSBAQAogXHNlY3Rpb257QSBDb29rYm9vayBBcHByb2FjaCBcbGFiZWx7d2luLWNvb2tib29rfX0KIAogVGhlcmUgYXJlIHR3byBhcHByb2FjaGVzIHRvIGJ1aWxkaW5nIGV4dGVuc2lvbiBtb2R1bGVzIG9uIFdpbmRvd3MsCi1qdXN0IGFzIHRoZXJlIGFyZSBvbiBcVU5JWDogdXNlIHRoZSBccmVmbW9kdWxle2Rpc3R1dGlsc30gcGFja2FnZSB0bworanVzdCBhcyB0aGVyZSBhcmUgb24gXFVOSVg6IHVzZSB0aGUKK1x1bGlua3tcbW9kdWxle2Rpc3R1dGlsc319ey4uL2xpYi9tb2R1bGUtZGlzdHV0aWxzLmh0bWx9IHBhY2thZ2UgdG8KIGNvbnRyb2wgdGhlIGJ1aWxkIHByb2Nlc3MsIG9yIGRvIHRoaW5ncyBtYW51YWxseS4gIFRoZSBkaXN0dXRpbHMKIGFwcHJvYWNoIHdvcmtzIHdlbGwgZm9yIG1vc3QgZXh0ZW5zaW9uczsgZG9jdW1lbnRhdGlvbiBvbiB1c2luZwotXHJlZm1vZHVsZXtkaXN0dXRpbHN9IHRvIGJ1aWxkIGFuZCBwYWNrYWdlIGV4dGVuc2lvbiBtb2R1bGVzIGlzCi1hdmFpbGFibGUgaW4gXGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbgotTW9kdWxlc30uICBUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYW51YWwgYXBwcm9hY2ggdG8gYnVpbGRpbmcKLVB5dGhvbiBleHRlbnNpb25zIHdyaXR0ZW4gaW4gQyBvciBcQ3BwLgorXHVsaW5re1xtb2R1bGV7ZGlzdHV0aWxzfX17Li4vbGliL21vZHVsZS1kaXN0dXRpbHMuaHRtbH0gdG8gYnVpbGQgYW5kCitwYWNrYWdlIGV4dGVuc2lvbiBtb2R1bGVzIGlzIGF2YWlsYWJsZSBpbgorXGNpdGV0aXRsZVsuLi9kaXN0L2Rpc3QuaHRtbF17RGlzdHJpYnV0aW5nIFB5dGhvbiBNb2R1bGVzfS4gIFRoaXMKK3NlY3Rpb24gZGVzY3JpYmVzIHRoZSBtYW51YWwgYXBwcm9hY2ggdG8gYnVpbGRpbmcgUHl0aG9uIGV4dGVuc2lvbnMKK3dyaXR0ZW4gaW4gQyBvciBcQ3BwLgogCiBUbyBidWlsZCBleHRlbnNpb25zIHVzaW5nIHRoZXNlIGluc3RydWN0aW9ucywgeW91IG5lZWQgdG8gaGF2ZSBhIGNvcHkKIG9mIHRoZSBQeXRob24gc291cmNlcyBvZiB0aGUgc2FtZSB2ZXJzaW9uIGFzIHlvdXIgaW5zdGFsbGVkIFB5dGhvbi4KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9NYWtlZmlsZSBiL0RvYy9ob3d0by9NYWtlZmlsZQppbmRleCAxOTcwMWM2Li4xODExMGEyIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vTWFrZWZpbGUKKysrIGIvRG9jL2hvd3RvL01ha2VmaWxlCkBAIC0xLDg4ICsxLDg0IEBACisjIE1ha2VmaWxlIGZvciB0aGUgSE9XVE8gZGlyZWN0b3J5CisjIExhVGVYIEhPV1RPcyBjYW4gYmUgdHVybmVkIGludG8gSFRNTCwgUERGLCBQUywgRFZJIG9yIHBsYWluIHRleHQgb3V0cHV0LgorIyByZVNUIEhPV1RPcyBjYW4gb25seSBiZSB0dXJuZWQgaW50byBIVE1MLgorCisjIFZhcmlhYmxlcyB0byBjaGFuZ2UKKworIyBQYXBlciBzaXplIGZvciBub24tSFRNTCBmb3JtYXRzIChsZXR0ZXIgb3IgYTQpCitQQVBFUj1sZXR0ZXIKKworIyBBcmd1bWVudHMgdG8gcnN0Mmh0bWwucHksIGFuZCBsb2NhdGlvbiBvZiB0aGUgc2NyaXB0CitSU1RBUkdTID0gLS1pbnB1dC1lbmNvZGluZz11dGYtOAorUlNUMkhUTUwgPSByc3QyaHRtbC5weQorCisjIExpc3Qgb2YgSE9XVE9zIHRoYXQgYXJlbid0IHRvIGJlIHByb2Nlc3NlZC4gIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlCisjIGJhc2UgbmFtZSBvZiB0aGUgSE9XVE8gd2l0aG91dCBhbnkgZXh0ZW5zaW9uIChlLmcuICdhZHZvY2FjeScsCisjICd1bmljb2RlJykuCitSRU1PVkVfSE9XVE9TID0KIAogTUtIT1dUTz0uLi90b29scy9ta2hvd3RvCiBXRUJESVI9LgotUlNUQVJHUyA9IC0taW5wdXQtZW5jb2Rpbmc9dXRmLTgKLVZQQVRIPS46ZHZpOnBkZjpwczp0eHQKLQotIyBMaXN0IG9mIEhPV1RPcyB0aGF0IGFyZW4ndCB0byBiZSBwcm9jZXNzZWQKLQotUkVNT1ZFX0hPV1RPID0KK1BBUEVSRElSPS4uL3BhcGVyLSQoUEFQRVIpCitIVE1MRElSPS4uL2h0bWwKIAogIyBEZXRlcm1pbmUgbGlzdCBvZiBmaWxlcyB0byBiZSBidWlsdAorVEVYX1NPVVJDRVMgPSAkKHdpbGRjYXJkICoudGV4KQorUlNUX1NPVVJDRVMgPSAkKHdpbGRjYXJkICoucnN0KQorVEVYX05BTUVTID0gJChmaWx0ZXItb3V0ICQoUkVNT1ZFX0hPV1RPUyksJChwYXRzdWJzdCAlLnRleCwlLCQoVEVYX1NPVVJDRVMpKSkKIAotSE9XVE89JChmaWx0ZXItb3V0ICQoUkVNT1ZFX0hPV1RPKSwkKHdpbGRjYXJkICoudGV4KSkKLVJTVF9TT1VSQ0VTID0JJChzaGVsbCBlY2hvICoucnN0KQotRFZJICA9JChwYXRzdWJzdCAlLnRleCwlLmR2aSwkKEhPV1RPKSkKLVBERiAgPSQocGF0c3Vic3QgJS50ZXgsJS5wZGYsJChIT1dUTykpCi1QUyAgID0kKHBhdHN1YnN0ICUudGV4LCUucHMsJChIT1dUTykpCi1UWFQgID0kKHBhdHN1YnN0ICUudGV4LCUudHh0LCQoSE9XVE8pKQotSFRNTCA9JChwYXRzdWJzdCAlLnRleCwlLCQoSE9XVE8pKQorUEFQRVJfUEFUSFM9JChhZGRwcmVmaXggJChQQVBFUkRJUikvLCQoVEVYX05BTUVTKSkKK0RWSSAgPSQoYWRkc3VmZml4IC5kdmksJChQQVBFUl9QQVRIUykpCitQREYgID0kKGFkZHN1ZmZpeCAucGRmLCQoUEFQRVJfUEFUSFMpKQorUFMgICA9JChhZGRzdWZmaXggLnBzLCQoUEFQRVJfUEFUSFMpKQorCitBTExfSE9XVE9fTkFNRVMgPSAkKFRFWF9OQU1FUykgJChwYXRzdWJzdCAlLnJzdCwlLCQoUlNUX1NPVVJDRVMpKQorSE9XVE9fTkFNRVMgPSAkKGZpbHRlci1vdXQgJChSRU1PVkVfSE9XVE9TKSwkKEFMTF9IT1dUT19OQU1FUykpCitIVE1MID0gJChhZGRwcmVmaXggJChIVE1MRElSKS8sJChIT1dUT19OQU1FUykpCiAKICMgUnVsZXMgZm9yIGJ1aWxkaW5nIHZhcmlvdXMgZm9ybWF0cwotJS5kdmkgOiAlLnRleAorCisjIHJlU1QgdG8gSFRNTAorJChIVE1MRElSKS8lOiAlLnJzdAorCWlmIFsgISAtZCAkQCBdIDsgdGhlbiBta2RpciAkQCA7IGZpCisJJChSU1QySFRNTCkgJChSU1RBUkdTKSAkPCA+JEAvaW5kZXguaHRtbAorCisjIExhVGVYIHRvIHZhcmlvdXMgb3V0cHV0IGZvcm1hdHMKKyQoUEFQRVJESVIpLyUuZHZpIDogJS50ZXgKIAkkKE1LSE9XVE8pIC0tZHZpICQ8Ci0JbXYgJEAgZHZpCisJbXYgJCouZHZpICRACiAKLSUucGRmIDogJS50ZXgKKyQoUEFQRVJESVIpLyUucGRmIDogJS50ZXgKIAkkKE1LSE9XVE8pIC0tcGRmICQ8Ci0JbXYgJEAgcGRmCisJbXYgJCoucGRmICRACiAKLSUucHMgOiAlLnRleAorJChQQVBFUkRJUikvJS5wcyA6ICUudGV4CiAJJChNS0hPV1RPKSAtLXBzICQ8Ci0JbXYgJEAgcHMKKwltdiAkKi5wcyAkQAogCi0lLnR4dCA6ICUudGV4CiskKEhUTUxESVIpLyUgOiAlLnRleAorCSQoTUtIT1dUTykgLS1odG1sIC0taWNvbnNlcnZlcj0iLiIgLS1kaXIgJEAgJDwKKworIyBSdWxlIHRoYXQgaXNuJ3QgYWN0dWFsbHkgdXNlZCAtLSB3ZSBubyBsb25nZXIgc3VwcG9ydCB0aGUgJ3R4dCcgdGFyZ2V0LgorJChQQVBFUkRJUikvJS50eHQgOiAlLnRleAogCSQoTUtIT1dUTykgLS10ZXh0ICQ8CiAJbXYgJEAgdHh0CiAKLSUgOiAlLnRleAotCSQoTUtIT1dUTykgLS1odG1sIC0taWNvbnNlcnZlcj0iLiIgJDwKLQl0YXIgLXpjdmYgaHRtbC8kKi50Z3ogJCoKLQkjemlwIC1yIGh0bWwvJCouemlwICQqCi0KIGRlZmF1bHQ6CiAJQGVjaG8gIidhbGwnICAgIC0tIGJ1aWxkIGFsbCBmaWxlcyIKLQlAZWNobyAiJ2R2aScsICdwZGYnLCAncHMnLCAndHh0JywgJ2h0bWwnIC0tIGJ1aWxkIG9uZSBmb3JtYXQiCisJQGVjaG8gIidkdmknLCAncGRmJywgJ3BzJywgJ2h0bWwnIC0tIGJ1aWxkIG9uZSBmb3JtYXQiCiAKLWFsbDogJChIVE1MKQorYWxsOiBkdmkgcGRmIHBzIGh0bWwKIAotLlBIT05ZIDogZHZpIHBkZiBwcyB0eHQgaHRtbCByc3QKLWR2aTogJChEVkkpCi0KLXBkZjogJChQREYpCi1wczogICQoUFMpCi10eHQ6ICQoVFhUKQotaHRtbDokKEhUTUwpCi0KLSMgUnVsZSB0byBidWlsZCBjb2xsZWN0ZWQgdGFyIGZpbGVzCi1kaXN0OiAjYWxsCi0JZm9yIGkgaW4gZHZpIHBkZiBwcyB0eHQgOyBkbyBcCi0JICAgIGNkICQkaSA7IFwKLQkgICAgdGFyIC16Y2YgQWxsLnRneiAqLiQkaSA7XAotCSAgICBjZCAuLiA7XAotCWRvbmUKLQotIyBSdWxlIHRvIGNvcHkgZmlsZXMgdG8gdGhlIFdlYiB0cmVlIG9uIEFNSydzIG1hY2hpbmUKLXdlYjogZGlzdAotCWNwIGR2aS8qICQoV0VCRElSKS9kdmkKLQljcCBwcy8qICQoV0VCRElSKS9wcwotCWNwIHBkZi8qICQoV0VCRElSKS9wZGYKLQljcCB0eHQvKiAkKFdFQkRJUikvdHh0Ci0JZm9yIGRpciBpbiAkKEhUTUwpIDsgZG8gY3AgLXJwICQkZGlyICQoV0VCRElSKSA7IGRvbmUKLQlmb3IgbHR4IGluICQoSE9XVE8pIDsgZG8gY3AgLXAgJCRsdHggJChXRUJESVIpL2xhdGV4IDsgZG9uZQotCi1yc3Q6IHVuaWNvZGUuaHRtbAotCi0lLmh0bWw6ICUucnN0Ci0JcnN0Mmh0bWwgJChSU1RBUkdTKSAkPCA+JEAKKy5QSE9OWSA6IGR2aSBwZGYgcHMgaHRtbAorZHZpOiAgJChEVkkpCitwZGY6ICAkKFBERikKK3BzOiAgICQoUFMpCitodG1sOiAkKEhUTUwpCiAKIGNsZWFuOgotCXJtIC1mICp+ICoubG9nICouaW5kICoubDJoICouYXV4ICoudG9jICouaG93Ci0Jcm0gLWYgKi5kdmkgKi5wcyAqLnBkZiAqLmJrbQotCXJtIC1mIHVuaWNvZGUuaHRtbAorCXJtIC1mICp+ICoubG9nICouaW5kICoubDJoICouYXV4ICoudG9jICouaG93ICouYmttCisJcm0gLWYgKi5kdmkgKi5wZGYgKi5wcwogCiBjbG9iYmVyOgotCXJtIGR2aS8qIHBzLyogcGRmLyogdHh0LyogaHRtbC8qCi0KLQotCisJcm0gLXJmICQoSFRNTCkKKwlybSAtcmYgJChEVkkpICQoUERGKSAkKFBTKQpkaWZmIC0tZ2l0IGEvRG9jL2hvd3RvL2RvYW5kZG9udC50ZXggYi9Eb2MvaG93dG8vZG9hbmRkb250LnRleAppbmRleCBhZGJkZTY2Li5hMTA1Y2ExIDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vZG9hbmRkb250LnRleAorKysgYi9Eb2MvaG93dG8vZG9hbmRkb250LnRleApAQCAtMjg4LDggKzI4OCw5IEBACiBUaGVyZSBhcmUgYWxzbyBtYW55IHVzZWZ1bCBidWlsdGluIGZ1bmN0aW9ucyBwZW9wbGUgc2VlbSBub3QgdG8gYmUKIGF3YXJlIG9mIGZvciBzb21lIHJlYXNvbjogXGZ1bmN0aW9ue21pbigpfSBhbmQgXGZ1bmN0aW9ue21heCgpfSBjYW4KIGZpbmQgdGhlIG1pbmltdW0vbWF4aW11bSBvZiBhbnkgc2VxdWVuY2Ugd2l0aCBjb21wYXJhYmxlIHNlbWFudGljcywKLWZvciBleGFtcGxlLCB5ZXQgbWFueSBwZW9wbGUgd3JpdGUgdGhleSBvd24gbWF4L21pbi4gQW5vdGhlciBoaWdobHkKLXVzZWZ1bCBmdW5jdGlvbiBpcyBcZnVuY3Rpb257cmVkdWNlKCl9LiBDbGFzc2ljYWwgdXNlIG9mIFxmdW5jdGlvbntyZWR1Y2UoKX0KK2ZvciBleGFtcGxlLCB5ZXQgbWFueSBwZW9wbGUgd3JpdGUgdGhlaXIgb3duCitcZnVuY3Rpb257bWF4KCl9L1xmdW5jdGlvbnttaW4oKX0uIEFub3RoZXIgaGlnaGx5IHVzZWZ1bCBmdW5jdGlvbiBpcworXGZ1bmN0aW9ue3JlZHVjZSgpfS4gQSBjbGFzc2ljYWwgdXNlIG9mIFxmdW5jdGlvbntyZWR1Y2UoKX0KIGlzIHNvbWV0aGluZyBsaWtlCiAKIFxiZWdpbnt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9ob3d0by9zb2NrZXRzLnRleCBiL0RvYy9ob3d0by9zb2NrZXRzLnRleAppbmRleCA0ZGE5MmE4Li4wY2VjYmI5IDEwMDY0NAotLS0gYS9Eb2MvaG93dG8vc29ja2V0cy50ZXgKKysrIGIvRG9jL2hvd3RvL3NvY2tldHMudGV4CkBAIC0yMTMsMzQgKzIxMywzOSBAQAogaXMgYSBmaXhlZCBsZW5ndGggbWVzc2FnZToKIAogXGJlZ2lue3ZlcmJhdGltfQotICAgIGNsYXNzIG15c29ja2V0OgotICAgICAgICAnJydkZW1vbnN0cmF0aW9uIGNsYXNzIG9ubHkgCi0gICAgICAgICAgLSBjb2RlZCBmb3IgY2xhcml0eSwgbm90IGVmZmljaWVuY3knJycKLSAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBzb2NrIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldCgKLSAgICAgICAgICAgICAgICAgICAgc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5zb2NrID0gc29jawotICAgICAgICBkZWYgY29ubmVjdChob3N0LCBwb3J0KToKLSAgICAgICAgICAgIHNlbGYuc29jay5jb25uZWN0KChob3N0LCBwb3J0KSkKLSAgICAgICAgZGVmIG15c2VuZChtc2cpOgotICAgICAgICAgICAgdG90YWxzZW50ID0gMAotICAgICAgICAgICAgd2hpbGUgdG90YWxzZW50IDwgTVNHTEVOOgotICAgICAgICAgICAgICAgIHNlbnQgPSBzZWxmLnNvY2suc2VuZChtc2dbdG90YWxzZW50Ol0pCi0gICAgICAgICAgICAgICAgaWYgc2VudCA9PSAwOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFxcCi0gICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgotICAgICAgICAgICAgICAgIHRvdGFsc2VudCA9IHRvdGFsc2VudCArIHNlbnQKLSAgICAgICAgZGVmIG15cmVjZWl2ZSgpOgotICAgICAgICAgICAgbXNnID0gJycKLSAgICAgICAgICAgIHdoaWxlIGxlbihtc2cpIDwgTVNHTEVOOgotICAgICAgICAgICAgICAgIGNodW5rID0gc2VsZi5zb2NrLnJlY3YoTVNHTEVOLWxlbihtc2cpKQotICAgICAgICAgICAgICAgIGlmIGNodW5rID09ICcnOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IsIFxcCi0gICAgICAgICAgICAgICAgICAgICAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgotICAgICAgICAgICAgICAgIG1zZyA9IG1zZyArIGNodW5rCi0gICAgICAgICAgICByZXR1cm4gbXNnCitjbGFzcyBteXNvY2tldDoKKyAgICAnJydkZW1vbnN0cmF0aW9uIGNsYXNzIG9ubHkgCisgICAgICAtIGNvZGVkIGZvciBjbGFyaXR5LCBub3QgZWZmaWNpZW5jeQorICAgICcnJworCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2s9Tm9uZSk6CisJaWYgc29jayBpcyBOb25lOgorCSAgICBzZWxmLnNvY2sgPSBzb2NrZXQuc29ja2V0KAorCQlzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorCWVsc2U6CisJICAgIHNlbGYuc29jayA9IHNvY2sKKworICAgIGRlZiBjb25uZWN0KHNlbGYsIGhvc3QsIHBvcnQpOgorCXNlbGYuc29jay5jb25uZWN0KChob3N0LCBwb3J0KSkKKworICAgIGRlZiBteXNlbmQoc2VsZiwgbXNnKToKKwl0b3RhbHNlbnQgPSAwCisJd2hpbGUgdG90YWxzZW50IDwgTVNHTEVOOgorCSAgICBzZW50ID0gc2VsZi5zb2NrLnNlbmQobXNnW3RvdGFsc2VudDpdKQorCSAgICBpZiBzZW50ID09IDA6CisJCXJhaXNlIFJ1bnRpbWVFcnJvciwgXFwKKwkJICAgICJzb2NrZXQgY29ubmVjdGlvbiBicm9rZW4iCisJICAgIHRvdGFsc2VudCA9IHRvdGFsc2VudCArIHNlbnQKKworICAgIGRlZiBteXJlY2VpdmUoc2VsZik6CisJbXNnID0gJycKKwl3aGlsZSBsZW4obXNnKSA8IE1TR0xFTjoKKwkgICAgY2h1bmsgPSBzZWxmLnNvY2sucmVjdihNU0dMRU4tbGVuKG1zZykpCisJICAgIGlmIGNodW5rID09ICcnOgorCQlyYWlzZSBSdW50aW1lRXJyb3IsIFxcCisJCSAgICAic29ja2V0IGNvbm5lY3Rpb24gYnJva2VuIgorCSAgICBtc2cgPSBtc2cgKyBjaHVuaworCXJldHVybiBtc2cKIFxlbmR7dmVyYmF0aW19CiAKIFRoZSBzZW5kaW5nIGNvZGUgaGVyZSBpcyB1c2FibGUgZm9yIGFsbW9zdCBhbnkgbWVzc2FnaW5nIHNjaGVtZSAtIGluCmRpZmYgLS1naXQgYS9Eb2MvaW5zdC9pbnN0LnRleCBiL0RvYy9pbnN0L2luc3QudGV4CmluZGV4IDY3NmY4YWUuLmRmN2M2NTYgMTAwNjQ0Ci0tLSBhL0RvYy9pbnN0L2luc3QudGV4CisrKyBiL0RvYy9pbnN0L2luc3QudGV4CkBAIC0yNjIsNyArMjYyLDcgQEAKIFxjb2Rle3NldHVwLnB5IGluc3RhbGx9LS0tdGhlbiB0aGUgXGNvbW1hbmR7aW5zdGFsbH0gY29tbWFuZCBpbnN0YWxscyB0bwogdGhlIHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGlyZC1wYXJ0eSBQeXRob24gbW9kdWxlcy4gIFRoaXMgbG9jYXRpb24KIHZhcmllcyBieSBwbGF0Zm9ybSBhbmQgYnkgaG93IHlvdSBidWlsdC9pbnN0YWxsZWQgUHl0aG9uIGl0c2VsZi4gIE9uCi1cVU5JWHt9IChhbmQgTWFjIE9TIFgsIHdoaWNoIGlzIGFsc28gVW5peC1iYXNlZCksCitcVU5JWHt9IChhbmQgTWFjIE9TIFgsIHdoaWNoIGlzIGFsc28gXFVOSVgtYmFzZWQpLAogaXQgYWxzbyBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIG1vZHVsZSBkaXN0cmlidXRpb24KIGJlaW5nIGluc3RhbGxlZCBpcyBwdXJlIFB5dGhvbiBvciBjb250YWlucyBleHRlbnNpb25zIChgYG5vbi1wdXJlJycpOgogXGJlZ2lue3RhYmxlaXZ9e2x8bHxsfGN9e3RleHRybX0lCmRpZmYgLS1naXQgYS9Eb2MvbGliL2VtYWlsLnRleCBiL0RvYy9saWIvZW1haWwudGV4CmluZGV4IDY4NTMzMjUuLmVhMTI3MDUgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvZW1haWwudGV4CisrKyBiL0RvYy9saWIvZW1haWwudGV4CkBAIC0xMDUsNyArMTA1LDcgQEAKIFxsaW5laWlpezQuMH17UHl0aG9uIDIuNX17UHl0aG9uIDIuMyB0byAyLjV9CiBcZW5ke3RhYmxlaWlpfQogCi1IZXJlIGFyZSB0aGUgbWFqb3IgZGlmZmVyZW5jZXMgYmV0d2VlbiBcbW9kdWxle2VtYWlsfSB2ZXJzb24gNCBhbmQgdmVyc2lvbiAzOgorSGVyZSBhcmUgdGhlIG1ham9yIGRpZmZlcmVuY2VzIGJldHdlZW4gXG1vZHVsZXtlbWFpbH0gdmVyc2lvbiA0IGFuZCB2ZXJzaW9uIDM6CiAKIFxiZWdpbntpdGVtaXplfQogXGl0ZW0gQWxsIG1vZHVsZXMgaGF2ZSBiZWVuIHJlbmFtZWQgYWNjb3JkaW5nIHRvIFxwZXB7OH0gc3RhbmRhcmRzLiAgRm9yCkBAIC0xMjYsNiArMTI2LDE1IEBACiBcaXRlbSBNZXRob2RzIHRoYXQgd2VyZSBkZXByZWNhdGVkIGluIHZlcnNpb24gMyBoYXZlIGJlZW4gcmVtb3ZlZC4gIFRoZXNlCiAgICAgICBpbmNsdWRlIFxtZXRob2R7R2VuZXJhdG9yLl9fY2FsbF9fKCl9LCBcbWV0aG9ke01lc3NhZ2UuZ2V0X3R5cGUoKX0sCiAgICAgICBcbWV0aG9ke01lc3NhZ2UuZ2V0X21haW5fdHlwZSgpfSwgXG1ldGhvZHtNZXNzYWdlLmdldF9zdWJ0eXBlKCl9LgorCitcaXRlbSBGaXhlcyBoYXZlIGJlZW4gYWRkZWQgZm9yIFxyZmN7MjIzMX0gc3VwcG9ydCB3aGljaCBjYW4gY2hhbmdlIHNvbWUgb2YKKyAgICAgIHRoZSByZXR1cm4gdHlwZXMgZm9yIFxmdW5jdGlvbntNZXNzYWdlLmdldF9wYXJhbSgpfSBhbmQgZnJpZW5kcy4gIFVuZGVyCisgICAgICBzb21lIGNpcmN1bXN0YW5jZXMsIHZhbHVlcyB3aGljaCB1c2VkIHRvIHJldHVybiBhIDMtdHVwbGUgbm93IHJldHVybgorICAgICAgc2ltcGxlIHN0cmluZ3MgKHNwZWNpZmljYWxseSwgaWYgYWxsIGV4dGVuZGVkIHBhcmFtZXRlciBzZWdtZW50cyB3ZXJlCisgICAgICB1bmVuY29kZWQsIHRoZXJlIGlzIG5vIGxhbmd1YWdlIGFuZCBjaGFyc2V0IGRlc2lnbmF0aW9uIGV4cGVjdGVkLCBzbyB0aGUKKyAgICAgIHJldHVybiB0eXBlIGlzIG5vdyBhIHNpbXBsZSBzdHJpbmcpLiAgQWxzbywgXCUtZGVjb2RpbmcgdXNlZCB0byBiZSBkb25lCisgICAgICBmb3IgYm90aCBlbmNvZGVkIGFuZCB1bmVuY29kZWQgc2VnbWVudHM7IHRoaXMgZGVjb2RpbmcgaXMgbm93IGRvbmUgb25seQorICAgICAgZm9yIGVuY29kZWQgc2VnbWVudHMuCiBcZW5ke2l0ZW1pemV9CiAKIEhlcmUgYXJlIHRoZSBtYWpvciBkaWZmZXJlbmNlcyBiZXR3ZWVuIFxtb2R1bGV7ZW1haWx9IHZlcnNpb24gMyBhbmQgdmVyc2lvbiAyOgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9lbWFpbGdlbmVyYXRvci50ZXggYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAppbmRleCAzNDE1NDQyLi5iMjM2NjczIDEwMDY0NAotLS0gYS9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleAorKysgYi9Eb2MvbGliL2VtYWlsZ2VuZXJhdG9yLnRleApAQCAtMzEsMTEgKzMxLDExIEBACiBcc2FtcHs+fSBjaGFyYWN0ZXIgaW4gZnJvbnQgb2YgYW55IGxpbmUgaW4gdGhlIGJvZHkgdGhhdCBzdGFydHMgZXhhY3RseSBhcwogXHNhbXB7RnJvbSB9LCBpLmUuIFxjb2Rle0Zyb219IGZvbGxvd2VkIGJ5IGEgc3BhY2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUKIGxpbmUuICBUaGlzIGlzIHRoZSBvbmx5IGd1YXJhbnRlZWQgcG9ydGFibGUgd2F5IHRvIGF2b2lkIGhhdmluZyBzdWNoCi1saW5lcyBiZSBtaXN0YWtlbiBmb3IgYSBVbml4IG1haWxib3ggZm9ybWF0IGVudmVsb3BlIGhlYWRlciBzZXBhcmF0b3IgKHNlZQorbGluZXMgYmUgbWlzdGFrZW4gZm9yIGEgXFVOSVh7fSBtYWlsYm94IGZvcm1hdCBlbnZlbG9wZSBoZWFkZXIgc2VwYXJhdG9yIChzZWUKIFx1bGlua3tXSFkgVEhFIENPTlRFTlQtTEVOR1RIIEZPUk1BVCBJUyBCQUR9CiB7aHR0cDovL2hvbWUubmV0c2NhcGUuY29tL2VuZy9tb3ppbGxhLzIuMC9yZWxub3Rlcy9kZW1vL2NvbnRlbnQtbGVuZ3RoLmh0bWx9CiBmb3IgZGV0YWlscykuICBcdmFye21hbmdsZV9mcm9tX30gZGVmYXVsdHMgdG8gXGNvZGV7VHJ1ZX0sIGJ1dCB5b3UKLW1pZ2h0IHdhbnQgdG8gc2V0IHRoaXMgdG8gXGNvZGV7RmFsc2V9IGlmIHlvdSBhcmUgbm90IHdyaXRpbmcgVW5peAorbWlnaHQgd2FudCB0byBzZXQgdGhpcyB0byBcY29kZXtGYWxzZX0gaWYgeW91IGFyZSBub3Qgd3JpdGluZyBcVU5JWHt9CiBtYWlsYm94IGZvcm1hdCBmaWxlcy4KIAogT3B0aW9uYWwgXHZhcnttYXhoZWFkZXJsZW59IHNwZWNpZmllcyB0aGUgbG9uZ2VzdCBsZW5ndGggZm9yIGEKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliLnRleCBiL0RvYy9saWIvbGliLnRleAppbmRleCAwNjkxMTc5Li44MzdjNzU5IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYi50ZXgKKysrIGIvRG9jL2xpYi9saWIudGV4CkBAIC03MSwxMiArNzEsMTIgQEAKICUgQlVJTFQtSU5zCiAlID09PT09PT09PT09PT0KIAotXGlucHV0e2xpYm9ianN9ICAgICAgICAgICAgICAgICAlIEJ1aWx0LWluIFR5cGVzLCBFeGNlcHRpb25zIGFuZCBGdW5jdGlvbnMKK1xpbnB1dHtsaWJvYmpzfSAgICAgICAgICAgICAgICAgJSBCdWlsdC1pbiBFeGNlcHRpb25zIGFuZCBGdW5jdGlvbnMKIFxpbnB1dHtsaWJmdW5jc30KLVxpbnB1dHtsaWJzdGR0eXBlc30KIFxpbnB1dHtsaWJleGNzfQogXGlucHV0e2xpYmNvbnN0c30KIAorXGlucHV0e2xpYnN0ZHR5cGVzfSAgICAgICAgICAgICAlIEJ1aWx0LWluIHR5cGVzCiAKIAogJSA9PT09PT09PT09PT09CkBAIC0xNTQsOCArMTU0LDggQEAKIAogJSBlbmNvZGluZyBzdHVmZgogXGlucHV0e2xpYmJhc2U2NH0KLVxpbnB1dHtsaWJiaW5hc2NpaX0KIFxpbnB1dHtsaWJiaW5oZXh9CitcaW5wdXR7bGliYmluYXNjaWl9CiBcaW5wdXR7bGlicXVvcHJpfQogXGlucHV0e2xpYnV1fQogCkBAIC0xNzEsNiArMTcxLDcgQEAKIFxpbnB1dHt4bWxzYXhoYW5kbGVyfQogXGlucHV0e3htbHNheHV0aWxzfQogXGlucHV0e3htbHNheHJlYWRlcn0KK1xpbnB1dHtsaWJldHJlZX0KICUgXGlucHV0e2xpYnhtbGxpYn0KIAogXGlucHV0e2ZpbGVmb3JtYXRzfQkJJSBNaXNjZWxsYW5lb3VzIGZpbGUgZm9ybWF0cwpAQCAtMjQ1LDcgKzI0Niw2IEBACiBcaW5wdXR7bGlicGxhdGZvcm19CiBcaW5wdXR7bGliZXJybm99CiBcaW5wdXR7bGliY3R5cGVzfQotXGlucHV0e2xpYmN0eXBlc3JlZn0KIAogXGlucHV0e2xpYnNvbWVvc30gICAgICAgICAgICAgICAlIE9wdGlvbmFsIE9wZXJhdGluZyBTeXN0ZW0gU2VydmljZXMKIFxpbnB1dHtsaWJzZWxlY3R9CkBAIC0yOTIsNiArMjkyLDcgQEAKIFxpbnB1dHtsaWJ3ZWJicm93c2VyfQogXGlucHV0e2xpYmNnaX0KIFxpbnB1dHtsaWJjZ2l0Yn0KK1xpbnB1dHtsaWJ3c2dpcmVmfQogXGlucHV0e2xpYnVybGxpYn0KIFxpbnB1dHtsaWJ1cmxsaWIyfQogXGlucHV0e2xpYmh0dHBsaWJ9CkBAIC0zMDMsNiArMzA0LDcgQEAKIFxpbnB1dHtsaWJzbXRwbGlifQogXGlucHV0e2xpYnNtdHBkfQogXGlucHV0e2xpYnRlbG5ldGxpYn0KK1xpbnB1dHtsaWJ1dWlkfQogXGlucHV0e2xpYnVybHBhcnNlfQogXGlucHV0e2xpYnNvY2tzdnJ9CiBcaW5wdXR7bGliYmFzZWh0dHB9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmFueWRibS50ZXggYi9Eb2MvbGliL2xpYmFueWRibS50ZXgKaW5kZXggMTcyMjhkZC4uYmFkYzZlYyAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJhbnlkYm0udGV4CisrKyBiL0RvYy9saWIvbGliYW55ZGJtLnRleApAQCAtNDYsNiArNDYsMzIgQEAKIFxtZXRob2R7a2V5cygpfSBtZXRob2RzIGFyZSBhdmFpbGFibGUuICBLZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbHdheXMgYmUKIHN0cmluZ3MuCiAKK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWNvcmRzIHNvbWUgaG9zdG5hbWVzIGFuZCBhIGNvcnJlc3BvbmRpbmcgdGl0bGUsIAorYW5kIHRoZW4gcHJpbnRzIG91dCB0aGUgY29udGVudHMgb2YgdGhlIGRhdGFiYXNlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgYW55ZGJtCisKKyMgT3BlbiBkYXRhYmFzZSwgY3JlYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorZGIgPSBhbnlkYm0ub3BlbignY2FjaGUnLCAnYycpCisKKyMgUmVjb3JkIHNvbWUgdmFsdWVzCitkYlsnd3d3LnB5dGhvbi5vcmcnXSA9ICdQeXRob24gV2Vic2l0ZScKK2RiWyd3d3cuY25uLmNvbSddID0gJ0NhYmxlIE5ld3MgTmV0d29yaycKKworIyBMb29wIHRocm91Z2ggY29udGVudHMuICBPdGhlciBkaWN0aW9uYXJ5IG1ldGhvZHMKKyMgc3VjaCBhcyAua2V5cygpLCAudmFsdWVzKCkgYWxzbyB3b3JrLgorZm9yIGssIHYgaW4gZGIuaXRlcml0ZW1zKCk6CisgICAgcHJpbnQgaywgJ1x0JywgdgorCisjIFN0b3JpbmcgYSBub24tc3RyaW5nIGtleSBvciB2YWx1ZSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiAobW9zdAorIyBsaWtlbHkgYSBUeXBlRXJyb3IpLgorZGJbJ3d3dy55YWhvby5jb20nXSA9IDQKKworIyBDbG9zZSB3aGVuIGRvbmUuCitkYi5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCiAKIFxiZWdpbntzZWVhbHNvfQogICBcc2VlbW9kdWxle2RiaGFzaH17QlNEIFxjb2Rle2RifSBkYXRhYmFzZSBpbnRlcmZhY2UufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiYXNlNjQudGV4IGIvRG9jL2xpYi9saWJiYXNlNjQudGV4CmluZGV4IDc0N2Q4MzcuLjAwMzljODQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliYmFzZTY0LnRleAorKysgYi9Eb2MvbGliL2xpYmJhc2U2NC50ZXgKQEAgLTE0Niw2ICsxNDYsMTggQEAKIGFsd2F5cyBpbmNsdWRpbmcgYW4gZXh0cmEgdHJhaWxpbmcgbmV3bGluZSAoXGNvZGV7J1xlIG4nfSkuCiBcZW5ke2Z1bmNkZXNjfQogCitBbiBleGFtcGxlIHVzYWdlIG9mIHRoZSBtb2R1bGU6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBpbXBvcnQgYmFzZTY0Cis+Pj4gZW5jb2RlZCA9IGJhc2U2NC5iNjRlbmNvZGUoJ2RhdGEgdG8gYmUgZW5jb2RlZCcpCis+Pj4gZW5jb2RlZAorJ1pHRjBZU0IwYnlCaVpTQmxibU52WkdWaycKKz4+PiBkYXRhID0gYmFzZTY0LmI2NGRlY29kZShlbmNvZGVkKQorPj4+IGRhdGEKKydkYXRhIHRvIGJlIGVuY29kZWQnCitcZW5ke3ZlcmJhdGltfQorCiBcYmVnaW57c2VlYWxzb30KICAgXHNlZW1vZHVsZXtiaW5hc2NpaX17U3VwcG9ydCBtb2R1bGUgY29udGFpbmluZyBcQVNDSUktdG8tYmluYXJ5CiAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBiaW5hcnktdG8tXEFTQ0lJe30gY29udmVyc2lvbnMufQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJiaW5hc2NpaS50ZXggYi9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleAppbmRleCBiMjQ0YjEwLi44NGQyOWM2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleAorKysgYi9Eb2MvbGliL2xpYmJpbmFzY2lpLnRleApAQCAtOSwxMCArOSwxMSBAQAogVGhlIFxtb2R1bGV7YmluYXNjaWl9IG1vZHVsZSBjb250YWlucyBhIG51bWJlciBvZiBtZXRob2RzIHRvIGNvbnZlcnQKIGJldHdlZW4gYmluYXJ5IGFuZCB2YXJpb3VzIFxBU0NJSS1lbmNvZGVkIGJpbmFyeQogcmVwcmVzZW50YXRpb25zLiBOb3JtYWxseSwgeW91IHdpbGwgbm90IHVzZSB0aGVzZSBmdW5jdGlvbnMgZGlyZWN0bHkKLWJ1dCB1c2Ugd3JhcHBlciBtb2R1bGVzIGxpa2UgXHJlZm1vZHVsZXt1dX1ccmVmc3Rtb2RpbmRleHt1dX0gb3IKLVxyZWZtb2R1bGV7YmluaGV4fVxyZWZzdG1vZGluZGV4e2JpbmhleH0gaW5zdGVhZCwgdGhpcyBtb2R1bGUgc29sZWx5Ci1leGlzdHMgYmVjYXVzZSBiaXQtbWFuaXB1bGF0aW9uIG9mIGxhcmdlIGFtb3VudHMgb2YgZGF0YSBpcyBzbG93IGluCi1QeXRob24uCitidXQgdXNlIHdyYXBwZXIgbW9kdWxlcyBsaWtlIFxyZWZtb2R1bGV7dXV9XHJlZnN0bW9kaW5kZXh7dXV9LAorXHJlZm1vZHVsZXtiYXNlNjR9XHJlZnN0bW9kaW5kZXh7YmFzZTY0fSwgb3IKK1xyZWZtb2R1bGV7YmluaGV4fVxyZWZzdG1vZGluZGV4e2JpbmhleH0gaW5zdGVhZC4gVGhlIFxtb2R1bGV7YmluYXNjaWl9IG1vZHVsZQorY29udGFpbnMgbG93LWxldmVsIGZ1bmN0aW9ucyB3cml0dGVuIGluIEMgZm9yIGdyZWF0ZXIgc3BlZWQKK3RoYXQgYXJlIHVzZWQgYnkgdGhlIGhpZ2hlci1sZXZlbCBtb2R1bGVzLgogCiBUaGUgXG1vZHVsZXtiaW5hc2NpaX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliYnNkZGIudGV4IGIvRG9jL2xpYi9saWJic2RkYi50ZXgKaW5kZXggYTVjZGE2ZC4uNDRiOTE2OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJic2RkYi50ZXgKKysrIGIvRG9jL2xpYi9saWJic2RkYi50ZXgKQEAgLTEzLDIzICsxMywyOSBAQAogZGljdGlvbmFyaWVzLiAgS2V5cyBhbmQgdmFsdWVzIG11c3QgYmUgc3RyaW5ncywgaG93ZXZlciwgc28gdG8gdXNlCiBvdGhlciBvYmplY3RzIGFzIGtleXMgb3IgdG8gc3RvcmUgb3RoZXIga2luZHMgb2Ygb2JqZWN0cyB0aGUgdXNlciBtdXN0CiBzZXJpYWxpemUgdGhlbSBzb21laG93LCB0eXBpY2FsbHkgdXNpbmcgXGZ1bmN0aW9ue21hcnNoYWwuZHVtcHMoKX0gb3IgCi1cZnVuY3Rpb257cGlja2xlLmR1bXBzfS4KK1xmdW5jdGlvbntwaWNrbGUuZHVtcHMoKX0uCiAKIFRoZSBcbW9kdWxle2JzZGRifSBtb2R1bGUgcmVxdWlyZXMgYSBCZXJrZWxleSBEQiBsaWJyYXJ5IHZlcnNpb24gZnJvbQogMy4zIHRocnUgNC40LgogCiBcYmVnaW57c2VlYWxzb30KLSAgXHNlZXVybHtodHRwOi8vcHlic2RkYi5zb3VyY2Vmb3JnZS5uZXQvfXtXZWJzaXRlIHdpdGggZG9jdW1lbnRhdGlvbgotICBmb3IgdGhlIG5ldyBweXRob24gQmVya2VsZXkgREIgaW50ZXJmYWNlIHRoYXQgY2xvc2VseSBtaXJyb3JzIHRoZSAKLSAgc2xlZXB5Y2F0IG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgcHJvdmlkZWQgaW4gQmVya2VsZXkgREIgMyBhbmQgNC59CisgIFxzZWV1cmx7aHR0cDovL3B5YnNkZGIuc291cmNlZm9yZ2UubmV0L317VGhlIHdlYnNpdGUgd2l0aCBkb2N1bWVudGF0aW9uCisgIGZvciB0aGUgXG1vZHVsZXtic2RkYi5kYn0gcHl0aG9uIEJlcmtlbGV5IERCIGludGVyZmFjZSB0aGF0IGNsb3NlbHkgbWlycm9ycworICB0aGUgU2xlZXB5Y2F0IG9iamVjdCBvcmllbnRlZCBpbnRlcmZhY2UgcHJvdmlkZWQgaW4gQmVya2VsZXkgREIgMyBhbmQgNC59CiAgIFxzZWV1cmx7aHR0cDovL3d3dy5zbGVlcHljYXQuY29tL317U2xlZXB5Y2F0IFNvZnR3YXJlIHByb2R1Y2VzIHRoZQotICBtb2Rlcm4gQmVya2VsZXkgREIgbGlicmFyeS59CisgIEJlcmtlbGV5IERCIGxpYnJhcnkufQogXGVuZHtzZWVhbHNvfQogCitBIG1vcmUgbW9kZXJuIERCLCBEQkVudiBhbmQgREJTZXF1ZW5jZSBvYmplY3QgaW50ZXJmYWNlIGlzIGF2YWlsYWJsZSBpbiB0aGUKK1xtb2R1bGV7YnNkZGIuZGJ9IG1vZHVsZSB3aGljaCBjbG9zZWx5IG1hdGNoZXMgdGhlIFNsZWVweWNhdCBCZXJrZWxleSBEQiBDIEFQSQorZG9jdW1lbnRlZCBhdCB0aGUgYWJvdmUgVVJMcy4gIEFkZGl0aW9uYWwgZmVhdHVyZXMgcHJvdmlkZWQgYnkgdGhlCitcbW9kdWxle2JzZGRiLmRifSBBUEkgaW5jbHVkZSBmaW5lIHR1bmluZywgdHJhbnNhY3Rpb25zLCBsb2dnaW5nLCBhbmQKK211bHRpcHJvY2VzcyBjb25jdXJyZW50IGRhdGFiYXNlIGFjY2Vzcy4KKwogVGhlIGZvbGxvd2luZyBpcyBhIGRlc2NyaXB0aW9uIG9mIHRoZSBsZWdhY3kgXG1vZHVsZXtic2RkYn0gaW50ZXJmYWNlCi1jb21wYXRpYmxlIHdpdGggdGhlIG9sZCBweXRob24gYnNkZGIgbW9kdWxlLiAgRm9yIGRldGFpbHMgYWJvdXQgdGhlIG1vcmUKLW1vZGVybiBEYiBhbmQgRGJFbnYgb2JqZWN0IG9yaWVudGVkIGludGVyZmFjZSBzZWUgdGhlIGFib3ZlIG1lbnRpb25lZAotcHlic2RkYiBVUkwuCitjb21wYXRpYmxlIHdpdGggdGhlIG9sZCBweXRob24gYnNkZGIgbW9kdWxlLiAgU3RhcnRpbmcgaW4gUHl0aG9uIDIuNSB0aGlzCitpbnRlcmZhY2Ugc2hvdWxkIGJlIHNhZmUgZm9yIG11bHRpdGhyZWFkZWQgYWNjZXNzLiAgVGhlIFxtb2R1bGV7YnNkZGIuZGJ9CitBUEkgaXMgcmVjb21tZW5kZWQgZm9yIHRocmVhZGluZyB1c2VycyBhcyBpdCBwcm92aWRlcyBiZXR0ZXIgY29udHJvbC4KIAogVGhlIFxtb2R1bGV7YnNkZGJ9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRoYXQgY3JlYXRlCiBvYmplY3RzIHRoYXQgYWNjZXNzIHRoZSBhcHByb3ByaWF0ZSB0eXBlIG9mIEJlcmtlbGV5IERCIGZpbGUuICBUaGUKQEAgLTg4LDcgKzk0LDcgQEAKIAogCiBcYmVnaW57bm90aWNlfQotQmVnaW5uaW5nIGluIDIuMyBzb21lIFVuaXggdmVyc2lvbnMgb2YgUHl0aG9uIG1heSBoYXZlIGEgXG1vZHVsZXtic2RkYjE4NX0KK0JlZ2lubmluZyBpbiAyLjMgc29tZSBcVU5JWHt9IHZlcnNpb25zIG9mIFB5dGhvbiBtYXkgaGF2ZSBhIFxtb2R1bGV7YnNkZGIxODV9CiBtb2R1bGUuICBUaGlzIGlzIHByZXNlbnQgXGVtcGh7b25seX0gdG8gYWxsb3cgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAogc3lzdGVtcyB3aGljaCBzaGlwIHdpdGggdGhlIG9sZCBCZXJrZWxleSBEQiAxLjg1IGRhdGFiYXNlIGxpYnJhcnkuICBUaGUKIFxtb2R1bGV7YnNkZGIxODV9IG1vZHVsZSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseSBpbiBuZXcgY29kZS4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliY29tcGlsZWFsbC50ZXggYi9Eb2MvbGliL2xpYmNvbXBpbGVhbGwudGV4CmluZGV4IGQzOWE1NDguLjNlOTY2N2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY29tcGlsZWFsbC50ZXgKKysrIGIvRG9jL2xpYi9saWJjb21waWxlYWxsLnRleApAQCAtNDQsNiArNDQsMTkgQEAKICAgXGZ1bmN0aW9ue2NvbXBpbGVfZGlyKCl9IGZ1bmN0aW9uLgogXGVuZHtmdW5jZGVzY30KIAorVG8gZm9yY2UgYSByZWNvbXBpbGUgb2YgYWxsIHRoZSBcZmlsZXsucHl9IGZpbGVzIGluIHRoZSBcZmlsZXtMaWIvfQorc3ViZGlyZWN0b3J5IGFuZCBhbGwgaXRzIHN1YmRpcmVjdG9yaWVzOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgY29tcGlsZWFsbAorCitjb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgZm9yY2U9VHJ1ZSkKKworIyBQZXJmb3JtIHNhbWUgY29tcGlsYXRpb24sIGV4Y2x1ZGluZyBmaWxlcyBpbiAuc3ZuIGRpcmVjdG9yaWVzLgoraW1wb3J0IHJlCitjb21waWxlYWxsLmNvbXBpbGVfZGlyKCdMaWIvJywgcng9cmUuY29tcGlsZSgnL1suXXN2bicpLCBmb3JjZT1UcnVlKQorXGVuZHt2ZXJiYXRpbX0KKwogCiBcYmVnaW57c2VlYWxzb30KICAgXHNlZW1vZHVsZVtweWNvbXBpbGVde3B5X2NvbXBpbGV9e0J5dGUtY29tcGlsZSBhIHNpbmdsZSBzb3VyY2UgZmlsZS59CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXggYi9Eb2MvbGliL2xpYmNvb2tpZWxpYi50ZXgKaW5kZXggZWYyZDgzMy4uMDFmMjUzOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJjb29raWVsaWIudGV4CisrKyBiL0RvYy9saWIvbGliY29va2llbGliLnRleApAQCAtMjQsNyArMjQsNyBAQAogdGhlIGRlLWZhY3RvIE5ldHNjYXBlIGNvb2tpZSBwcm90b2NvbCAod2hpY2ggZGlmZmVycyBzdWJzdGFudGlhbGx5CiBmcm9tIHRoYXQgc2V0IG91dCBpbiB0aGUgb3JpZ2luYWwgTmV0c2NhcGUgc3BlY2lmaWNhdGlvbiksIGluY2x1ZGluZwogdGFraW5nIG5vdGUgb2YgdGhlIFxjb2Rle21heC1hZ2V9IGFuZCBcY29kZXtwb3J0fSBjb29raWUtYXR0cmlidXRlcwotaW50cm9kdWNlZCB3aXRoIFJGQyAyMTA5LiAgXG5vdGV7VGhlIHZhcmlvdXMgbmFtZWQgcGFyYW1ldGVycyBmb3VuZCBpbgoraW50cm9kdWNlZCB3aXRoIFJGQyAyOTY1LiAgXG5vdGV7VGhlIHZhcmlvdXMgbmFtZWQgcGFyYW1ldGVycyBmb3VuZCBpbgogXG1haWxoZWFkZXJ7U2V0LUNvb2tpZX0gYW5kIFxtYWlsaGVhZGVye1NldC1Db29raWUyfSBoZWFkZXJzCiAoZWcuIFxjb2Rle2RvbWFpbn0gYW5kIFxjb2Rle2V4cGlyZXN9KSBhcmUgY29udmVudGlvbmFsbHkgcmVmZXJyZWQgdG8KIGFzIFxkZm57YXR0cmlidXRlc30uICBUbyBkaXN0aW5ndWlzaCB0aGVtIGZyb20gUHl0aG9uIGF0dHJpYnV0ZXMsIHRoZQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjc3YudGV4IGIvRG9jL2xpYi9saWJjc3YudGV4CmluZGV4IDY1MDUzYzcuLjhlMTBjY2YgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliY3N2LnRleAorKysgYi9Eb2MvbGliL2xpYmNzdi50ZXgKQEAgLTU1LDcgKzU1LDcgQEAKIFJldHVybiBhIHJlYWRlciBvYmplY3Qgd2hpY2ggd2lsbCBpdGVyYXRlIG92ZXIgbGluZXMgaW4gdGhlIGdpdmVuCiB7fVx2YXJ7Y3N2ZmlsZX0uICBcdmFye2NzdmZpbGV9IGNhbiBiZSBhbnkgb2JqZWN0IHdoaWNoIHN1cHBvcnRzIHRoZQogaXRlcmF0b3IgcHJvdG9jb2wgYW5kIHJldHVybnMgYSBzdHJpbmcgZWFjaCB0aW1lIGl0cyBcbWV0aG9ke25leHR9Ci1tZXRob2QgaXMgY2FsbGVkIC0gZmlsZSBvYmplY3RzIGFuZCBsaXN0IG9iamVjdHMgYXJlIGJvdGggc3VpdGFibGUuICAKK21ldGhvZCBpcyBjYWxsZWQgLS0tIGZpbGUgb2JqZWN0cyBhbmQgbGlzdCBvYmplY3RzIGFyZSBib3RoIHN1aXRhYmxlLiAgCiBJZiBcdmFye2NzdmZpbGV9IGlzIGEgZmlsZSBvYmplY3QsIGl0IG11c3QgYmUgb3BlbmVkIHdpdGgKIHRoZSAnYicgZmxhZyBvbiBwbGF0Zm9ybXMgd2hlcmUgdGhhdCBtYWtlcyBhIGRpZmZlcmVuY2UuICBBbiBvcHRpb25hbAoge31cdmFye2RpYWxlY3R9IHBhcmFtZXRlciBjYW4gYmUgZ2l2ZW4KQEAgLTcwLDYgKzcwLDE4IEBACiAKIEFsbCBkYXRhIHJlYWQgYXJlIHJldHVybmVkIGFzIHN0cmluZ3MuICBObyBhdXRvbWF0aWMgZGF0YSB0eXBlCiBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZC4KKworXHZlcnNpb25jaGFuZ2VkWworVGhlIHBhcnNlciBpcyBub3cgc3RyaWN0ZXIgd2l0aCByZXNwZWN0IHRvIG11bHRpLWxpbmUgcXVvdGVkCitmaWVsZHMuIFByZXZpb3VzbHksIGlmIGEgbGluZSBlbmRlZCB3aXRoaW4gYSBxdW90ZWQgZmllbGQgd2l0aG91dCBhCit0ZXJtaW5hdGluZyBuZXdsaW5lIGNoYXJhY3RlciwgYSBuZXdsaW5lIHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCityZXR1cm5lZCBmaWVsZC4gVGhpcyBiZWhhdmlvciBjYXVzZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIGZpbGVzCit3aGljaCBjb250YWluZWQgY2FycmlhZ2UgcmV0dXJuIGNoYXJhY3RlcnMgd2l0aGluIGZpZWxkcy4gIFRoZQorYmVoYXZpb3Igd2FzIGNoYW5nZWQgdG8gcmV0dXJuIHRoZSBmaWVsZCB3aXRob3V0IGluc2VydGluZyBuZXdsaW5lcy4gQXMKK2EgY29uc2VxdWVuY2UsIGlmIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMgYXJlIGltcG9ydGFudCwgdGhlCitpbnB1dCBzaG91bGQgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB3aGljaCBwcmVzZXJ2ZXMgdGhlIG5ld2xpbmUKK2NoYXJhY3RlcnNdezIuNX0KKwogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXt3cml0ZXJ9e2NzdmZpbGVcb3B0aW9uYWx7LApAQCAtNDA0LDcgKzQxNiw3IEBACiByZWFkZXIgPSBjc3YucmVhZGVyKG9wZW4oInBhc3N3ZCIsICJyYiIpLCAndW5peHB3ZCcpCiBcZW5ke3ZlcmJhdGltfQogCi1BIHNsaWdodGx5IG1vcmUgYWR2YW5jZWQgdXNlIG9mIHRoZSByZWFkZXIgLSBjYXRjaGluZyBhbmQgcmVwb3J0aW5nIGVycm9yczoKK0Egc2xpZ2h0bHkgbW9yZSBhZHZhbmNlZCB1c2Ugb2YgdGhlIHJlYWRlciAtLS0gY2F0Y2hpbmcgYW5kIHJlcG9ydGluZyBlcnJvcnM6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCBjc3YsIHN5cwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjdHlwZXMudGV4IGIvRG9jL2xpYi9saWJjdHlwZXMudGV4CmluZGV4IGRjMzc3NDkuLjYyMDZiOGMgMTAwNzU1Ci0tLSBhL0RvYy9saWIvbGliY3R5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYmN0eXBlcy50ZXgKQEAgLTEsNCArMSw0IEBACi1cbmV3bGVuZ3Roe1xsb2NhbGxpbmV3aWR0aH0KK1xpZnhcbG9jYWxsaW5ld2lkdGhcdW5kZWZpbmVkXG5ld2xlbmd0aHtcbG9jYWxsaW5ld2lkdGh9XGZpCiBcc2V0bGVuZ3Roe1xsb2NhbGxpbmV3aWR0aH17XGxpbmV3aWR0aH0KIFxzZWN0aW9ue1xtb2R1bGV7Y3R5cGVzfSAtLS0gQSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi59CiBcZGVjbGFyZW1vZHVsZXtzdGFuZGFyZH17Y3R5cGVzfQpAQCAtNiwxMyArNiwxMyBAQAogXG1vZHVsZXN5bm9wc2lze0EgZm9yZWlnbiBmdW5jdGlvbiBsaWJyYXJ5IGZvciBQeXRob24ufQogXHZlcnNpb25hZGRlZHsyLjV9CiAKLVxjb2Rle2N0eXBlc30gaXMgYSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi4KK1xjb2Rle2N0eXBlc30gaXMgYSBmb3JlaWduIGZ1bmN0aW9uIGxpYnJhcnkgZm9yIFB5dGhvbi4gIEl0IHByb3ZpZGVzIEMKK2NvbXBhdGlibGUgZGF0YSB0eXBlcywgYW5kIGFsbG93cyB0byBjYWxsIGZ1bmN0aW9ucyBpbiBkbGxzL3NoYXJlZAorbGlicmFyaWVzLiAgSXQgY2FuIGJlIHVzZWQgdG8gd3JhcCB0aGVzZSBsaWJyYXJpZXMgaW4gcHVyZSBQeXRob24uCiAKIAogXHN1YnNlY3Rpb257Y3R5cGVzIHR1dG9yaWFsXGxhYmVse2N0eXBlcy1jdHlwZXMtdHV0b3JpYWx9fQogCi1UaGlzIHR1dG9yaWFsIGRlc2NyaWJlcyB2ZXJzaW9uIDAuOS45IG9mIFxjb2Rle2N0eXBlc30uCi0KIE5vdGU6IFRoZSBjb2RlIHNhbXBsZXMgaW4gdGhpcyB0dXRvcmlhbCB1c2VzIFxjb2Rle2RvY3Rlc3R9IHRvIG1ha2Ugc3VyZQogdGhhdCB0aGV5IGFjdHVhbGx5IHdvcmsuICBTaW5jZSBzb21lIGNvZGUgc2FtcGxlcyBiZWhhdmUgZGlmZmVyZW50bHkKIHVuZGVyIExpbnV4LCBXaW5kb3dzLCBvciBNYWMgT1MgWCwgdGhleSBjb250YWluIGRvY3Rlc3QgZGlyZWN0aXZlcyBpbgpAQCAtNjYsOCArNjYsNyBAQAogPENETEwgJ2xpYmMuc28uNicsIGhhbmRsZSAuLi4gYXQgLi4uPgogPj4+CiBcZW5ke3ZlcmJhdGltfQotCi1YWFggQWRkIHNlY3Rpb24gZm9yIE1hYyBPUyBYLgorJSBYWFggQWRkIHNlY3Rpb24gZm9yIE1hYyBPUyBYLiAKIAogCiBcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgZnVuY3Rpb25zIGZyb20gbG9hZGVkIGRsbHNcbGFiZWx7Y3R5cGVzLWFjY2Vzc2luZy1mdW5jdGlvbnMtZnJvbS1sb2FkZWQtZGxsc319CkBAIC0xMTksNyArMTE4LDcgQEAKIAogT24gV2luZG93cywgc29tZSBkbGxzIGV4cG9ydCBmdW5jdGlvbnMgbm90IGJ5IG5hbWUgYnV0IGJ5IG9yZGluYWwuCiBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIGJ5IGluZGV4aW5nIHRoZSBkbGwgb2JqZWN0IHdpdGggdGhlCi1vZGluYWwgbnVtYmVyOgorb3JkaW5hbCBudW1iZXI6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gY2RsbC5rZXJuZWwzMlsxXSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA8X0Z1bmNQdHIgb2JqZWN0IGF0IDB4Li4uPgpAQCAtMTQzLDE2ICsxNDIsMTggQEAKIFRoaXMgZXhhbXBsZSBjYWxscyBib3RoIGZ1bmN0aW9ucyB3aXRoIGEgTlVMTCBwb2ludGVyIChcY29kZXtOb25lfSBzaG91bGQKIGJlIHVzZWQgYXMgdGhlIE5VTEwgcG9pbnRlcik6CiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gcHJpbnQgbGliYy50aW1lKE5vbmUpCi0xMTQuLi4KKz4+PiBwcmludCBsaWJjLnRpbWUoTm9uZSkgIyBkb2N0ZXN0OiArU0tJUAorMTE1MDY0MDc5MgogPj4+IHByaW50IGhleCh3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQShOb25lKSkgIyBkb2N0ZXN0OiArV0lORE9XUwogMHgxZDAwMDAwMAogPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBcY29kZXtjdHlwZXN9IHRyaWVzIHRvIHByb3RlY3QgeW91IGZyb20gY2FsbGluZyBmdW5jdGlvbnMgd2l0aCB0aGUgd3JvbmcKLW51bWJlciBvZiBhcmd1bWVudHMuICBVbmZvcnR1bmF0ZWx5IHRoaXMgb25seSB3b3JrcyBvbiBXaW5kb3dzLiAgSXQKLWRvZXMgdGhpcyBieSBleGFtaW5pbmcgdGhlIHN0YWNrIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zOgorbnVtYmVyIG9mIGFyZ3VtZW50cyBvciB0aGUgd3JvbmcgY2FsbGluZyBjb252ZW50aW9uLiAgVW5mb3J0dW5hdGVseQordGhpcyBvbmx5IHdvcmtzIG9uIFdpbmRvd3MuICBJdCBkb2VzIHRoaXMgYnkgZXhhbWluaW5nIHRoZSBzdGFjayBhZnRlcgordGhlIGZ1bmN0aW9uIHJldHVybnMsIHNvIGFsdGhvdWdoIGFuIGVycm9yIGlzIHJhaXNlZCB0aGUgZnVuY3Rpb24KK1xlbXBoe2hhc30gYmVlbiBjYWxsZWQ6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gd2luZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CkBAIC0xNjUsNiArMTY2LDI1IEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKK1RoZSBzYW1lIGV4Y2VwdGlvbiBpcyByYWlzZWQgd2hlbiB5b3UgY2FsbCBhbiBcY29kZXtzdGRjYWxsfSBmdW5jdGlvbgord2l0aCB0aGUgXGNvZGV7Y2RlY2x9IGNhbGxpbmcgY29udmVudGlvbiwgb3IgdmljZSB2ZXJzYToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBjZGxsLmtlcm5lbDMyLkdldE1vZHVsZUhhbmRsZUEoTm9uZSkgIyBkb2N0ZXN0OiArV0lORE9XUworVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggbm90IGVub3VnaCBhcmd1bWVudHMgKDQgYnl0ZXMgbWlzc2luZykKKz4+PgorCis+Pj4gd2luZGxsLm1zdmNydC5wcmludGYoInNwYW0iKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KK1ZhbHVlRXJyb3I6IFByb2NlZHVyZSBwcm9iYWJseSBjYWxsZWQgd2l0aCB0b28gbWFueSBhcmd1bWVudHMgKDQgYnl0ZXMgaW4gZXhjZXNzKQorPj4+CitcZW5ke3ZlcmJhdGltfQorCitUbyBmaW5kIG91dCB0aGUgY29ycmVjdCBjYWxsaW5nIGNvbnZlbnRpb24geW91IGhhdmUgdG8gbG9vayBpbnRvIHRoZSBDCitoZWFkZXIgZmlsZSBvciB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGZ1bmN0aW9uIHlvdSB3YW50IHRvIGNhbGwuCisKIE9uIFdpbmRvd3MsIFxjb2Rle2N0eXBlc30gdXNlcyB3aW4zMiBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyB0bwogcHJldmVudCBjcmFzaGVzIGZyb20gZ2VuZXJhbCBwcm90ZWN0aW9uIGZhdWx0cyB3aGVuIGZ1bmN0aW9ucyBhcmUKIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnQgdmFsdWVzOgpAQCAtMTg2LDE1OCArMjA2LDE3MiBAQAogaGF2ZSB0byBsZWFybiBtb3JlIGFib3V0IFxjb2Rle2N0eXBlc30gZGF0YSB0eXBlcy4KIAogCi1cc3Vic3Vic2VjdGlvbntTaW1wbGUgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtc2ltcGxlLWRhdGEtdHlwZXN9fQorXHN1YnN1YnNlY3Rpb257RnVuZGFtZW50YWwgZGF0YSB0eXBlc1xsYWJlbHtjdHlwZXMtZnVuZGFtZW50YWwtZGF0YS10eXBlc319CiAKIFxjb2Rle2N0eXBlc30gZGVmaW5lcyBhIG51bWJlciBvZiBwcmltaXRpdmUgQyBjb21wYXRpYmxlIGRhdGEgdHlwZXMgOgogXGJlZ2lue3F1b3RlfQotCi1cYmVnaW57bG9uZ3RhYmxlfVtjXXt8cHswLjE5XGxvY2FsbGluZXdpZHRofXxwezAuMjhcbG9jYWxsaW5ld2lkdGh9fHB7MC4xNFxsb2NhbGxpbmV3aWR0aH18fQotXGhsaW5lCi1cdGV4dGJmeworXGJlZ2lue3RhYmxlaWlpfXtsfGx8bH17dGV4dHJtfQorewogY3R5cGVzIHR5cGUKLX0gJiBcdGV4dGJmeworfQorewogQyB0eXBlCi19ICYgXHRleHRiZnsKK30KK3sKIFB5dGhvbiB0eXBlCi19IFxcCi1caGxpbmUKLVxlbmRoZWFkCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99Y2hhcn0KLSAmIAorfQorewogXGNvZGV7Y2hhcn0KLSAmIAorfQorewogY2hhcmFjdGVyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWJ5dGV9Ci0gJiAKK30KK3sKIFxjb2Rle2NoYXJ9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWJ5dGV9Ci0gJiAKK30KK3sKIFxjb2Rle3Vuc2lnbmVkIGNoYXJ9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99c2hvcnR9Ci0gJiAKK30KK3sKIFxjb2Rle3Nob3J0fQotICYgCit9Cit7CiBpbnRlZ2VyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffXVzaG9ydH0KLSAmIAorfQorewogXGNvZGV7dW5zaWduZWQgc2hvcnR9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99aW50fQotICYgCit9Cit7CiBcY29kZXtpbnR9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWludH0KLSAmIAorfQorewogXGNvZGV7dW5zaWduZWQgaW50fQotICYgCit9Cit7CiBpbnRlZ2VyCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWxvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle2xvbmd9Ci0gJiAKK30KK3sKIGludGVnZXIKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWxvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle3Vuc2lnbmVkIGxvbmd9Ci0gJiAKK30KK3sKIGxvbmcKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99bG9uZ2xvbmd9Ci0gJiAKK30KK3sKIFxjb2Rle3tcX317XF99aW50NjR9IG9yCiBcY29kZXtsb25nIGxvbmd9Ci0gJiAKK30KK3sKIGxvbmcKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dWxvbmdsb25nfQotICYgCit9Cit7CiBcY29kZXt1bnNpZ25lZCB7XF99e1xffWludDY0fSBvcgogXGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfQotICYgCit9Cit7CiBsb25nCi0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWZsb2F0fQotICYgCit9Cit7CiBcY29kZXtmbG9hdH0KLSAmIAorfQorewogZmxvYXQKLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99ZG91YmxlfQotICYgCit9Cit7CiBcY29kZXtkb3VibGV9Ci0gJiAKK30KK3sKIGZsb2F0Ci0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffWNoYXJ7XF99cH0KLSAmIAorfQorewogXGNvZGV7Y2hhciAqfQogKE5VTCB0ZXJtaW5hdGVkKQotICYgCit9Cit7CiBzdHJpbmcgb3IKIFxjb2Rle05vbmV9Ci0gXFwKLVxobGluZQotCit9CitcbGluZWlpaXsKIFxjbGFzc3tje1xffXdjaGFye1xffXB9Ci0gJiAKK30KK3sKIFxjb2Rle3djaGFye1xffXQgKn0KIChOVUwgdGVybWluYXRlZCkKLSAmIAorfQorewogdW5pY29kZSBvcgogXGNvZGV7Tm9uZX0KLSBcXAotXGhsaW5lCi0KK30KK1xsaW5laWlpewogXGNsYXNze2N7XF99dm9pZHtcX31wfQotICYgCit9Cit7CiBcY29kZXt2b2lkICp9Ci0gJiAKK30KK3sKIGludGVnZXIgb3IKIFxjb2Rle05vbmV9Ci0gXFwKLVxobGluZQotXGVuZHtsb25ndGFibGV9Cit9CitcZW5ke3RhYmxlaWlpfQogXGVuZHtxdW90ZX0KIAogQWxsIHRoZXNlIHR5cGVzIGNhbiBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlbSB3aXRoIGFuIG9wdGlvbmFsCkBAIC0zODAsNiArNDE0LDcgQEAKIGNfY2hhcl9wKCdIaSwgdGhlcmUnKQogPj4+IHByaW50IHMgICAgICAgICAgICAgICAgICMgZmlyc3Qgc3RyaW5nIGlzIHVuY2hhbmdlZAogSGVsbG8sIFdvcmxkCis+Pj4KIFxlbmR7dmVyYmF0aW19CiAKIFlvdSBzaG91bGQgYmUgY2FyZWZ1bCwgaG93ZXZlciwgbm90IHRvIHBhc3MgdGhlbSB0byBmdW5jdGlvbnMKQEAgLTU1NywxMyArNTkyLDEyIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVhYWCBNZW50aW9uIHRoZSBcbWVtYmVye2VycmNoZWNrfSBwcm90b2NvbC4uLgotCiBZb3UgY2FuIGFsc28gdXNlIGEgY2FsbGFibGUgUHl0aG9uIG9iamVjdCAoYSBmdW5jdGlvbiBvciBhIGNsYXNzIGZvcgotZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLiAgSXQgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKLVxjb2Rle2ludGVnZXJ9IHRoZSBDIGZ1bmN0aW9uIHJldHVybnMsIGFuZCB0aGUgcmVzdWx0IG9mIHRoaXMgY2FsbCB3aWxsCi1iZSB1c2VkIGFzIHRoZSByZXN1bHQgb2YgeW91ciBmdW5jdGlvbiBjYWxsLiBUaGlzIGlzIHVzZWZ1bCB0byBjaGVjawotZm9yIGVycm9yIHJldHVybiB2YWx1ZXMgYW5kIGF1dG9tYXRpY2FsbHkgcmFpc2UgYW4gZXhjZXB0aW9uOgorZXhhbXBsZSkgYXMgdGhlIFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLCBpZiB0aGUgZm9yZWlnbiBmdW5jdGlvbiByZXR1cm5zCithbiBpbnRlZ2VyLiAgVGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIFxjb2Rle2ludGVnZXJ9IHRoZSBDCitmdW5jdGlvbiByZXR1cm5zLCBhbmQgdGhlIHJlc3VsdCBvZiB0aGlzIGNhbGwgd2lsbCBiZSB1c2VkIGFzIHRoZQorcmVzdWx0IG9mIHlvdXIgZnVuY3Rpb24gY2FsbC4gVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgZm9yIGVycm9yIHJldHVybgordmFsdWVzIGFuZCBhdXRvbWF0aWNhbGx5IHJhaXNlIGFuIGV4Y2VwdGlvbjoKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiBHZXRNb2R1bGVIYW5kbGUgPSB3aW5kbGwua2VybmVsMzIuR2V0TW9kdWxlSGFuZGxlQSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA+Pj4gZGVmIFZhbGlkSGFuZGxlKHZhbHVlKToKQEAgLTU3NSw3ICs2MDksNyBAQAogPj4+IEdldE1vZHVsZUhhbmRsZS5yZXN0eXBlID0gVmFsaWRIYW5kbGUgIyBkb2N0ZXN0OiArV0lORE9XUwogPj4+IEdldE1vZHVsZUhhbmRsZShOb25lKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiA0ODY1MzkyNjQKLT4+PiBHZXRNb2R1bGVIYW5kbGUoInNvbWV0aGluZyBzaWxseSIpICMgZG9jdGVzdDogK1dJTkRPV1MgK0lHTk9SRV9FWENFUFRJT05fREVUQUlMCis+Pj4gR2V0TW9kdWxlSGFuZGxlKCJzb21ldGhpbmcgc2lsbHkiKSAjIGRvY3Rlc3Q6ICtXSU5ET1dTCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMywgaW4gVmFsaWRIYW5kbGUKQEAgLTU4OCw2ICs2MjIsMTAgQEAKIGFuIGV4Y2VwdGlvbi4gIFxjb2Rle1dpbkVycm9yfSB0YWtlcyBhbiBvcHRpb25hbCBlcnJvciBjb2RlIHBhcmFtZXRlciwgaWYKIG5vIG9uZSBpcyB1c2VkLCBpdCBjYWxscyBcZnVuY3Rpb257R2V0TGFzdEVycm9yKCl9IHRvIHJldHJpZXZlIGl0LgogCitQbGVhc2Ugbm90ZSB0aGF0IGEgbXVjaCBtb3JlIHBvd2VyZnVsIGVycm9yIGNoZWNraW5nIG1lY2hhbmlzbSBpcworYXZhaWxhYmxlIHRocm91Z2ggdGhlIFxtZW1iZXJ7ZXJyY2hlY2t9IGF0dHJpYnV0ZTsgc2VlIHRoZSByZWZlcmVuY2UgbWFudWFsCitmb3IgZGV0YWlscy4KKwogCiBcc3Vic3Vic2VjdGlvbntQYXNzaW5nIHBvaW50ZXJzIChvcjogcGFzc2luZyBwYXJhbWV0ZXJzIGJ5IHJlZmVyZW5jZSlcbGFiZWx7Y3R5cGVzLXBhc3NpbmctcG9pbnRlcnN9fQogCkBAIC03NDQsNiArNzgyLDcgQEAKID4+PgogPj4+IHByaW50IGxlbihNeVN0cnVjdCgpLnBvaW50X2FycmF5KQogNAorPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBJbnN0YW5jZXMgYXJlIGNyZWF0ZWQgaW4gdGhlIHVzdWFsIHdheSwgYnkgY2FsbGluZyB0aGUgY2xhc3M6CkBAIC03ODEsMjEgKzgyMCwzMSBAQAogPj4+CiBcZW5ke3ZlcmJhdGltfQogCi1YWFggWFhYIE5vdCBjb3JyZWN0OiB1c2UgaW5kZXhpbmcsIG5vdCB0aGUgY29udGVudHMgYXRyaWJ1dGUKLQogUG9pbnRlciBpbnN0YW5jZXMgaGF2ZSBhIFxjb2Rle2NvbnRlbnRzfSBhdHRyaWJ1dGUgd2hpY2ggcmV0dXJucyB0aGUKLWN0eXBlcycgdHlwZSBwb2ludGVkIHRvLCB0aGUgXGNvZGV7Y3tcX31pbnQoNDIpfSBpbiB0aGUgYWJvdmUgY2FzZToKK29iamVjdCB0byB3aGljaCB0aGUgcG9pbnRlciBwb2ludHMsIHRoZSBcY29kZXtpfSBvYmplY3QgYWJvdmU6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gcGkuY29udGVudHMKIGNfbG9uZyg0MikKID4+PgogXGVuZHt2ZXJiYXRpbX0KIAorTm90ZSB0aGF0IFxjb2Rle2N0eXBlc30gZG9lcyBub3QgaGF2ZSBPT1IgKG9yaWdpbmFsIG9iamVjdCByZXR1cm4pLCBpdAorY29uc3RydWN0cyBhIG5ldywgZXF1aXZhbGVudCBvYmplY3QgZWFjaCB0aW1lIHlvdSByZXRyaWV2ZSBhbgorYXR0cmlidXRlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHBpLmNvbnRlbnRzIGlzIGkKK0ZhbHNlCis+Pj4gcGkuY29udGVudHMgaXMgcGkuY29udGVudHMKK0ZhbHNlCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKIEFzc2lnbmluZyBhbm90aGVyIFxjbGFzc3tje1xffWludH0gaW5zdGFuY2UgdG8gdGhlIHBvaW50ZXIncyBjb250ZW50cwogYXR0cmlidXRlIHdvdWxkIGNhdXNlIHRoZSBwb2ludGVyIHRvIHBvaW50IHRvIHRoZSBtZW1vcnkgbG9jYXRpb24KIHdoZXJlIHRoaXMgaXMgc3RvcmVkOgogXGJlZ2lue3ZlcmJhdGltfQotPj4+IHBpLmNvbnRlbnRzID0gY19pbnQoOTkpCis+Pj4gaSA9IGNfaW50KDk5KQorPj4+IHBpLmNvbnRlbnRzID0gaQogPj4+IHBpLmNvbnRlbnRzCiBjX2xvbmcoOTkpCiA+Pj4KQEAgLTgwOCwyNiArODU3LDIxIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVhYWCBXaGF0IGlzIHRoaXM/Pz8KIEFzc2lnbmluZyB0byBhbiBpbnRlZ2VyIGluZGV4IGNoYW5nZXMgdGhlIHBvaW50ZWQgdG8gdmFsdWU6CiBcYmVnaW57dmVyYmF0aW19Ci0+Pj4gaTIgPSBwaVswXQotPj4+IGkyCi05OQorPj4+IHByaW50IGkKK2NfbG9uZyg5OSkKID4+PiBwaVswXSA9IDIyCi0+Pj4gaTIKLTk5Cis+Pj4gcHJpbnQgaQorY19sb25nKDIyKQogPj4+CiBcZW5ke3ZlcmJhdGltfQogCiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBpbmRleGVzIGRpZmZlcmVudCBmcm9tIDAsIGJ1dCB5b3UgbXVzdCBrbm93Ci13aGF0IHlvdSdyZSBkb2luZyB3aGVuIHlvdSB1c2UgdGhpczogWW91IGFjY2VzcyBvciBjaGFuZ2UgYXJiaXRyYXJ5Ci1tZW1vcnkgbG9jYXRpb25zIHdoZW4geW91IGRvIHRoaXMuIEdlbmVyYWxseSB5b3Ugb25seSB1c2UgdGhpcyBmZWF0dXJlCi1pZiB5b3UgcmVjZWl2ZSBhIHBvaW50ZXIgZnJvbSBhIEMgZnVuY3Rpb24sIGFuZCB5b3UgXGVtcGh7a25vd30gdGhhdCB0aGUKLXBvaW50ZXIgYWN0dWFsbHkgcG9pbnRzIHRvIGFuIGFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgaXRlbS4KLQotCi1cc3Vic3Vic2VjdGlvbntQb2ludGVyIGNsYXNzZXMvdHlwZXNcbGFiZWx7Y3R5cGVzLXBvaW50ZXItY2xhc3Nlc3R5cGVzfX0KK3doYXQgeW91J3JlIGRvaW5nLCBqdXN0IGFzIGluIEM6IFlvdSBjYW4gYWNjZXNzIG9yIGNoYW5nZSBhcmJpdHJhcnkKK21lbW9yeSBsb2NhdGlvbnMuIEdlbmVyYWxseSB5b3Ugb25seSB1c2UgdGhpcyBmZWF0dXJlIGlmIHlvdSByZWNlaXZlIGEKK3BvaW50ZXIgZnJvbSBhIEMgZnVuY3Rpb24sIGFuZCB5b3UgXGVtcGh7a25vd30gdGhhdCB0aGUgcG9pbnRlciBhY3R1YWxseQorcG9pbnRzIHRvIGFuIGFycmF5IGluc3RlYWQgb2YgYSBzaW5nbGUgaXRlbS4KIAogQmVoaW5kIHRoZSBzY2VuZXMsIHRoZSBcY29kZXtwb2ludGVyfSBmdW5jdGlvbiBkb2VzIG1vcmUgdGhhbiBzaW1wbHkKIGNyZWF0ZSBwb2ludGVyIGluc3RhbmNlcywgaXQgaGFzIHRvIGNyZWF0ZSBwb2ludGVyIFxlbXBoe3R5cGVzfSBmaXJzdC4KQEAgLTgzNyw3ICs4ODEsNyBAQAogPj4+IFBJID0gUE9JTlRFUihjX2ludCkKID4+PiBQSQogPGNsYXNzICdjdHlwZXMuTFBfY19sb25nJz4KLT4+PiBQSSg0MikgIyBkb2N0ZXN0OiArSUdOT1JFX0VYQ0VQVElPTl9ERVRBSUwKKz4+PiBQSSg0MikKIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwogVHlwZUVycm9yOiBleHBlY3RlZCBjX2xvbmcgaW5zdGVhZCBvZiBpbnQKQEAgLTg0Niw2ICs4OTAsMTAzIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKK0NhbGxpbmcgdGhlIHBvaW50ZXIgdHlwZSB3aXRob3V0IGFuIGFyZ3VtZW50IGNyZWF0ZXMgYSBcY29kZXtOVUxMfQorcG9pbnRlci4gIFxjb2Rle05VTEx9IHBvaW50ZXJzIGhhdmUgYSBcY29kZXtGYWxzZX0gYm9vbGVhbiB2YWx1ZToKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBudWxsX3B0ciA9IFBPSU5URVIoY19pbnQpKCkKKz4+PiBwcmludCBib29sKG51bGxfcHRyKQorRmFsc2UKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworXGNvZGV7Y3R5cGVzfSBjaGVja3MgZm9yIFxjb2Rle05VTEx9IHdoZW4gZGVyZWZlcmVuY2luZyBwb2ludGVycyAoYnV0CitkZXJlZmVyZW5jaW5nIG5vbi1cY29kZXtOVUxMfSBwb2ludGVycyB3b3VsZCBjcmFzaCBQeXRob24pOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IG51bGxfcHRyWzBdCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uLgorVmFsdWVFcnJvcjogTlVMTCBwb2ludGVyIGFjY2VzcworPj4+CisKKz4+PiBudWxsX3B0clswXSA9IDEyMzQKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4uCitWYWx1ZUVycm9yOiBOVUxMIHBvaW50ZXIgYWNjZXNzCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKKworXHN1YnN1YnNlY3Rpb257VHlwZSBjb252ZXJzaW9uc1xsYWJlbHtjdHlwZXMtdHlwZS1jb252ZXJzaW9uc319CisKK1VzdWFsbHksIGN0eXBlcyBkb2VzIHN0cmljdCB0eXBlIGNoZWNraW5nLiAgVGhpcyBtZWFucywgaWYgeW91IGhhdmUKK1xjb2Rle1BPSU5URVIoY3tcX31pbnQpfSBpbiB0aGUgXG1lbWJlcnthcmd0eXBlc30gbGlzdCBvZiBhIGZ1bmN0aW9uIG9yIGFzIHRoZQordHlwZSBvZiBhIG1lbWJlciBmaWVsZCBpbiBhIHN0cnVjdHVyZSBkZWZpbml0aW9uLCBvbmx5IGluc3RhbmNlcyBvZgorZXhhY3RseSB0aGUgc2FtZSB0eXBlIGFyZSBhY2NlcHRlZC4gIFRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhpcworcnVsZSwgd2hlcmUgY3R5cGVzIGFjY2VwdHMgb3RoZXIgb2JqZWN0cy4gIEZvciBleGFtcGxlLCB5b3UgY2FuIHBhc3MKK2NvbXBhdGlibGUgYXJyYXkgaW5zdGFuY2VzIGluc3RlYWQgb2YgcG9pbnRlciB0eXBlcy4gIFNvLCBmb3IKK1xjb2Rle1BPSU5URVIoY3tcX31pbnQpfSwgY3R5cGVzIGFjY2VwdHMgYW4gYXJyYXkgb2YgY3tcX31pbnQ6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gY2xhc3MgQmFyKFN0cnVjdHVyZSk6CisuLi4gICAgIF9maWVsZHNfID0gWygiY291bnQiLCBjX2ludCksICgidmFsdWVzIiwgUE9JTlRFUihjX2ludCkpXQorLi4uCis+Pj4gYmFyID0gQmFyKCkKKz4+PiBiYXIudmFsdWVzID0gKGNfaW50ICogMykoMSwgMiwgMykKKz4+PiBiYXIuY291bnQgPSAzCis+Pj4gZm9yIGkgaW4gcmFuZ2UoYmFyLmNvdW50KToKKy4uLiAgICAgcHJpbnQgYmFyLnZhbHVlc1tpXQorLi4uCisxCisyCiszCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK1RvIHNldCBhIFBPSU5URVIgdHlwZSBmaWVsZCB0byBcY29kZXtOVUxMfSwgeW91IGNhbiBhc3NpZ24gXGNvZGV7Tm9uZX06CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gYmFyLnZhbHVlcyA9IE5vbmUKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworWFhYIGxpc3Qgb3RoZXIgY29udmVyc2lvbnMuLi4KKworU29tZXRpbWVzIHlvdSBoYXZlIGluc3RhbmNlcyBvZiBpbmNvbXBhdGlibGUgdHlwZXMuICBJbiBcY29kZXtDfSwgeW91IGNhbgorY2FzdCBvbmUgdHlwZSBpbnRvIGFub3RoZXIgdHlwZS4gIFxjb2Rle2N0eXBlc30gcHJvdmlkZXMgYSBcY29kZXtjYXN0fQorZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgaW4gdGhlIHNhbWUgd2F5LiAgVGhlIFxjb2Rle0Jhcn0gc3RydWN0dXJlCitkZWZpbmVkIGFib3ZlIGFjY2VwdHMgXGNvZGV7UE9JTlRFUihje1xffWludCl9IHBvaW50ZXJzIG9yIFxjbGFzc3tje1xffWludH0gYXJyYXlzCitmb3IgaXRzIFxjb2Rle3ZhbHVlc30gZmllbGQsIGJ1dCBub3QgaW5zdGFuY2VzIG9mIG90aGVyIHR5cGVzOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGJhci52YWx1ZXMgPSAoY19ieXRlICogNCkoKQorVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CitUeXBlRXJyb3I6IGluY29tcGF0aWJsZSB0eXBlcywgY19ieXRlX0FycmF5XzQgaW5zdGFuY2UgaW5zdGVhZCBvZiBMUF9jX2xvbmcgaW5zdGFuY2UKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworRm9yIHRoZXNlIGNhc2VzLCB0aGUgXGNvZGV7Y2FzdH0gZnVuY3Rpb24gaXMgaGFuZHkuCisKK1RoZSBcY29kZXtjYXN0fSBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjYXN0IGEgY3R5cGVzIGluc3RhbmNlIGludG8gYQorcG9pbnRlciB0byBhIGRpZmZlcmVudCBjdHlwZXMgZGF0YSB0eXBlLiAgXGNvZGV7Y2FzdH0gdGFrZXMgdHdvCitwYXJhbWV0ZXJzLCBhIGN0eXBlcyBvYmplY3QgdGhhdCBpcyBvciBjYW4gYmUgY29udmVydGVkIHRvIGEgcG9pbnRlcgorb2Ygc29tZSBraW5kLCBhbmQgYSBjdHlwZXMgcG9pbnRlciB0eXBlLiAgSXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZgordGhlIHNlY29uZCBhcmd1bWVudCwgd2hpY2ggcmVmZXJlbmNlcyB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYXMgdGhlCitmaXJzdCBhcmd1bWVudDoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBhID0gKGNfYnl0ZSAqIDQpKCkKKz4+PiBjYXN0KGEsIFBPSU5URVIoY19pbnQpKQorPGN0eXBlcy5MUF9jX2xvbmcgb2JqZWN0IGF0IC4uLj4KKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworU28sIFxjb2Rle2Nhc3R9IGNhbiBiZSB1c2VkIHRvIGFzc2lnbiB0byB0aGUgXGNvZGV7dmFsdWVzfSBmaWVsZCBvZiBcY29kZXtCYXJ9Cit0aGUgc3RydWN0dXJlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGJhciA9IEJhcigpCis+Pj4gYmFyLnZhbHVlcyA9IGNhc3QoKGNfYnl0ZSAqIDQpKCksIFBPSU5URVIoY19pbnQpKQorPj4+IHByaW50IGJhci52YWx1ZXNbMF0KKzAKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKwogCiBcc3Vic3Vic2VjdGlvbntJbmNvbXBsZXRlIFR5cGVzXGxhYmVse2N0eXBlcy1pbmNvbXBsZXRlLXR5cGVzfX0KIApAQCAtMTA1OSw3ICsxMjAwLDEwIEBACiA+Pj4KIFxlbmR7dmVyYmF0aW19CiAKLVNvLCBvdXIgYXJyYXkgc29ydGVkIG5vdzoKK0l0IGlzIHF1aXRlIGludGVyZXN0aW5nIHRvIHNlZSB0aGF0IHRoZSBXaW5kb3dzIFxmdW5jdGlvbntxc29ydH0gZnVuY3Rpb24KK25lZWRzIG1vcmUgY29tcGFyaXNvbnMgdGhhbiB0aGUgbGludXggdmVyc2lvbiEKKworQXMgd2UgY2FuIGVhc2lseSBjaGVjaywgb3VyIGFycmF5IHNvcnRlZCBub3c6CiBcYmVnaW57dmVyYmF0aW19CiA+Pj4gZm9yIGkgaW4gaWE6IHByaW50IGksCiAuLi4KQEAgLTEwNzAsMTQgKzEyMTQsMTQgQEAKIFx0ZXh0YmZ7SW1wb3J0YW50IG5vdGUgZm9yIGNhbGxiYWNrIGZ1bmN0aW9uczp9CiAKIE1ha2Ugc3VyZSB5b3Uga2VlcCByZWZlcmVuY2VzIHRvIENGVU5DVFlQRSBvYmplY3RzIGFzIGxvbmcgYXMgdGhleSBhcmUKLXVzZWQgZnJvbSBDIGNvZGUuIGN0eXBlcyBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQordXNlZCBmcm9tIEMgY29kZS4gXGNvZGV7Y3R5cGVzfSBkb2Vzbid0LCBhbmQgaWYgeW91IGRvbid0LCB0aGV5IG1heSBiZQogZ2FyYmFnZSBjb2xsZWN0ZWQsIGNyYXNoaW5nIHlvdXIgcHJvZ3JhbSB3aGVuIGEgY2FsbGJhY2sgaXMgbWFkZS4KIAogCiBcc3Vic3Vic2VjdGlvbntBY2Nlc3NpbmcgdmFsdWVzIGV4cG9ydGVkIGZyb20gZGxsc1xsYWJlbHtjdHlwZXMtYWNjZXNzaW5nLXZhbHVlcy1leHBvcnRlZC1mcm9tLWRsbHN9fQogCiBTb21ldGltZXMsIGEgZGxsIG5vdCBvbmx5IGV4cG9ydHMgZnVuY3Rpb25zLCBpdCBhbHNvIGV4cG9ydHMKLXZhbHVlcy4gQW4gZXhhbXBsZSBpbiB0aGUgUHl0aG9uIGxpYnJhcnkgaXRzZWxmIGlzIHRoZQordmFyaWFibGVzLiBBbiBleGFtcGxlIGluIHRoZSBQeXRob24gbGlicmFyeSBpdHNlbGYgaXMgdGhlCiBcY29kZXtQeXtcX31PcHRpbWl6ZUZsYWd9LCBhbiBpbnRlZ2VyIHNldCB0byAwLCAxLCBvciAyLCBkZXBlbmRpbmcgb24gdGhlCiBccHJvZ3JhbW9wdHstT30gb3IgXHByb2dyYW1vcHR7LU9PfSBmbGFnIGdpdmVuIG9uIHN0YXJ0dXAuCiAKQEAgLTExNDgsOSArMTI5Miw2IEBACiAoaW5kaWNhdGVkIGJ5IHRoZSBuZWdhdGl2ZSBzaXplIG1lbWJlcikgaXMgbm90IHdlbGxrbm93biwgaXQgaXMgb25seQogdXNlZCBmb3IgdGVzdGluZy4gVHJ5IGl0IG91dCB3aXRoIFxjb2Rle2ltcG9ydCB7XF99e1xffWhlbGxve1xffXtcX319IGZvciBleGFtcGxlLgogCi1YWFggRGVzY3JpYmUgaG93IHRvIGFjY2VzcyB0aGUgXHZhcntjb2RlfSBtZW1iZXIgZmllbGRzLCB3aGljaCBjb250YWluCi10aGUgYnl0ZSBjb2RlIGZvciB0aGUgbW9kdWxlcy4KLQogCiBcc3Vic3Vic2VjdGlvbntTdXJwcmlzZXNcbGFiZWx7Y3R5cGVzLXN1cnByaXNlc319CiAKQEAgLTExNzUsNiArMTMxNiw3IEBACiA+Pj4gcmMuYSwgcmMuYiA9IHJjLmIsIHJjLmEKID4+PiBwcmludCByYy5hLngsIHJjLmEueSwgcmMuYi54LCByYy5iLnkKIDMgNCAzIDQKKz4+PgogXGVuZHt2ZXJiYXRpbX0KIAogSG0uIFdlIGNlcnRhaW5seSBleHBlY3RlZCB0aGUgbGFzdCBzdGF0ZW1lbnQgdG8gcHJpbnQgXGNvZGV7MyA0IDEgMn0uCkBAIC0xMTg0LDYgKzEzMjYsNyBAQAogPj4+IHRlbXAwLCB0ZW1wMSA9IHJjLmIsIHJjLmEKID4+PiByYy5hID0gdGVtcDAKID4+PiByYy5iID0gdGVtcDEKKz4+PgogXGVuZHt2ZXJiYXRpbX0KIAogTm90ZSB0aGF0IFxjb2Rle3RlbXAwfSBhbmQgXGNvZGV7dGVtcDF9IGFyZSBvYmplY3RzIHN0aWxsIHVzaW5nIHRoZSBpbnRlcm5hbApAQCAtMTIxNCw2ICsxMzU3LDUxIEBACiBBY2Nlc3NpbmcgdGhlIGNvbnRlbnRzIGFnYWluIGNvbnN0cnVjdHMgYSBuZXcgUHl0aG9uIGVhY2ggdGltZSEKIAogCitcc3Vic3Vic2VjdGlvbntWYXJpYWJsZS1zaXplZCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy12YXJpYWJsZS1zaXplZC1kYXRhLXR5cGVzfX0KKworXGNvZGV7Y3R5cGVzfSBwcm92aWRlcyBzb21lIHN1cHBvcnQgZm9yIHZhcmlhYmxlLXNpemVkIGFycmF5cyBhbmQKK3N0cnVjdHVyZXMgKHRoaXMgd2FzIGFkZGVkIGluIHZlcnNpb24gMC45LjkuNykuCisKK1RoZSBcY29kZXtyZXNpemV9IGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlc2l6ZSB0aGUgbWVtb3J5IGJ1ZmZlciBvZiBhbgorZXhpc3RpbmcgY3R5cGVzIG9iamVjdC4gIFRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgb2JqZWN0IGFzIGZpcnN0Cithcmd1bWVudCwgYW5kIHRoZSByZXF1ZXN0ZWQgc2l6ZSBpbiBieXRlcyBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50LiAgVGhlCittZW1vcnkgYmxvY2sgY2Fubm90IGJlIG1hZGUgc21hbGxlciB0aGFuIHRoZSBuYXR1cmFsIG1lbW9yeSBibG9jaworc3BlY2lmaWVkIGJ5IHRoZSBvYmplY3RzIHR5cGUsIGEgXGNvZGV7VmFsdWVFcnJvcn0gaXMgcmFpc2VkIGlmIHRoaXMgaXMKK3RyaWVkOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IHNob3J0X2FycmF5ID0gKGNfc2hvcnQgKiA0KSgpCis+Pj4gcHJpbnQgc2l6ZW9mKHNob3J0X2FycmF5KQorOAorPj4+IHJlc2l6ZShzaG9ydF9hcnJheSwgNCkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICAuLi4KK1ZhbHVlRXJyb3I6IG1pbmltdW0gc2l6ZSBpcyA4Cis+Pj4gcmVzaXplKHNob3J0X2FycmF5LCAzMikKKz4+PiBzaXplb2Yoc2hvcnRfYXJyYXkpCiszMgorPj4+IHNpemVvZih0eXBlKHNob3J0X2FycmF5KSkKKzgKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworVGhpcyBpcyBuaWNlIGFuZCBmaW5lLCBidXQgaG93IHdvdWxkIG9uZSBhY2Nlc3MgdGhlIGFkZGl0aW9uYWwKK2VsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGlzIGFycmF5PyAgU2luY2UgdGhlIHR5cGUgc3RpbGwgb25seSBrbm93cworYWJvdXQgNCBlbGVtZW50cywgd2UgZ2V0IGVycm9ycyBhY2Nlc3Npbmcgb3RoZXIgZWxlbWVudHM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gc2hvcnRfYXJyYXlbOl0KK1swLCAwLCAwLCAwXQorPj4+IHNob3J0X2FycmF5WzddCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgICAgLi4uCitJbmRleEVycm9yOiBpbnZhbGlkIGluZGV4Cis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0Fub3RoZXIgd2F5IHRvIHVzZSB2YXJpYWJsZS1zaXplZCBkYXRhIHR5cGVzIHdpdGggXGNvZGV7Y3R5cGVzfSBpcyB0byB1c2UKK3RoZSBkeW5hbWljIG5hdHVyZSBvZiBQeXRob24sIGFuZCAocmUtKWRlZmluZSB0aGUgZGF0YSB0eXBlIGFmdGVyIHRoZQorcmVxdWlyZWQgc2l6ZSBpcyBhbHJlYWR5IGtub3duLCBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcy4KKworCiBcc3Vic3Vic2VjdGlvbntCdWdzLCBUb0RvIGFuZCBub24taW1wbGVtZW50ZWQgdGhpbmdzXGxhYmVse2N0eXBlcy1idWdzLXRvZG8tbm9uLWltcGxlbWVudGVkLXRoaW5nc319CiAKIEVudW1lcmF0aW9uIHR5cGVzIGFyZSBub3QgaW1wbGVtZW50ZWQuIFlvdSBjYW4gZG8gaXQgZWFzaWx5IHlvdXJzZWxmLApAQCAtMTIyNCwzICsxNDEyLDEwMTQgQEAKICUgY29tcGlsZS1jb21tYW5kOiAibWFrZS5iYXQiCiAlIEVuZDogCiAKKworXHN1YnNlY3Rpb257Y3R5cGVzIHJlZmVyZW5jZVxsYWJlbHtjdHlwZXMtY3R5cGVzLXJlZmVyZW5jZX19CisKKworXHN1YnN1YnNlY3Rpb257RmluZGluZyBzaGFyZWQgbGlicmFyaWVzXGxhYmVse2N0eXBlcy1maW5kaW5nLXNoYXJlZC1saWJyYXJpZXN9fQorCitXaGVuIHByb2dyYW1taW5nIGluIGEgY29tcGlsZWQgbGFuZ3VhZ2UsIHNoYXJlZCBsaWJyYXJpZXMgYXJlIGFjY2Vzc2VkCit3aGVuIGNvbXBpbGluZy9saW5raW5nIGEgcHJvZ3JhbSwgYW5kIHdoZW4gdGhlIHByb2dyYW0gaXMgcnVuLgorCitUaGUgcHVycG9zZSBvZiB0aGUgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBmdW5jdGlvbiBpcyB0byBsb2NhdGUgYSBsaWJyYXJ5IGluCithIHdheSBzaW1pbGFyIHRvIHdoYXQgdGhlIGNvbXBpbGVyIGRvZXMgKG9uIHBsYXRmb3JtcyB3aXRoIHNldmVyYWwKK3ZlcnNpb25zIG9mIGEgc2hhcmVkIGxpYnJhcnkgdGhlIG1vc3QgcmVjZW50IHNob3VsZCBiZSBsb2FkZWQpLCB3aGlsZQordGhlIGN0eXBlcyBsaWJyYXJ5IGxvYWRlcnMgYWN0IGxpa2Ugd2hlbiBhIHByb2dyYW0gaXMgcnVuLCBhbmQgY2FsbAordGhlIHJ1bnRpbWUgbG9hZGVyIGRpcmVjdGx5LgorCitUaGUgXGNvZGV7Y3R5cGVzLnV0aWx9IG1vZHVsZSBwcm92aWRlcyBhIGZ1bmN0aW9uIHdoaWNoIGNhbiBoZWxwIHRvCitkZXRlcm1pbmUgdGhlIGxpYnJhcnkgdG8gbG9hZC4KKworXGJlZ2lue2RhdGFkZXNjbml9e2ZpbmRfbGlicmFyeShuYW1lKX0KK1RyeSB0byBmaW5kIGEgbGlicmFyeSBhbmQgcmV0dXJuIGEgcGF0aG5hbWUuICBcdmFye25hbWV9IGlzIHRoZQorbGlicmFyeSBuYW1lIHdpdGhvdXQgYW55IHByZWZpeCBsaWtlIFx2YXJ7bGlifSwgc3VmZml4IGxpa2UgXGNvZGV7LnNvfSwKK1xjb2Rley5keWxpYn0gb3IgdmVyc2lvbiBudW1iZXIgKHRoaXMgaXMgdGhlIGZvcm0gdXNlZCBmb3IgdGhlIHBvc2l4CitsaW5rZXIgb3B0aW9uIFxwcm9ncmFtb3B0ey1sfSkuICBJZiBubyBsaWJyYXJ5IGNhbiBiZSBmb3VuZCwgcmV0dXJucworXGNvZGV7Tm9uZX0uCitcZW5ke2RhdGFkZXNjbml9CisKK1RoZSBleGFjdCBmdW5jdGlvbmFsaXR5IGlzIHN5c3RlbSBkZXBlbmRlbmQuCisKK09uIExpbnV4LCBcY29kZXtmaW5ke1xffWxpYnJhcnl9IHRyaWVzIHRvIHJ1biBleHRlcm5hbCBwcm9ncmFtcworKC9zYmluL2xkY29uZmlnLCBnY2MsIGFuZCBvYmpkdW1wKSB0byBmaW5kIHRoZSBsaWJyYXJ5IGZpbGUuICBJdAorcmV0dXJucyB0aGUgZmlsZW5hbWUgb2YgdGhlIGxpYnJhcnkgZmlsZS4gIEhlcmUgYXJlIHNvbmUgZXhhbXBsZXM6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Cis+Pj4gZmluZF9saWJyYXJ5KCJtIikKKydsaWJtLnNvLjYnCis+Pj4gZmluZF9saWJyYXJ5KCJjIikKKydsaWJjLnNvLjYnCis+Pj4gZmluZF9saWJyYXJ5KCJiejIiKQorJ2xpYmJ6Mi5zby4xLjAnCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK09uIE9TIFgsIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdHJpZXMgc2V2ZXJhbCBwcmVkZWZpbmVkIG5hbWluZyBzY2hlbWVzIGFuZAorcGF0aHMgdG8gbG9jYXRlIHRoZSBsaWJyYXJ5LCBhbmQgcmV0dXJucyBhIGZ1bGwgcGF0aG5hbWUgaWYgc3VjY2Vzc2Z1bGw6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZnJvbSBjdHlwZXMudXRpbCBpbXBvcnQgZmluZF9saWJyYXJ5Cis+Pj4gZmluZF9saWJyYXJ5KCJjIikKKycvdXNyL2xpYi9saWJjLmR5bGliJworPj4+IGZpbmRfbGlicmFyeSgibSIpCisnL3Vzci9saWIvbGlibS5keWxpYicKKz4+PiBmaW5kX2xpYnJhcnkoImJ6MiIpCisnL3Vzci9saWIvbGliYnoyLmR5bGliJworPj4+IGZpbmRfbGlicmFyeSgiQUdMIikKKycvU3lzdGVtL0xpYnJhcnkvRnJhbWV3b3Jrcy9BR0wuZnJhbWV3b3JrL0FHTCcKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworT24gV2luZG93cywgXGNvZGV7ZmluZHtcX31saWJyYXJ5fSBzZWFyY2hlcyBhbG9uZyB0aGUgc3lzdGVtIHNlYXJjaCBwYXRoLAorYW5kIHJldHVybnMgdGhlIGZ1bGwgcGF0aG5hbWUsIGJ1dCBzaW5jZSB0aGVyZSBpcyBubyBwcmVkZWZpbmVkIG5hbWluZworc2NoZW1lIGEgY2FsbCBsaWtlIFxjb2Rle2ZpbmR7XF99bGlicmFyeSgiYyIpfSB3aWxsIGZhaWwgYW5kIHJldHVybgorXGNvZGV7Tm9uZX0uCisKK0lmIHdyYXBwaW5nIGEgc2hhcmVkIGxpYnJhcnkgd2l0aCBcY29kZXtjdHlwZXN9LCBpdCBcZW1waHttYXl9IGJlIGJldHRlciB0bworZGV0ZXJtaW5lIHRoZSBzaGFyZWQgbGlicmFyeSBuYW1lIGF0IGRldmVsb3BtZW50IHR5cGUsIGFuZCBoYXJkY29kZQordGhhdCBpbnRvIHRoZSB3cmFwcGVyIG1vZHVsZSBpbnN0ZWFkIG9mIHVzaW5nIFxjb2Rle2ZpbmR7XF99bGlicmFyeX0gdG8KK2xvY2F0ZSB0aGUgbGlicmFyeSBhdCBydW50aW1lLgorCisKK1xzdWJzdWJzZWN0aW9ue0xvYWRpbmcgc2hhcmVkIGxpYnJhcmllc1xsYWJlbHtjdHlwZXMtbG9hZGluZy1zaGFyZWQtbGlicmFyaWVzfX0KKworVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcyBpbnRvIHRoZSBQeXRob24KK3Byb2Nlc3MuICBPbmUgd2F5IGlzIHRvIGluc3RhbnRpYXRlIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNsYXNzZXM6CisKK1xiZWdpbntjbGFzc2Rlc2N9e0NETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KK0luc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBsb2FkZWQgc2hhcmVkIGxpYnJhcmllcy4KK0Z1bmN0aW9ucyBpbiB0aGVzZSBsaWJyYXJpZXMgdXNlIHRoZSBzdGFuZGFyZCBDIGNhbGxpbmcKK2NvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gXGNvZGV7aW50fS4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtPbGVETEx9e25hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZX0KK1dpbmRvd3Mgb25seTogSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IGxvYWRlZCBzaGFyZWQKK2xpYnJhcmllcywgZnVuY3Rpb25zIGluIHRoZXNlIGxpYnJhcmllcyB1c2UgdGhlIFxjb2Rle3N0ZGNhbGx9CitjYWxsaW5nIGNvbnZlbnRpb24sIGFuZCBhcmUgYXNzdW1lZCB0byByZXR1cm4gdGhlIHdpbmRvd3Mgc3BlY2lmaWMKK1xjbGFzc3tIUkVTVUxUfSBjb2RlLiAgXGNsYXNze0hSRVNVTFR9IHZhbHVlcyBjb250YWluIGluZm9ybWF0aW9uCitzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGNhbGwgZmFpbGVkIG9yIHN1Y2NlZWRlZCwgdG9nZXRoZXIKK3dpdGggYWRkaXRpb25hbCBlcnJvciBjb2RlLiAgSWYgdGhlIHJldHVybiB2YWx1ZSBzaWduYWxzIGEKK2ZhaWx1cmUsIGFuIFxjbGFzc3tXaW5kb3dzRXJyb3J9IGlzIGF1dG9tYXRpY2FsbHkgcmFpc2VkLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e1dpbkRMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQorV2luZG93cyBvbmx5OiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgbG9hZGVkIHNoYXJlZAorbGlicmFyaWVzLCBmdW5jdGlvbnMgaW4gdGhlc2UgbGlicmFyaWVzIHVzZSB0aGUgXGNvZGV7c3RkY2FsbH0KK2NhbGxpbmcgY29udmVudGlvbiwgYW5kIGFyZSBhc3N1bWVkIHRvIHJldHVybiBcY29kZXtpbnR9IGJ5IGRlZmF1bHQuCisKK09uIFdpbmRvd3MgQ0Ugb25seSB0aGUgc3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uIGlzIHVzZWQsIGZvcgorY29udmVuaWVuY2UgdGhlIFxjbGFzc3tXaW5ETEx9IGFuZCBcY2xhc3N7T2xlRExMfSB1c2UgdGhlIHN0YW5kYXJkIGNhbGxpbmcKK2NvbnZlbnRpb24gb24gdGhpcyBwbGF0Zm9ybS4KK1xlbmR7Y2xhc3NkZXNjfQorCitUaGUgUHl0aG9uIEdJTCBpcyByZWxlYXNlZCBiZWZvcmUgY2FsbGluZyBhbnkgZnVuY3Rpb24gZXhwb3J0ZWQgYnkKK3RoZXNlIGxpYnJhcmllcywgYW5kIHJlYXF1aXJlZCBhZnRlcndhcmRzLgorCitcYmVnaW57Y2xhc3NkZXNjfXtQeURMTH17bmFtZSwgbW9kZT1ERUZBVUxUX01PREUsIGhhbmRsZT1Ob25lfQorSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYmVoYXZlIGxpa2UgXGNsYXNze0NETEx9IGluc3RhbmNlcywgZXhjZXB0Cit0aGF0IHRoZSBQeXRob24gR0lMIGlzIFxlbXBoe25vdH0gcmVsZWFzZWQgZHVyaW5nIHRoZSBmdW5jdGlvbiBjYWxsLAorYW5kIGFmdGVyIHRoZSBmdW5jdGlvbiBleGVjdXRpb24gdGhlIFB5dGhvbiBlcnJvciBmbGFnIGlzIGNoZWNrZWQuCitJZiB0aGUgZXJyb3IgZmxhZyBpcyBzZXQsIGEgUHl0aG9uIGV4Y2VwdGlvbiBpcyByYWlzZWQuCisKK1RodXMsIHRoaXMgaXMgb25seSB1c2VmdWwgdG8gY2FsbCBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGRpcmVjdGx5LgorXGVuZHtjbGFzc2Rlc2N9CisKK0FsbCB0aGVzZSBjbGFzc2VzIGNhbiBiZSBpbnN0YW50aWF0ZWQgYnkgY2FsbGluZyB0aGVtIHdpdGggYXQgbGVhc3QKK29uZSBhcmd1bWVudCwgdGhlIHBhdGhuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeS4gIElmIHlvdSBoYXZlIGFuCitleGlzdGluZyBoYW5kbGUgdG8gYW4gYWxyZWFkeSBsb2FkZWQgc2hhcmQgbGlicmFyeSwgaXQgY2FuIGJlIHBhc3NlZAorYXMgdGhlIFxjb2Rle2hhbmRsZX0gbmFtZWQgcGFyYW1ldGVyLCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm1zCitcY29kZXtkbG9wZW59IG9yIFxtZXRob2R7TG9hZExpYnJhcnl9IGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9hZCB0aGUgbGlicmFyeQoraW50byB0aGUgcHJvY2VzcywgYW5kIHRvIGdldCBhIGhhbmRsZSB0byBpdC4KKworVGhlIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgaG93IHRoZSBsaWJyYXJ5IGlzCitsb2FkZWQuICBGb3IgZGV0YWlscywgY29uc3VsdCB0aGUgXGNvZGV7ZGxvcGVuKDMpfSBtYW5wYWdlLCBvbiBXaW5kb3dzLAorXHZhcnttb2RlfSBpcyBpZ25vcmVkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UlRMRF9HTE9CQUx9CitGbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGZsYWcKK2lzIG5vdCBhdmFpbGFibGUsIGl0IGlzIGRlZmluZWQgYXMgdGhlIGludGVnZXIgemVyby4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e1JUTERfTE9DQUx9CitGbGFnIHRvIHVzZSBhcyBcdmFye21vZGV9IHBhcmFtZXRlci4gIE9uIHBsYXRmb3JtcyB3aGVyZSB0aGlzIGlzIG5vdAorYXZhaWxhYmxlLCBpdCBpcyB0aGUgc2FtZSBhcyBcdmFye1JUTER7XF99R0xPQkFMfS4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e0RFRkFVTFRfTU9ERX0KK1RoZSBkZWZhdWx0IG1vZGUgd2hpY2ggaXMgdXNlZCB0byBsb2FkIHNoYXJlZCBsaWJyYXJpZXMuICBPbiBPU1gKKzEwLjMsIHRoaXMgaXMgXHZhcntSVExEe1xffUdMT0JBTH0sIG90aGVyd2lzZSBpdCBpcyB0aGUgc2FtZSBhcworXHZhcntSVExEe1xffUxPQ0FMfS4KK1xlbmR7ZGF0YWRlc2NuaX0KKworSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgaGF2ZSBubyBwdWJsaWMgbWV0aG9kcywgaG93ZXZlcgorXG1ldGhvZHt7XF99e1xffWdldGF0dHJ7XF99e1xffX0gYW5kIFxtZXRob2R7e1xffXtcX31nZXRpdGVte1xffXtcX319IGhhdmUgc3BlY2lhbCBiZWhhdmlvdXI6IGZ1bmN0aW9ucworZXhwb3J0ZWQgYnkgdGhlIHNoYXJlZCBsaWJyYXJ5IGNhbiBiZSBhY2Nlc3NlZCBhcyBhdHRyaWJ1dGVzIG9mIGJ5CitpbmRleC4gIFBsZWFzZSBub3RlIHRoYXQgYm90aCBcbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBhbmQgXG1ldGhvZHt7XF99e1xffWdldGl0ZW17XF99e1xffX0KK2NhY2hlIHRoZWlyIHJlc3VsdCwgc28gY2FsbGluZyB0aGVtIHJlcGVhdGVkbHkgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKK2VhY2ggdGltZS4KKworVGhlIGZvbGxvd2luZyBwdWJsaWMgYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlLCB0aGVpciBuYW1lIHN0YXJ0cyB3aXRoCithbiB1bmRlcnNjb3JlIHRvIG5vdCBjbGFzaCB3aXRoIGV4cG9ydGVkIGZ1bmN0aW9uIG5hbWVzOgorCitcYmVnaW57bWVtYmVyZGVzY317X2hhbmRsZX0KK1RoZSBzeXN0ZW0gaGFuZGxlIHVzZWQgdG8gYWNjZXNzIHRoZSBsaWJyYXJ5LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317X25hbWV9CitUaGUgbmFtZSBvZiB0aGUgbGlicmFyeSBwYXNzZWQgaW4gdGhlIGNvbnRydWN0b3IuCitcZW5ke21lbWJlcmRlc2N9CisKK1NoYXJlZCBsaWJyYXJpZXMgY2FuIGFsc28gYmUgbG9hZGVkIGJ5IHVzaW5nIG9uZSBvZiB0aGUgcHJlZmFicmljYXRlZAorb2JqZWN0cywgd2hpY2ggYXJlIGluc3RhbmNlcyBvZiB0aGUgXGNsYXNze0xpYnJhcnlMb2FkZXJ9IGNsYXNzLCBlaXRoZXIgYnkKK2NhbGxpbmcgdGhlIFxtZXRob2R7TG9hZExpYnJhcnl9IG1ldGhvZCwgb3IgYnkgcmV0cmlldmluZyB0aGUgbGlicmFyeSBhcworYXR0cmlidXRlIG9mIHRoZSBsb2FkZXIgaW5zdGFuY2UuCisKK1xiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9CitDbGFzcyB3aGljaCBsb2FkcyBzaGFyZWQgbGlicmFyaWVzLiAgXGNvZGV7ZGxsdHlwZX0gc2hvdWxkIGJlIG9uZQorb2YgdGhlIFxjbGFzc3tDRExMfSwgXGNsYXNze1B5RExMfSwgXGNsYXNze1dpbkRMTH0sIG9yIFxjbGFzc3tPbGVETEx9IHR5cGVzLgorCitcbWV0aG9ke3tcX317XF99Z2V0YXR0cntcX317XF99fSBoYXMgc3BlY2lhbCBiZWhhdmlvdXI6IEl0IGFsbG93cyB0byBsb2FkIGEgc2hhcmVkCitsaWJyYXJ5IGJ5IGFjY2Vzc2luZyBpdCBhcyBhdHRyaWJ1dGUgb2YgYSBsaWJyYXJ5IGxvYWRlcgoraW5zdGFuY2UuICBUaGUgcmVzdWx0IGlzIGNhY2hlZCwgc28gcmVwZWF0ZWQgYXR0cmlidXRlIGFjY2Vzc2VzCityZXR1cm4gdGhlIHNhbWUgbGlicmFyeSBlYWNoIHRpbWUuCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e0xvYWRMaWJyYXJ5fXtuYW1lfQorTG9hZCBhIHNoYXJlZCBsaWJyYXJ5IGludG8gdGhlIHByb2Nlc3MgYW5kIHJldHVybiBpdC4gIFRoaXMgbWV0aG9kCithbHdheXMgcmV0dXJucyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbGlicmFyeS4KK1xlbmR7bWV0aG9kZGVzY30KKworVGhlc2UgcHJlZmFicmljYXRlZCBsaWJyYXJ5IGxvYWRlcnMgYXJlIGF2YWlsYWJsZToKKworXGJlZ2lue2RhdGFkZXNjbml9e2NkbGx9CitDcmVhdGVzIFxjbGFzc3tDRExMfSBpbnN0YW5jZXMuCitcZW5ke2RhdGFkZXNjbml9CisKK1xiZWdpbntkYXRhZGVzY25pfXt3aW5kbGx9CitXaW5kb3dzIG9ubHk6IENyZWF0ZXMgXGNsYXNze1dpbkRMTH0gaW5zdGFuY2VzLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17b2xlZGxsfQorV2luZG93cyBvbmx5OiBDcmVhdGVzIFxjbGFzc3tPbGVETEx9IGluc3RhbmNlcy4KK1xlbmR7ZGF0YWRlc2NuaX0KKworXGJlZ2lue2RhdGFkZXNjbml9e3B5ZGxsfQorQ3JlYXRlcyBcY2xhc3N7UHlETEx9IGluc3RhbmNlcy4KK1xlbmR7ZGF0YWRlc2NuaX0KKworRm9yIGFjY2Vzc2luZyB0aGUgQyBQeXRob24gYXBpIGRpcmVjdGx5LCBhIHJlYWR5LXRvLXVzZSBQeXRob24gc2hhcmVkCitsaWJyYXJ5IG9iamVjdCBpcyBhdmFpbGFibGU6CisKK1xiZWdpbntkYXRhZGVzY25pfXtweXRob25hcGl9CitBbiBpbnN0YW5jZSBvZiBcY2xhc3N7UHlETEx9IHRoYXQgZXhwb3NlcyBQeXRob24gQyBhcGkgZnVuY3Rpb25zIGFzCithdHRyaWJ1dGVzLiAgTm90ZSB0aGF0IGFsbCB0aGVzZSBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gcmV0dXJuCitpbnRlZ2Vycywgd2hpY2ggaXMgb2YgY291cnNlIG5vdCBhbHdheXMgdGhlIHRydXRoLCBzbyB5b3UgaGF2ZSB0bworYXNzaWduIHRoZSBjb3JyZWN0IFxtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlIHRvIHVzZSB0aGVzZSBmdW5jdGlvbnMuCitcZW5ke2RhdGFkZXNjbml9CisKKworXHN1YnN1YnNlY3Rpb257Rm9yZWlnbiBmdW5jdGlvbnNcbGFiZWx7Y3R5cGVzLWZvcmVpZ24tZnVuY3Rpb25zfX0KKworQXMgZXhwbGFpbmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBmb3JlaWduIGZ1bmN0aW9ucyBjYW4gYmUKK2FjY2Vzc2VkIGFzIGF0dHJpYnV0ZXMgb2YgbG9hZGVkIHNoYXJlZCBsaWJyYXJpZXMuICBUaGUgZnVuY3Rpb24KK29iamVjdHMgY3JlYXRlZCBpbiB0aGlzIHdheSBieSBkZWZhdWx0IGFjY2VwdCBhbnkgbnVtYmVyIG9mIGFyZ3VtZW50cywKK2FjY2VwdCBhbnkgY3R5cGVzIGRhdGEgaW5zdGFuY2VzIGFzIGFyZ3VtZW50cywgYW5kIHJldHVybiB0aGUgZGVmYXVsdAorcmVzdWx0IHR5cGUgc3BlY2lmaWVkIGJ5IHRoZSBsaWJyYXJ5IGxvYWRlci4gIFRoZXkgYXJlIGluc3RhbmNlcyBvZiBhCitwcml2YXRlIGNsYXNzOgorCitcYmVnaW57Y2xhc3NkZXNjKn17X0Z1bmNQdHJ9CitCYXNlIGNsYXNzIGZvciBDIGNhbGxhYmxlIGZvcmVpZ24gZnVuY3Rpb25zLgorXGVuZHtjbGFzc2Rlc2MqfQorCitJbnN0YW5jZXMgb2YgZm9yZWlnbiBmdW5jdGlvbnMgYXJlIGFsc28gQyBjb21wYXRpYmxlIGRhdGEgdHlwZXM7IHRoZXkKK3JlcHJlc2VudCBDIGZ1bmN0aW9uIHBvaW50ZXJzLgorCitUaGlzIGJlaGF2aW91ciBjYW4gYmUgY3VzdG9taXplZCBieSBhc3NpZ25pbmcgdG8gc3BlY2lhbCBhdHRyaWJ1dGVzIG9mCit0aGUgZm9yZWlnbiBmdW5jdGlvbiBvYmplY3QuCisKK1xiZWdpbnttZW1iZXJkZXNjfXtyZXN0eXBlfQorQXNzaWduIGEgY3R5cGVzIHR5cGUgdG8gc3BlY2lmeSB0aGUgcmVzdWx0IHR5cGUgb2YgdGhlIGZvcmVpZ24KK2Z1bmN0aW9uLiAgVXNlIFxjb2Rle05vbmV9IGZvciBcY29kZXt2b2lkfSBhIGZ1bmN0aW9uIG5vdCByZXR1cm5pbmcKK2FueXRoaW5nLgorCitJdCBpcyBwb3NzaWJsZSB0byBhc3NpZ24gYSBjYWxsYWJsZSBQeXRob24gb2JqZWN0IHRoYXQgaXMgbm90IGEKK2N0eXBlcyB0eXBlLCBpbiB0aGlzIGNhc2UgdGhlIGZ1bmN0aW9uIGlzIGFzc3VtZWQgdG8gcmV0dXJuIGFuCitpbnRlZ2VyLCBhbmQgdGhlIGNhbGxhYmxlIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhpcyBpbnRlZ2VyLAorYWxsb3dpbmcgdG8gZG8gZnVydGhlciBwcm9jZXNzaW5nIG9yIGVycm9yIGNoZWNraW5nLiAgVXNpbmcgdGhpcworaXMgZGVwcmVjYXRlZCwgZm9yIG1vcmUgZmxleGlibGUgcG9zdHByb2Nlc3Npbmcgb3IgZXJyb3IgY2hlY2tpbmcKK3VzZSBhIGN0eXBlcyBkYXRhIHR5cGUgYXMgXG1lbWJlcntyZXN0eXBlfSBhbmQgYXNzaWduIGEgY2FsbGFibGUgdG8gdGhlCitcbWVtYmVye2VycmNoZWNrfSBhdHRyaWJ1dGUuCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXthcmd0eXBlc30KK0Fzc2lnbiBhIHR1cGxlIG9mIGN0eXBlcyB0eXBlcyB0byBzcGVjaWZ5IHRoZSBhcmd1bWVudCB0eXBlcyB0aGF0Cit0aGUgZnVuY3Rpb24gYWNjZXB0cy4gIEZ1bmN0aW9ucyB1c2luZyB0aGUgXGNvZGV7c3RkY2FsbH0gY2FsbGluZworY29udmVudGlvbiBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzCit0aGUgbGVuZ3RoIG9mIHRoaXMgdHVwbGU7IGZ1bmN0aW9ucyB1c2luZyB0aGUgQyBjYWxsaW5nIGNvbnZlbnRpb24KK2FjY2VwdCBhZGRpdGlvbmFsLCB1bnNwZWNpZmllZCBhcmd1bWVudHMgYXMgd2VsbC4KKworV2hlbiBhIGZvcmVpZ24gZnVuY3Rpb24gaXMgY2FsbGVkLCBlYWNoIGFjdHVhbCBhcmd1bWVudCBpcyBwYXNzZWQKK3RvIHRoZSBcbWV0aG9ke2Zyb217XF99cGFyYW19IGNsYXNzIG1ldGhvZCBvZiB0aGUgaXRlbXMgaW4gdGhlCitcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZSwgdGhpcyBtZXRob2QgYWxsb3dzIHRvIGFkYXB0IHRoZSBhY3R1YWwKK2FyZ3VtZW50IHRvIGFuIG9iamVjdCB0aGF0IHRoZSBmb3JlaWduIGZ1bmN0aW9uIGFjY2VwdHMuICBGb3IKK2V4YW1wbGUsIGEgXGNsYXNze2N7XF99Y2hhcntcX31wfSBpdGVtIGluIHRoZSBcbWVtYmVye2FyZ3R5cGVzfSB0dXBsZSB3aWxsCitjb252ZXJ0IGEgdW5pY29kZSBzdHJpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IGludG8gYW4gYnl0ZSBzdHJpbmcKK3VzaW5nIGN0eXBlcyBjb252ZXJzaW9uIHJ1bGVzLgorCitOZXc6IEl0IGlzIG5vdyBwb3NzaWJsZSB0byBwdXQgaXRlbXMgaW4gYXJndHlwZXMgd2hpY2ggYXJlIG5vdAorY3R5cGVzIHR5cGVzLCBidXQgZWFjaCBpdGVtIG11c3QgaGF2ZSBhIFxtZXRob2R7ZnJvbXtcX31wYXJhbX0gbWV0aG9kCit3aGljaCByZXR1cm5zIGEgdmFsdWUgdXNhYmxlIGFzIGFyZ3VtZW50IChpbnRlZ2VyLCBzdHJpbmcsIGN0eXBlcworaW5zdGFuY2UpLiAgVGhpcyBhbGxvd3MgdG8gZGVmaW5lIGFkYXB0ZXJzIHRoYXQgY2FuIGFkYXB0IGN1c3RvbQorb2JqZWN0cyBhcyBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZXJyY2hlY2t9CitBc3NpZ24gYSBQeXRob24gZnVuY3Rpb24gb3IgYW5vdGhlciBjYWxsYWJsZSB0byB0aGlzIGF0dHJpYnV0ZS4KK1RoZSBjYWxsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aXRoIHRocmVlIG9yIG1vcmUgYXJndW1lbnRzOgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2NuaX17Y2FsbGFibGV9e3Jlc3VsdCwgZnVuYywgYXJndW1lbnRzfQorXGNvZGV7cmVzdWx0fSBpcyB3aGF0IHRoZSBmb3JlaWduIGZ1bmN0aW9uIHJldHVybnMsIGFzIHNwZWNpZmllZCBieSB0aGUKK1xtZW1iZXJ7cmVzdHlwZX0gYXR0cmlidXRlLgorCitcY29kZXtmdW5jfSBpcyB0aGUgZm9yZWlnbiBmdW5jdGlvbiBvYmplY3QgaXRzZWxmLCB0aGlzIGFsbG93cyB0bworcmV1c2UgdGhlIHNhbWUgY2FsbGFibGUgb2JqZWN0IHRvIGNoZWNrIG9yIHBvc3Rwcm9jZXNzIHRoZSByZXN1bHRzCitvZiBzZXZlcmFsIGZ1bmN0aW9ucy4KKworXGNvZGV7YXJndW1lbnRzfSBpcyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgb3JpZ2luYWxseQorcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBjYWxsLCB0aGlzIGFsbG93cyB0byBzcGVjaWFsaXplIHRoZQorYmVoYXZpb3VyIG9uIHRoZSBhcmd1bWVudHMgdXNlZC4KKworVGhlIG9iamVjdCB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlCitmb3JlaWduIGZ1bmN0aW9uIGNhbGwsIGJ1dCBpdCBjYW4gYWxzbyBjaGVjayB0aGUgcmVzdWx0IHZhbHVlIGFuZAorcmFpc2UgYW4gZXhjZXB0aW9uIGlmIHRoZSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgZmFpbGVkLgorXGVuZHtmdW5jZGVzY25pfQorCitcYmVnaW57ZXhjZGVzY317QXJndW1lbnRFcnJvcigpfQorVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgY2Fubm90Citjb252ZXJ0IG9uZSBvZiB0aGUgcGFzc2VkIGFyZ3VtZW50cy4KK1xlbmR7ZXhjZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntGdW5jdGlvbiBwcm90b3R5cGVzXGxhYmVse2N0eXBlcy1mdW5jdGlvbi1wcm90b3R5cGVzfX0KKworRm9yZWlnbiBmdW5jdGlvbnMgY2FuIGFsc28gYmUgY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGZ1bmN0aW9uCitwcm90b3R5cGVzLiAgRnVuY3Rpb24gcHJvdG90eXBlcyBhcmUgc2ltaWxhciB0byBmdW5jdGlvbiBwcm90b3R5cGVzIGluCitDOyB0aGV5IGRlc2NyaWJlIGEgZnVuY3Rpb24gKHJldHVybiB0eXBlLCBhcmd1bWVudCB0eXBlcywgY2FsbGluZworY29udmVudGlvbikgd2l0aG91dCBkZWZpbmluZyBhbiBpbXBsZW1lbnRhdGlvbi4gIFRoZSBmYWN0b3J5CitmdW5jdGlvbnMgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgZGVzaXJlZCByZXN1bHQgdHlwZSBhbmQgdGhlIGFyZ3VtZW50Cit0eXBlcyBvZiB0aGUgZnVuY3Rpb24uCisKK1xiZWdpbntmdW5jZGVzY317Q0ZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9CitUaGUgcmV0dXJuZWQgZnVuY3Rpb24gcHJvdG90eXBlIGNyZWF0ZXMgZnVuY3Rpb25zIHRoYXQgdXNlIHRoZQorc3RhbmRhcmQgQyBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGUgZnVuY3Rpb24gd2lsbCByZWxlYXNlIHRoZSBHSUwKK2R1cmluZyB0aGUgY2FsbC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317V0lORlVOQ1RZUEV9e3Jlc3R5cGUsICphcmd0eXBlc30KK1dpbmRvd3Mgb25seTogVGhlIHJldHVybmVkIGZ1bmN0aW9uIHByb3RvdHlwZSBjcmVhdGVzIGZ1bmN0aW9ucwordGhhdCB1c2UgdGhlIFxjb2Rle3N0ZGNhbGx9IGNhbGxpbmcgY29udmVudGlvbiwgZXhjZXB0IG9uIFdpbmRvd3MgQ0UKK3doZXJlIFxmdW5jdGlvbntXSU5GVU5DVFlQRX0gaXMgdGhlIHNhbWUgYXMgXGZ1bmN0aW9ue0NGVU5DVFlQRX0uICBUaGUgZnVuY3Rpb24KK3dpbGwgcmVsZWFzZSB0aGUgR0lMIGR1cmluZyB0aGUgY2FsbC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317UFlGVU5DVFlQRX17cmVzdHlwZSwgKmFyZ3R5cGVzfQorVGhlIHJldHVybmVkIGZ1bmN0aW9uIHByb3RvdHlwZSBjcmVhdGVzIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUKK1B5dGhvbiBjYWxsaW5nIGNvbnZlbnRpb24uICBUaGUgZnVuY3Rpb24gd2lsbCBcZW1waHtub3R9IHJlbGVhc2UgdGhlCitHSUwgZHVyaW5nIHRoZSBjYWxsLgorXGVuZHtmdW5jZGVzY30KKworRnVuY3Rpb24gcHJvdG90eXBlcyBjcmVhdGVkIGJ5IHRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBjYW4gYmUKK2luc3RhbnRpYXRlZCBpbiBkaWZmZXJlbnQgd2F5cywgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIGFuZCBudW1iZXIgb2YKK3RoZSBwYXJhbWV0ZXJzIGluIHRoZSBjYWxsLgorCitcYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXthZGRyZXNzfQorUmV0dXJucyBhIGZvcmVpZ24gZnVuY3Rpb24gYXQgdGhlIHNwZWNpZmllZCBhZGRyZXNzLgorXGVuZHtmdW5jZGVzY25pfQorCitcYmVnaW57ZnVuY2Rlc2NuaX17cHJvdG90eXBlfXtjYWxsYWJsZX0KK0NyZWF0ZSBhIEMgY2FsbGFibGUgZnVuY3Rpb24gKGEgY2FsbGJhY2sgZnVuY3Rpb24pIGZyb20gYSBQeXRob24KK1xjb2Rle2NhbGxhYmxlfS4KK1xlbmR7ZnVuY2Rlc2NuaX0KKworXGJlZ2lue2Z1bmNkZXNjbml9e3Byb3RvdHlwZX17ZnVuY19zcGVjXG9wdGlvbmFseywgcGFyYW1mbGFnc319CitSZXR1cm5zIGEgZm9yZWlnbiBmdW5jdGlvbiBleHBvcnRlZCBieSBhIHNoYXJlZCBsaWJyYXJ5LgorXGNvZGV7ZnVuY3tcX31zcGVjfSBtdXN0IGJlIGEgMi10dXBsZSBcY29kZXsobmFtZXtcX31vcntcX31vcmRpbmFsLCBsaWJyYXJ5KX0uCitUaGUgZmlyc3QgaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZXhwb3J0ZWQgZnVuY3Rpb24gYXMgc3RyaW5nLCBvcgordGhlIG9yZGluYWwgb2YgdGhlIGV4cG9ydGVkIGZ1bmN0aW9uIGFzIHNtYWxsIGludGVnZXIuICBUaGUgc2Vjb25kCitpdGVtIGlzIHRoZSBzaGFyZWQgbGlicmFyeSBpbnN0YW5jZS4KK1xlbmR7ZnVuY2Rlc2NuaX0KKworXGJlZ2lue2Z1bmNkZXNjbml9e3Byb3RvdHlwZX17dnRibF9pbmRleCwgbmFtZVxvcHRpb25hbHssIHBhcmFtZmxhZ3Ncb3B0aW9uYWx7LCBpaWR9fX0KK1JldHVybnMgYSBmb3JlaWduIGZ1bmN0aW9uIHRoYXQgd2lsbCBjYWxsIGEgQ09NIG1ldGhvZC4KK1xjb2Rle3Z0Ymx7XF99aW5kZXh9IGlzIHRoZSBpbmRleCBpbnRvIHRoZSB2aXJ0dWFsIGZ1bmN0aW9uIHRhYmxlLCBhCitzbWFsbCBub25uZWdhdGl2ZSBpbnRlZ2VyLiBcdmFye25hbWV9IGlzIG5hbWUgb2YgdGhlIENPTSBtZXRob2QuCitcdmFye2lpZH0gaXMgYW4gb3B0aW9uYWwgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlIGlkZW50aWZpZXIgd2hpY2gKK2lzIHVzZWQgaW4gZXh0ZW5kZWQgZXJyb3IgcmVwb3J0aW5nLgorCitDT00gbWV0aG9kcyB1c2UgYSBzcGVjaWFsIGNhbGxpbmcgY29udmVudGlvbjogVGhleSByZXF1aXJlIGEKK3BvaW50ZXIgdG8gdGhlIENPTSBpbnRlcmZhY2UgYXMgZmlyc3QgYXJndW1lbnQsIGluIGFkZGl0aW9uIHRvCit0aG9zZSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHNwZWNpZmllZCBpbiB0aGUgXG1lbWJlcnthcmd0eXBlc30gdHVwbGUuCitcZW5ke2Z1bmNkZXNjbml9CisKK1RoZSBvcHRpb25hbCBcdmFye3BhcmFtZmxhZ3N9IHBhcmFtZXRlciBjcmVhdGVzIGZvcmVpZ24gZnVuY3Rpb24KK3dyYXBwZXJzIHdpdGggbXVjaCBtb3JlIGZ1bmN0aW9uYWxpdHkgdGhhbiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkCithYm92ZS4KKworXHZhcntwYXJhbWZsYWdzfSBtdXN0IGJlIGEgdHVwbGUgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIFxtZW1iZXJ7YXJndHlwZXN9LgorCitFYWNoIGl0ZW0gaW4gdGhpcyB0dXBsZSBjb250YWlucyBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IGEKK3BhcmFtZXRlciwgaXQgbXVzdCBiZSBhIHR1cGxlIGNvbnRhaW5pbmcgMSwgMiwgb3IgMyBpdGVtcy4KKworVGhlIGZpcnN0IGl0ZW0gaXMgYW4gaW50ZWdlciBjb250YWluaW5nIGZsYWdzIGZvciB0aGUgcGFyYW1ldGVyOgorCitcYmVnaW57ZGF0YWRlc2NuaX17MX0KK1NwZWNpZmllcyBhbiBpbnB1dCBwYXJhbWV0ZXIgdG8gdGhlIGZ1bmN0aW9uLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17Mn0KK091dHB1dCBwYXJhbWV0ZXIuICBUaGUgZm9yZWlnbiBmdW5jdGlvbiBmaWxscyBpbiBhIHZhbHVlLgorXGVuZHtkYXRhZGVzY25pfQorCitcYmVnaW57ZGF0YWRlc2NuaX17NH0KK0lucHV0IHBhcmFtZXRlciB3aGljaCBkZWZhdWx0cyB0byB0aGUgaW50ZWdlciB6ZXJvLgorXGVuZHtkYXRhZGVzY25pfQorCitUaGUgb3B0aW9uYWwgc2Vjb25kIGl0ZW0gaXMgdGhlIHBhcmFtZXRlciBuYW1lIGFzIHN0cmluZy4gIElmIHRoaXMgaXMKK3NwZWNpZmllZCwgdGhlIGZvcmVpZ24gZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCB3aXRoIG5hbWVkIHBhcmFtZXRlcnMuCisKK1RoZSBvcHRpb25hbCB0aGlyZCBpdGVtIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gd3JhcCB0aGUgV2luZG93cyBcY29kZXtNZXNzYWdlQm94QX0KK2Z1bmN0aW9uIHNvIHRoYXQgaXQgc3VwcG9ydHMgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBuYW1lZCBhcmd1bWVudHMuCitUaGUgQyBkZWNsYXJhdGlvbiBmcm9tIHRoZSB3aW5kb3dzIGhlYWRlciBmaWxlIGlzIHRoaXM6CitcYmVnaW57dmVyYmF0aW19CitXSU5VU0VSQVBJIGludCBXSU5BUEkKK01lc3NhZ2VCb3hBKAorICAgIEhXTkQgaFduZCAsCisgICAgTFBDU1RSIGxwVGV4dCwKKyAgICBMUENTVFIgbHBDYXB0aW9uLAorICAgIFVJTlQgdVR5cGUpOworXGVuZHt2ZXJiYXRpbX0KKworSGVyZSBpcyB0aGUgd3JhcHBpbmcgd2l0aCBcY29kZXtjdHlwZXN9OgorXGJlZ2lue3F1b3RlfQorXGJlZ2lue3ZlcmJhdGltfT4+PiBmcm9tIGN0eXBlcyBpbXBvcnQgY19pbnQsIFdJTkZVTkNUWVBFLCB3aW5kbGwKKz4+PiBmcm9tIGN0eXBlcy53aW50eXBlcyBpbXBvcnQgSFdORCwgTFBDU1RSLCBVSU5UCis+Pj4gcHJvdG90eXBlID0gV0lORlVOQ1RZUEUoY19pbnQsIEhXTkQsIExQQ1NUUiwgTFBDU1RSLCBjX3VpbnQpCis+Pj4gcGFyYW1mbGFncyA9ICgxLCAiaHduZCIsIDApLCAoMSwgInRleHQiLCAiSGkiKSwgKDEsICJjYXB0aW9uIiwgTm9uZSksICgxLCAiZmxhZ3MiLCAwKQorPj4+IE1lc3NhZ2VCb3ggPSBwcm90b3R5cGUoKCJNZXNzYWdlQm94QSIsIHdpbmRsbC51c2VyMzIpLCBwYXJhbWZsYWdzKQorPj4+XGVuZHt2ZXJiYXRpbX0KK1xlbmR7cXVvdGV9CisKK1RoZSBNZXNzYWdlQm94IGZvcmVpZ24gZnVuY3Rpb24gY2FuIG5vdyBiZSBjYWxsZWQgaW4gdGhlc2Ugd2F5czoKK1xiZWdpbnt2ZXJiYXRpbX0KKz4+PiBNZXNzYWdlQm94KCkKKz4+PiBNZXNzYWdlQm94KHRleHQ9IlNwYW0sIHNwYW0sIHNwYW0iKQorPj4+IE1lc3NhZ2VCb3goZmxhZ3M9MiwgdGV4dD0iZm9vIGJhciIpCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0Egc2Vjb25kIGV4YW1wbGUgZGVtb25zdHJhdGVzIG91dHB1dCBwYXJhbWV0ZXJzLiAgVGhlIHdpbjMyCitcY29kZXtHZXRXaW5kb3dSZWN0fSBmdW5jdGlvbiByZXRyaWV2ZXMgdGhlIGRpbWVuc2lvbnMgb2YgYSBzcGVjaWZpZWQKK3dpbmRvdyBieSBjb3B5aW5nIHRoZW0gaW50byBcY29kZXtSRUNUfSBzdHJ1Y3R1cmUgdGhhdCB0aGUgY2FsbGVyIGhhcyB0bworc3VwcGx5LiAgSGVyZSBpcyB0aGUgQyBkZWNsYXJhdGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KK1dJTlVTRVJBUEkgQk9PTCBXSU5BUEkKK0dldFdpbmRvd1JlY3QoCisgICAgIEhXTkQgaFduZCwKKyAgICAgTFBSRUNUIGxwUmVjdCk7CitcZW5ke3ZlcmJhdGltfQorCitIZXJlIGlzIHRoZSB3cmFwcGluZyB3aXRoIFxjb2Rle2N0eXBlc306CitcYmVnaW57cXVvdGV9CitcYmVnaW57dmVyYmF0aW19Pj4+IGZyb20gY3R5cGVzIGltcG9ydCBQT0lOVEVSLCBXSU5GVU5DVFlQRSwgd2luZGxsCis+Pj4gZnJvbSBjdHlwZXMud2ludHlwZXMgaW1wb3J0IEJPT0wsIEhXTkQsIFJFQ1QKKz4+PiBwcm90b3R5cGUgPSBXSU5GVU5DVFlQRShCT09MLCBIV05ELCBQT0lOVEVSKFJFQ1QpKQorPj4+IHBhcmFtZmxhZ3MgPSAoMSwgImh3bmQiKSwgKDIsICJscHJlY3QiKQorPj4+IEdldFdpbmRvd1JlY3QgPSBwcm90b3R5cGUoKCJHZXRXaW5kb3dSZWN0Iiwgd2luZGxsLnVzZXIzMiksIHBhcmFtZmxhZ3MpCis+Pj5cZW5ke3ZlcmJhdGltfQorXGVuZHtxdW90ZX0KKworRnVuY3Rpb25zIHdpdGggb3V0cHV0IHBhcmFtZXRlcnMgd2lsbCBhdXRvbWF0aWNhbGx5IHJldHVybiB0aGUgb3V0cHV0CitwYXJhbWV0ZXIgdmFsdWUgaWYgdGhlcmUgaXMgYSBzaW5nbGUgb25lLCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCitvdXRwdXQgcGFyYW1ldGVyIHZhbHVlcyB3aGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lLCBzbyB0aGUKK0dldFdpbmRvd1JlY3QgZnVuY3Rpb24gbm93IHJldHVybnMgYSBSRUNUIGluc3RhbmNlLCB3aGVuIGNhbGxlZC4KKworT3V0cHV0IHBhcmFtZXRlcnMgY2FuIGJlIGNvbWJpbmVkIHdpdGggdGhlIFxtZW1iZXJ7ZXJyY2hlY2t9IHByb3RvY29sIHRvIGRvCitmdXJ0aGVyIG91dHB1dCBwcm9jZXNzaW5nIGFuZCBlcnJvciBjaGVja2luZy4gIFRoZSB3aW4zMgorXGNvZGV7R2V0V2luZG93UmVjdH0gYXBpIGZ1bmN0aW9uIHJldHVybnMgYSBcY29kZXtCT09MfSB0byBzaWduYWwgc3VjY2VzcyBvcgorZmFpbHVyZSwgc28gdGhpcyBmdW5jdGlvbiBjb3VsZCBkbyB0aGUgZXJyb3IgY2hlY2tpbmcsIGFuZCByYWlzZXMgYW4KK2V4Y2VwdGlvbiB3aGVuIHRoZSBhcGkgY2FsbCBmYWlsZWQ6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZGVmIGVycmNoZWNrKHJlc3VsdCwgZnVuYywgYXJncyk6CisuLi4gICAgIGlmIG5vdCByZXN1bHQ6CisuLi4gICAgICAgICByYWlzZSBXaW5FcnJvcigpCisuLi4gICAgIHJldHVybiBhcmdzCis+Pj4gR2V0V2luZG93UmVjdC5lcnJjaGVjayA9IGVycmNoZWNrCis+Pj4KK1xlbmR7dmVyYmF0aW19CisKK0lmIHRoZSBcbWVtYmVye2VycmNoZWNrfSBmdW5jdGlvbiByZXR1cm5zIHRoZSBhcmd1bWVudCB0dXBsZSBpdCByZWNlaXZlcwordW5jaGFuZ2VkLCBcY29kZXtjdHlwZXN9IGNvbnRpbnVlcyB0aGUgbm9ybWFsIHByb2Nlc3NpbmcgaXQgZG9lcyBvbiB0aGUKK291dHB1dCBwYXJhbWV0ZXJzLiAgSWYgeW91IHdhbnQgdG8gcmV0dXJuIGEgdHVwbGUgb2Ygd2luZG93Citjb29yZGluYXRlcyBpbnN0ZWFkIG9mIGEgXGNvZGV7UkVDVH0gaW5zdGFuY2UsIHlvdSBjYW4gcmV0cmlldmUgdGhlCitmaWVsZHMgaW4gdGhlIGZ1bmN0aW9uIGFuZCByZXR1cm4gdGhlbSBpbnN0ZWFkLCB0aGUgbm9ybWFsIHByb2Nlc3NpbmcKK3dpbGwgbm8gbG9uZ2VyIHRha2UgcGxhY2U6CitcYmVnaW57dmVyYmF0aW19Cis+Pj4gZGVmIGVycmNoZWNrKHJlc3VsdCwgZnVuYywgYXJncyk6CisuLi4gICAgIGlmIG5vdCByZXN1bHQ6CisuLi4gICAgICAgICByYWlzZSBXaW5FcnJvcigpCisuLi4gICAgIHJjID0gYXJnc1sxXQorLi4uICAgICByZXR1cm4gcmMubGVmdCwgcmMudG9wLCByYy5ib3R0b20sIHJjLnJpZ2h0Cis+Pj4KKz4+PiBHZXRXaW5kb3dSZWN0LmVycmNoZWNrID0gZXJyY2hlY2sKKz4+PgorXGVuZHt2ZXJiYXRpbX0KKworCitcc3Vic3Vic2VjdGlvbntVdGlsaXR5IGZ1bmN0aW9uc1xsYWJlbHtjdHlwZXMtdXRpbGl0eS1mdW5jdGlvbnN9fQorCitcYmVnaW57ZnVuY2Rlc2N9e2FkZHJlc3NvZn17b2JqfQorUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgbWVtb3J5IGJ1ZmZlciBhcyBpbnRlZ2VyLiAgXGNvZGV7b2JqfSBtdXN0CitiZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthbGlnbm1lbnR9e29ial9vcl90eXBlfQorUmV0dXJucyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIGN0eXBlcyB0eXBlLgorXGNvZGV7b2Jqe1xffW9ye1xffXR5cGV9IG11c3QgYmUgYSBjdHlwZXMgdHlwZSBvciBpbnN0YW5jZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317YnlyZWZ9e29ian0KK1JldHVybnMgYSBsaWdodC13ZWlnaHQgcG9pbnRlciB0byBcY29kZXtvYmp9LCB3aGljaCBtdXN0IGJlIGFuCitpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLiBUaGUgcmV0dXJuZWQgb2JqZWN0IGNhbiBvbmx5IGJlIHVzZWQgYXMKK2EgZm9yZWlnbiBmdW5jdGlvbiBjYWxsIHBhcmFtZXRlci4gSXQgYmVoYXZlcyBzaW1pbGFyIHRvCitcY29kZXtwb2ludGVyKG9iail9LCBidXQgdGhlIGNvbnN0cnVjdGlvbiBpcyBhIGxvdCBmYXN0ZXIuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2Nhc3R9e29iaiwgdHlwZX0KK1RoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB0aGUgY2FzdCBvcGVyYXRvciBpbiBDLiBJdCByZXR1cm5zIGEKK25ldyBpbnN0YW5jZSBvZiBcY29kZXt0eXBlfSB3aGljaCBwb2ludHMgdG8gdGhlIHNhbWUgbWVtb3J5IGJsb2NrIGFzCitcY29kZXtvYmp9LiBcY29kZXt0eXBlfSBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBhbmQgXGNvZGV7b2JqfSBtdXN0IGJlIGFuCitvYmplY3QgdGhhdCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBwb2ludGVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtjcmVhdGVfc3RyaW5nX2J1ZmZlcn17aW5pdF9vcl9zaXplXG9wdGlvbmFseywgc2l6ZX19CitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBtdXRhYmxlIGNoYXJhY3RlciBidWZmZXIuIFRoZSByZXR1cm5lZAorb2JqZWN0IGlzIGEgY3R5cGVzIGFycmF5IG9mIFxjbGFzc3tje1xffWNoYXJ9LgorCitcY29kZXtpbml0e1xffW9ye1xffXNpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YKK3RoZSBhcnJheSwgb3IgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5CitpdGVtcy4KKworSWYgYSBzdHJpbmcgaXMgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50LCB0aGUgYnVmZmVyIGlzIG1hZGUgb25lCitpdGVtIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRoZSBsYXN0IGVsZW1lbnQKK2luIHRoZSBhcnJheSBpcyBhIE5VTCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuIEFuIGludGVnZXIgY2FuIGJlCitwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZQorYXJyYXkgaWYgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KKworSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHVuaWNvZGUgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50bworYW4gOC1iaXQgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317Y3JlYXRlX3VuaWNvZGVfYnVmZmVyfXtpbml0X29yX3NpemVcb3B0aW9uYWx7LCBzaXplfX0KK1RoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG11dGFibGUgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyLiBUaGUKK3JldHVybmVkIG9iamVjdCBpcyBhIGN0eXBlcyBhcnJheSBvZiBcY2xhc3N7Y3tcX313Y2hhcn0uCisKK1xjb2Rle2luaXR7XF99b3J7XF99c2l6ZX0gbXVzdCBiZSBhbiBpbnRlZ2VyIHdoaWNoIHNwZWNpZmllcyB0aGUgc2l6ZSBvZgordGhlIGFycmF5LCBvciBhIHVuaWNvZGUgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplCit0aGUgYXJyYXkgaXRlbXMuCisKK0lmIGEgdW5pY29kZSBzdHJpbmcgaXMgc3BlY2lmaWVkIGFzIGZpcnN0IGFyZ3VtZW50LCB0aGUgYnVmZmVyIGlzCittYWRlIG9uZSBpdGVtIGxhcmdlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBzbyB0aGF0IHRoZQorbGFzdCBlbGVtZW50IGluIHRoZSBhcnJheSBpcyBhIE5VTCB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIuIEFuCitpbnRlZ2VyIGNhbiBiZSBwYXNzZWQgYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5Cit0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgaWYgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUKK3VzZWQuCisKK0lmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSA4LWJpdCBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCBpbnRvIGFuCit1bmljb2RlIHN0cmluZyBhY2NvcmRpbmcgdG8gY3R5cGVzIGNvbnZlcnNpb24gcnVsZXMuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e0RsbENhblVubG9hZE5vd317fQorV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50CitpbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQorRGxsQ2FuVW5sb2FkTm93IGZ1bmN0aW9uIHRoYXQgdGhlIHtcX31jdHlwZXMgZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtEbGxHZXRDbGFzc09iamVjdH17fQorV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50CitpbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQorRGxsR2V0Q2xhc3NPYmplY3QgZnVuY3Rpb24gdGhhdCB0aGUgXGNvZGV7e1xffWN0eXBlc30gZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtGb3JtYXRFcnJvcn17XG9wdGlvbmFse2NvZGV9fQorV2luZG93cyBvbmx5OiBSZXR1cm5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gSWYKK25vIGVycm9yIGNvZGUgaXMgc3BlY2lmaWVkLCB0aGUgbGFzdCBlcnJvciBjb2RlIGlzIHVzZWQgYnkgY2FsbGluZwordGhlIFdpbmRvd3MgYXBpIGZ1bmN0aW9uIEdldExhc3RFcnJvci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317R2V0TGFzdEVycm9yfXt9CitXaW5kb3dzIG9ubHk6IFJldHVybnMgdGhlIGxhc3QgZXJyb3IgY29kZSBzZXQgYnkgV2luZG93cyBpbiB0aGUKK2NhbGxpbmcgdGhyZWFkLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXttZW1tb3ZlfXtkc3QsIHNyYywgY291bnR9CitTYW1lIGFzIHRoZSBzdGFuZGFyZCBDIG1lbW1vdmUgbGlicmFyeSBmdW5jdGlvbjogY29waWVzIFx2YXJ7Y291bnR9CitieXRlcyBmcm9tIFxjb2Rle3NyY30gdG8gXHZhcntkc3R9LiBcdmFye2RzdH0gYW5kIFxjb2Rle3NyY30gbXVzdCBiZQoraW50ZWdlcnMgb3IgY3R5cGVzIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e21lbXNldH17ZHN0LCBjLCBjb3VudH0KK1NhbWUgYXMgdGhlIHN0YW5kYXJkIEMgbWVtc2V0IGxpYnJhcnkgZnVuY3Rpb246IGZpbGxzIHRoZSBtZW1vcnkKK2Jsb2NrIGF0IGFkZHJlc3MgXHZhcntkc3R9IHdpdGggXHZhcntjb3VudH0gYnl0ZXMgb2YgdmFsdWUKK1x2YXJ7Y30uIFx2YXJ7ZHN0fSBtdXN0IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyBhbiBhZGRyZXNzLCBvciBhCitjdHlwZXMgaW5zdGFuY2UuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1BPSU5URVJ9e3R5cGV9CitUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlcyBhbmQgcmV0dXJucyBhIG5ldyBjdHlwZXMgcG9pbnRlcgordHlwZS4gUG9pbnRlciB0eXBlcyBhcmUgY2FjaGVkIGFuIHJldXNlZCBpbnRlcm5hbGx5LCBzbyBjYWxsaW5nCit0aGlzIGZ1bmN0aW9uIHJlcGVhdGVkbHkgaXMgY2hlYXAuIHR5cGUgbXVzdCBiZSBhIGN0eXBlcyB0eXBlLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtwb2ludGVyfXtvYmp9CitUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcG9pbnRlciBpbnN0YW5jZSwgcG9pbnRpbmcgdG8KK1xjb2Rle29ian0uIFRoZSByZXR1cm5lZCBvYmplY3QgaXMgb2YgdGhlIHR5cGUgUE9JTlRFUih0eXBlKG9iaikpLgorCitOb3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBhIGZvcmVpZ24KK2Z1bmN0aW9uIGNhbGwsIHlvdSBzaG91bGQgdXNlIFxjb2Rle2J5cmVmKG9iail9IHdoaWNoIGlzIG11Y2ggZmFzdGVyLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtyZXNpemV9e29iaiwgc2l6ZX0KK1RoaXMgZnVuY3Rpb24gcmVzaXplcyB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBvZiBvYmosIHdoaWNoCittdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgY3R5cGVzIHR5cGUuIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlCit0aGUgYnVmZmVyIHNtYWxsZXIgdGhhbiB0aGUgbmF0aXZlIHNpemUgb2YgdGhlIG9iamVjdHMgdHlwZSwgYXMKK2dpdmVuIGJ5IHNpemVvZih0eXBlKG9iaikpLCBidXQgaXQgaXMgcG9zc2libGUgdG8gZW5sYXJnZSB0aGUKK2J1ZmZlci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0X2NvbnZlcnNpb25fbW9kZX17ZW5jb2RpbmcsIGVycm9yc30KK1RoaXMgZnVuY3Rpb24gc2V0cyB0aGUgcnVsZXMgdGhhdCBjdHlwZXMgb2JqZWN0cyB1c2Ugd2hlbgorY29udmVydGluZyBiZXR3ZWVuIDgtYml0IHN0cmluZ3MgYW5kIHVuaWNvZGUgc3RyaW5ncy4gZW5jb2RpbmcKK211c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyBhbiBlbmNvZGluZywgbGlrZSBcY29kZXsndXRmLTgnfSBvcgorXGNvZGV7J21iY3MnfSwgZXJyb3JzIG11c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcKK29uIGVuY29kaW5nL2RlY29kaW5nIGVycm9ycy4gRXhhbXBsZXMgb2YgcG9zc2libGUgdmFsdWVzIGFyZQorXGNvZGV7InN0cmljdCJ9LCBcY29kZXsicmVwbGFjZSJ9LCBvciBcY29kZXsiaWdub3JlIn0uCisKK1xjb2Rle3NldHtcX31jb252ZXJzaW9ue1xffW1vZGV9IHJldHVybnMgYSAyLXR1cGxlIGNvbnRhaW5pbmcgdGhlIHByZXZpb3VzCitjb252ZXJzaW9uIHJ1bGVzLiBPbiB3aW5kb3dzLCB0aGUgaW5pdGlhbCBjb252ZXJzaW9uIHJ1bGVzIGFyZQorXGNvZGV7KCdtYmNzJywgJ2lnbm9yZScpfSwgb24gb3RoZXIgc3lzdGVtcyBcY29kZXsoJ2FzY2lpJywgJ3N0cmljdCcpfS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2l6ZW9mfXtvYmpfb3JfdHlwZX0KK1JldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBjdHlwZXMgdHlwZSBvciBpbnN0YW5jZSBtZW1vcnkKK2J1ZmZlci4gRG9lcyB0aGUgc2FtZSBhcyB0aGUgQyBcY29kZXtzaXplb2YoKX0gZnVuY3Rpb24uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3N0cmluZ19hdH17YWRkcmVzc1xvcHRpb25hbHssIHNpemV9fQorVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgbWVtb3J5IGFkZHJlc3MKK2FkZHJlc3MuIElmIHNpemUgaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHNpemUsIG90aGVyd2lzZSB0aGUKK3N0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317V2luRXJyb3J9e2NvZGU9Tm9uZSwgZGVzY3I9Tm9uZX0KK1dpbmRvd3Mgb25seTogdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgd29yc3QtbmFtZWQgdGhpbmcgaW4KK2N0eXBlcy4gSXQgY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBXaW5kb3dzRXJyb3IuIElmIFx2YXJ7Y29kZX0gaXMgbm90CitzcGVjaWZpZWQsIFxjb2Rle0dldExhc3RFcnJvcn0gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKK2NvZGUuIElmIFxjb2Rle2Rlc2NyfSBpcyBub3Qgc3BjaWZpZWQsIFxmdW5jdGlvbntGb3JtYXRFcnJvcn0gaXMgY2FsbGVkIHRvCitnZXQgYSB0ZXh0dWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317d3N0cmluZ19hdH17YWRkcmVzc30KK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nIHN0YXJ0aW5nIGF0IG1lbW9yeQorYWRkcmVzcyBcY29kZXthZGRyZXNzfSBhcyB1bmljb2RlIHN0cmluZy4gSWYgXGNvZGV7c2l6ZX0gaXMgc3BlY2lmaWVkLAoraXQgaXMgdXNlZCBhcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgb2YgdGhlIHN0cmluZywgb3RoZXJ3aXNlCit0aGUgc3RyaW5nIGlzIGFzc3VtZWQgdG8gYmUgemVyby10ZXJtaW5hdGVkLgorXGVuZHtmdW5jZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntEYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1kYXRhLXR5cGVzfX0KKworXGJlZ2lue2NsYXNzZGVzYyp9e19DRGF0YX0KK1RoaXMgbm9uLXB1YmxpYyBjbGFzcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3Mgb2YgYWxsIGN0eXBlcyBkYXRhCit0eXBlcy4gIEFtb25nIG90aGVyIHRoaW5ncywgYWxsIGN0eXBlcyB0eXBlIGluc3RhbmNlcyBjb250YWluIGEKK21lbW9yeSBibG9jayB0aGF0IGhvbGQgQyBjb21wYXRpYmxlIGRhdGE7IHRoZSBhZGRyZXNzIG9mIHRoZQorbWVtb3J5IGJsb2NrIGlzIHJldHVybmVkIGJ5IHRoZSBcY29kZXthZGRyZXNzb2YoKX0gaGVscGVyIGZ1bmN0aW9uLgorQW5vdGhlciBpbnN0YW5jZSB2YXJpYWJsZSBpcyBleHBvc2VkIGFzIFxtZW1iZXJ7e1xffW9iamVjdHN9OyB0aGlzCitjb250YWlucyBvdGhlciBQeXRob24gb2JqZWN0cyB0aGF0IG5lZWQgdG8gYmUga2VwdCBhbGl2ZSBpbiBjYXNlCit0aGUgbWVtb3J5IGJsb2NrIGNvbnRhaW5zIHBvaW50ZXJzLgorXGVuZHtjbGFzc2Rlc2MqfQorCitDb21tb24gbWV0aG9kcyBvZiBjdHlwZXMgZGF0YSB0eXBlcywgdGhlc2UgYXJlIGFsbCBjbGFzcyBtZXRob2RzICh0bworYmUgZXhhY3QsIHRoZXkgYXJlIG1ldGhvZHMgb2YgdGhlIG1ldGFjbGFzcyk6CisKK1xiZWdpbnttZXRob2RkZXNjfXtmcm9tX2FkZHJlc3N9e2FkZHJlc3N9CitUaGlzIG1ldGhvZCByZXR1cm5zIGEgY3R5cGVzIHR5cGUgaW5zdGFuY2UgdXNpbmcgdGhlIG1lbW9yeQorc3BlY2lmaWVkIGJ5IGFkZHJlc3Mgd2hpY2ggbXVzdCBiZSBhbiBpbnRlZ2VyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZnJvbV9wYXJhbX17b2JqfQorVGhpcyBtZXRob2QgYWRhcHRzIG9iaiB0byBhIGN0eXBlcyB0eXBlLiAgSXQgaXMgY2FsbGVkIHdpdGggdGhlCithY3R1YWwgb2JqZWN0IHVzZWQgaW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwsIHdoZW4gdGhlIHR5cGUgaXMKK3ByZXNlbnQgaW4gdGhlIGZvcmVpZ24gZnVuY3Rpb25zIFxtZW1iZXJ7YXJndHlwZXN9IHR1cGxlOyBpdCBtdXN0CityZXR1cm4gYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgYXMgZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuCisKK0FsbCBjdHlwZXMgZGF0YSB0eXBlcyBoYXZlIGEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzCitjbGFzc21ldGhvZCwgbm9ybWFsbHkgaXQgcmV0dXJucyBcY29kZXtvYmp9IGlmIHRoYXQgaXMgYW4gaW5zdGFuY2Ugb2YKK3RoZSB0eXBlLiAgU29tZSB0eXBlcyBhY2NlcHQgb3RoZXIgb2JqZWN0cyBhcyB3ZWxsLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317aW5fZGxsfXtuYW1lLCBsaWJyYXJ5fQorVGhpcyBtZXRob2QgcmV0dXJucyBhIGN0eXBlcyB0eXBlIGluc3RhbmNlIGV4cG9ydGVkIGJ5IGEgc2hhcmVkCitsaWJyYXJ5LiBcdmFye25hbWV9IGlzIHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdGhhdCBleHBvcnRzIHRoZSBkYXRhLAorXGNvZGV7bGlicmFyeX0gaXMgdGhlIGxvYWRlZCBzaGFyZWQgbGlicmFyeS4KK1xlbmR7bWV0aG9kZGVzY30KKworQ29tbW9uIGluc3RhbmNlIHZhcmlhYmxlcyBvZiBjdHlwZXMgZGF0YSB0eXBlczoKKworXGJlZ2lue21lbWJlcmRlc2N9e19iX2Jhc2VffQorU29tZXRpbWVzIGN0eXBlcyBkYXRhIGluc3RhbmNlcyBkbyBub3Qgb3duIHRoZSBtZW1vcnkgYmxvY2sgdGhleQorY29udGFpbiwgaW5zdGVhZCB0aGV5IHNoYXJlIHBhcnQgb2YgdGhlIG1lbW9yeSBibG9jayBvZiBhIGJhc2UKK29iamVjdC4gIFRoZSBcbWVtYmVye3tcX31ie1xffWJhc2V7XF99fSByZWFkb25seSBtZW1iZXIgaXMgdGhlIHJvb3QgY3R5cGVzCitvYmplY3QgdGhhdCBvd25zIHRoZSBtZW1vcnkgYmxvY2suCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtfYl9uZWVkc2ZyZWVffQorVGhpcyByZWFkb25seSB2YXJpYWJsZSBpcyB0cnVlIHdoZW4gdGhlIGN0eXBlcyBkYXRhIGluc3RhbmNlIGhhcworYWxsb2NhdGVkIHRoZSBtZW1vcnkgYmxvY2sgaXRzZWxmLCBmYWxzZSBvdGhlcndpc2UuCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtfb2JqZWN0c30KK1RoaXMgbWVtYmVyIGlzIGVpdGhlciBcY29kZXtOb25lfSBvciBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBQeXRob24KK29iamVjdHMgdGhhdCBuZWVkIHRvIGJlIGtlcHQgYWxpdmUgc28gdGhhdCB0aGUgbWVtb3J5IGJsb2NrCitjb250ZW50cyBpcyBrZXB0IHZhbGlkLiAgVGhpcyBvYmplY3QgaXMgb25seSBleHBvc2VkIGZvcgorZGVidWdnaW5nOyBuZXZlciBtb2RpZnkgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGljdGlvbmFyeS4KK1xlbmR7bWVtYmVyZGVzY30KKworCitcc3Vic3Vic2VjdGlvbntGdW5kYW1lbnRhbCBkYXRhIHR5cGVzXGxhYmVse2N0eXBlcy1mdW5kYW1lbnRhbC1kYXRhLXR5cGVzfX0KKworXGJlZ2lue2NsYXNzZGVzYyp9e19TaW1wbGVDRGF0YX0KK1RoaXMgbm9uLXB1YmxpYyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBvZiBhbGwgZnVuZGFtZW50YWwgY3R5cGVzCitkYXRhIHR5cGVzLiBJdCBpcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24KK2F0dHJpYnV0ZXMgb2YgdGhlIGZ1bmRhbWVudGFsIGN0eXBlcyBkYXRhIHR5cGVzLiAgXGNvZGV7e1xffVNpbXBsZUNEYXRhfQoraXMgYSBzdWJjbGFzcyBvZiBcY29kZXt7XF99Q0RhdGF9LCBzbyBpdCBpbmhlcml0cyB0aGVpciBtZXRob2RzIGFuZAorYXR0cmlidXRlcy4KK1xlbmR7Y2xhc3NkZXNjKn0KKworSW5zdGFuY2VzIGhhdmUgYSBzaW5nbGUgYXR0cmlidXRlOgorCitcYmVnaW57bWVtYmVyZGVzY317dmFsdWV9CitUaGlzIGF0dHJpYnV0ZSBjb250YWlucyB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBpbnN0YW5jZS4gRm9yCitpbnRlZ2VyIGFuZCBwb2ludGVyIHR5cGVzLCBpdCBpcyBhbiBpbnRlZ2VyLCBmb3IgY2hhcmFjdGVyIHR5cGVzLAoraXQgaXMgYSBzaW5nbGUgY2hhcmFjdGVyIHN0cmluZywgZm9yIGNoYXJhY3RlciBwb2ludGVyIHR5cGVzIGl0CitpcyBhIFB5dGhvbiBzdHJpbmcgb3IgdW5pY29kZSBzdHJpbmcuCisKK1doZW4gdGhlIFxjb2Rle3ZhbHVlfSBhdHRyaWJ1dGUgaXMgcmV0cmlldmVkIGZyb20gYSBjdHlwZXMgaW5zdGFuY2UsCit1c3VhbGx5IGEgbmV3IG9iamVjdCBpcyByZXR1cm5lZCBlYWNoIHRpbWUuICBcY29kZXtjdHlwZXN9IGRvZXMgXGVtcGh7bm90fQoraW1wbGVtZW50IG9yaWdpbmFsIG9iamVjdCByZXR1cm4sIGFsd2F5cyBhIG5ldyBvYmplY3QgaXMKK2NvbnN0cnVjdGVkLiAgVGhlIHNhbWUgaXMgdHJ1ZSBmb3IgYWxsIG90aGVyIGN0eXBlcyBvYmplY3QKK2luc3RhbmNlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworRnVuZGFtZW50YWwgZGF0YSB0eXBlcywgd2hlbiByZXR1cm5lZCBhcyBmb3JlaWduIGZ1bmN0aW9uIGNhbGwKK3Jlc3VsdHMsIG9yLCBmb3IgZXhhbXBsZSwgYnkgcmV0cmlldmluZyBzdHJ1Y3R1cmUgZmllbGQgbWVtYmVycyBvcgorYXJyYXkgaXRlbXMsIGFyZSB0cmFuc3BhcmVudGx5IGNvbnZlcnRlZCB0byBuYXRpdmUgUHl0aG9uIHR5cGVzLiAgSW4KK290aGVyIHdvcmRzLCBpZiBhIGZvcmVpZ24gZnVuY3Rpb24gaGFzIGEgXG1lbWJlcntyZXN0eXBlfSBvZiBcY2xhc3N7Y3tcX31jaGFye1xffXB9LAoreW91IHdpbGwgYWx3YXlzIHJlY2VpdmUgYSBQeXRob24gc3RyaW5nLCBcZW1waHtub3R9IGEgXGNsYXNze2N7XF99Y2hhcntcX31wfQoraW5zdGFuY2UuCisKK1N1YmNsYXNzZXMgb2YgZnVuZGFtZW50YWwgZGF0YSB0eXBlcyBkbyBcZW1waHtub3R9IGluaGVyaXQgdGhpcyBiZWhhdmlvdXIuCitTbywgaWYgYSBmb3JlaWduIGZ1bmN0aW9ucyBcbWVtYmVye3Jlc3R5cGV9IGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze2N7XF99dm9pZHtcX31wfSwKK3lvdSB3aWxsIHJlY2VpdmUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBzdWJjbGFzcyBmcm9tIHRoZSBmdW5jdGlvbiBjYWxsLgorT2YgY291cnNlLCB5b3UgY2FuIGdldCB0aGUgdmFsdWUgb2YgdGhlIHBvaW50ZXIgYnkgYWNjZXNzaW5nIHRoZQorXGNvZGV7dmFsdWV9IGF0dHJpYnV0ZS4KKworVGhlc2UgYXJlIHRoZSBmdW5kYW1lbnRhbCBjdHlwZXMgZGF0YSB0eXBlczoKKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfYnl0ZX0KK1JlcHJlc2VudHMgdGhlIEMgc2lnbmVkIGNoYXIgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcworc21hbGwgaW50ZWdlci4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlcgoraW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2NoYXJ9CitSZXByZXNlbnRzIHRoZSBDIGNoYXIgZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhIHNpbmdsZQorY2hhcmFjdGVyLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbCBzdHJpbmcgaW5pdGlhbGl6ZXIsCit0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgbXVzdCBiZSBleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2NoYXJfcH0KK1JlcHJlc2VudHMgdGhlIEMgY2hhciAqIGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCit6ZXJvLXRlcm1pbmF0ZWQgc3RyaW5nLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBpbnRlZ2VyCithZGRyZXNzLCBvciBhIHN0cmluZy4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfZG91YmxlfQorUmVwcmVzZW50cyB0aGUgQyBkb3VibGUgZGF0YXR5cGUuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBmbG9hdCBpbml0aWFsaXplci4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfZmxvYXR9CitSZXByZXNlbnRzIHRoZSBDIGRvdWJsZSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnR9CitSZXByZXNlbnRzIHRoZSBDIHNpZ25lZCBpbnQgZGF0YXR5cGUuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLiBPbgorcGxhdGZvcm1zIHdoZXJlIFxjb2Rle3NpemVvZihpbnQpID09IHNpemVvZihsb25nKX0gaXQgaXMgYW4gYWxpYXMgdG8KK1xjbGFzc3tje1xffWxvbmd9LgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnQ4fQorUmVwcmVzZW50cyB0aGUgQyA4LWJpdCBcY29kZXtzaWduZWQgaW50fSBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffWJ5dGV9LgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y19pbnQxNn0KK1JlcHJlc2VudHMgdGhlIEMgMTYtYml0IHNpZ25lZCBpbnQgZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMgZm9yCitcY2xhc3N7Y3tcX31zaG9ydH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDMyfQorUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffWludH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2ludDY0fQorUmVwcmVzZW50cyB0aGUgQyA2NC1iaXQgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuIFVzdWFsbHkgYW4gYWxpYXMKK2ZvciBcY2xhc3N7Y3tcX31sb25nbG9uZ30uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2xvbmd9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3NpZ25lZCBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX2xvbmdsb25nfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaWduZWQgbG9uZyBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMKK2FuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Nob3J0fQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaWduZWQgc2hvcnR9IGRhdGF0eXBlLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgorb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2Nfc2l6ZV90fQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXtzaXple1xffXR9IGRhdGF0eXBlLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y191Ynl0ZX0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgY2hhcn0gZGF0YXR5cGUsIGl0IGludGVycHJldHMgdGhlCit2YWx1ZSBhcyBzbWFsbCBpbnRlZ2VyLiBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBvcHRpb25hbAoraW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludH0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgaW50fSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuIE9uCitwbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBpdCBpcyBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVsb25nfS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDh9CitSZXByZXNlbnRzIHRoZSBDIDgtYml0IHVuc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVieXRlfS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDE2fQorUmVwcmVzZW50cyB0aGUgQyAxNi1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgorXGNsYXNze2N7XF99dXNob3J0fS4KK1xlbmR7Y2xhc3NkZXNjKn0KKworXGJlZ2lue2NsYXNzZGVzYyp9e2NfdWludDMyfQorUmVwcmVzZW50cyB0aGUgQyAzMi1iaXQgdW5zaWduZWQgaW50IGRhdGF0eXBlLiBVc3VhbGx5IGFuIGFsaWFzIGZvcgorXGNsYXNze2N7XF99dWludH0uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3VpbnQ2NH0KK1JlcHJlc2VudHMgdGhlIEMgNjQtYml0IHVuc2lnbmVkIGludCBkYXRhdHlwZS4gVXN1YWxseSBhbiBhbGlhcyBmb3IKK1xjbGFzc3tje1xffXVsb25nbG9uZ30uCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Vsb25nfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXt1bnNpZ25lZCBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3Vsb25nbG9uZ30KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dW5zaWduZWQgbG9uZyBsb25nfSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yCithY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzCitkb25lLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17Y191c2hvcnR9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3Vuc2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KK29wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXI7IG5vIG92ZXJmbG93IGNoZWNraW5nIGlzIGRvbmUuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3ZvaWRfcH0KK1JlcHJlc2VudHMgdGhlIEMgXGNvZGV7dm9pZCAqfSB0eXBlLiBUaGUgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYXMKK2ludGVnZXIuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIgaW5pdGlhbGl6ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3djaGFyfQorUmVwcmVzZW50cyB0aGUgQyBcY29kZXt3Y2hhcntcX310fSBkYXRhdHlwZSwgYW5kIGludGVycHJldHMgdGhlIHZhbHVlIGFzIGEKK3NpbmdsZSBjaGFyYWN0ZXIgdW5pY29kZSBzdHJpbmcuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuCitvcHRpb25hbCBzdHJpbmcgaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlCitleGFjdGx5IG9uZSBjaGFyYWN0ZXIuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtjX3djaGFyX3B9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle3djaGFye1xffXQgKn0gZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvCithIHplcm8tdGVybWluYXRlZCB3aWRlIGNoYXJhY3RlciBzdHJpbmcuIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCithbiBpbnRlZ2VyIGFkZHJlc3MsIG9yIGEgc3RyaW5nLgorXGVuZHtjbGFzc2Rlc2MqfQorCitcYmVnaW57Y2xhc3NkZXNjKn17SFJFU1VMVH0KK1dpbmRvd3Mgb25seTogUmVwcmVzZW50cyBhIFxjbGFzc3tIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMgc3VjY2Vzcworb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCitcZW5ke2NsYXNzZGVzYyp9CisKK1xiZWdpbntjbGFzc2Rlc2MqfXtweV9vYmplY3R9CitSZXByZXNlbnRzIHRoZSBDIFxjb2Rle1B5T2JqZWN0ICp9IGRhdGF0eXBlLgorXGVuZHtjbGFzc2Rlc2MqfQorCitUaGUgXGNvZGV7Y3R5cGVzLndpbnR5cGVzfSBtb2R1bGUgcHJvdmlkZXMgcXVpdGUgc29tZSBvdGhlciBXaW5kb3dzCitzcGVjaWZpYyBkYXRhIHR5cGVzLCBmb3IgZXhhbXBsZSBcY29kZXtIV05EfSwgXGNvZGV7V1BBUkFNfSwgb3IgXGNvZGV7RFdPUkR9LgorU29tZSB1c2VmdWwgc3RydWN0dXJlcyBsaWtlIFxjb2Rle01TR30gb3IgXGNvZGV7UkVDVH0gYXJlIGFsc28gZGVmaW5lZC4KKworCitcc3Vic3Vic2VjdGlvbntTdHJ1Y3R1cmVkIGRhdGEgdHlwZXNcbGFiZWx7Y3R5cGVzLXN0cnVjdHVyZWQtZGF0YS10eXBlc319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXsqYXJncywgKiprd30KK0Fic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHVuaW9ucyBpbiBuYXRpdmUgYnl0ZSBvcmRlci4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57Y2xhc3NkZXNjfXtCaWdFbmRpYW5TdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQorQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtiaWcgZW5kaWFufSBieXRlIG9yZGVyLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0xpdHRsZUVuZGlhblN0cnVjdHVyZX17KmFyZ3MsICoqa3d9CitBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdHJ1Y3R1cmVzIGluIFxlbXBoe2xpdHRsZSBlbmRpYW59IGJ5dGUgb3JkZXIuCitcZW5ke2NsYXNzZGVzY30KKworU3RydWN0dXJlcyB3aXRoIG5vbi1uYXRpdmUgYnl0ZSBvcmRlciBjYW5ub3QgY29udGFpbiBwb2ludGVyIHR5cGUKK2ZpZWxkcywgb3IgYW55IG90aGVyIGRhdGEgdHlwZXMgY29udGFpbmluZyBwb2ludGVyIHR5cGUgZmllbGRzLgorCitcYmVnaW57Y2xhc3NkZXNjfXtTdHJ1Y3R1cmV9eyphcmdzLCAqKmt3fQorQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RydWN0dXJlcyBpbiBcZW1waHtuYXRpdmV9IGJ5dGUgb3JkZXIuCitcZW5ke2NsYXNzZGVzY30KKworQ29uY3JldGUgc3RydWN0dXJlIGFuZCB1bmlvbiB0eXBlcyBtdXN0IGJlIGNyZWF0ZWQgYnkgc3ViY2xhc3Npbmcgb25lCitvZiB0aGVzZSB0eXBlcywgYW5kIGF0IGxlYXN0IGRlZmluZSBhIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGNsYXNzIHZhcmlhYmxlLgorXGNvZGV7Y3R5cGVzfSB3aWxsIGNyZWF0ZSBkZXNjcmlwdG9ycyB3aGljaCBhbGxvdyByZWFkaW5nIGFuZCB3cml0aW5nIHRoZQorZmllbGRzIGJ5IGRpcmVjdCBhdHRyaWJ1dGUgYWNjZXNzZXMuICBUaGVzZSBhcmUgdGhlCisKK1xiZWdpbnttZW1iZXJkZXNjfXtfZmllbGRzX30KK0Egc2VxdWVuY2UgZGVmaW5pbmcgdGhlIHN0cnVjdHVyZSBmaWVsZHMuICBUaGUgaXRlbXMgbXVzdCBiZQorMi10dXBsZXMgb3IgMy10dXBsZXMuICBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgbmFtZSBvZiB0aGUgZmllbGQsCit0aGUgc2Vjb25kIGl0ZW0gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZDsgaXQgY2FuIGJlIGFueQorY3R5cGVzIGRhdGEgdHlwZS4KKworRm9yIGludGVnZXIgdHlwZSBmaWVsZHMsIGEgdGhpcmQgb3B0aW9uYWwgaXRlbSBjYW4gYmUgZ2l2ZW4uICBJdAorbXVzdCBiZSBhIHNtYWxsIHBvc2l0aXZlIGludGVnZXIgZGVmaW5pbmcgdGhlIGJpdCB3aWR0aCBvZiB0aGUKK2ZpZWxkLgorCitGaWVsZCBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gb25lIHN0cnVjdHVyZSBvciB1bmlvbi4gIFRoaXMgaXMKK25vdCBjaGVja2VkLCBvbmx5IG9uZSBmaWVsZCBjYW4gYmUgYWNjZXNzZWQgd2hlbiBuYW1lcyBhcmUKK3JlcGVhdGVkLgorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmUgdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGNsYXNzIHZhcmlhYmxlIFxlbXBoe2FmdGVyfQordGhlIGNsYXNzIHN0YXRlbWVudCB0aGF0IGRlZmluZXMgdGhlIFN0cnVjdHVyZSBzdWJjbGFzcywgdGhpcworYWxsb3dzIHRvIGNyZWF0ZSBkYXRhIHR5cGVzIHRoYXQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSByZWZlcmVuY2UKK3RoZW1zZWx2ZXM6CitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBMaXN0KFN0cnVjdHVyZSk6CisgICAgcGFzcworTGlzdC5fZmllbGRzXyA9IFsoInBuZXh0IiwgUE9JTlRFUihMaXN0KSksCisgICAgICAgICAgICAgICAgIC4uLgorICAgICAgICAgICAgICAgIF0KK1xlbmR7dmVyYmF0aW19CisKK1RoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSBjbGFzcyB2YXJpYWJsZSBtdXN0LCBob3dldmVyLCBiZSBkZWZpbmVkIGJlZm9yZQordGhlIHR5cGUgaXMgZmlyc3QgdXNlZCAoYW4gaW5zdGFuY2UgaXMgY3JlYXRlZCwgXGNvZGV7c2l6ZW9mKCl9IGlzCitjYWxsZWQgb24gaXQsIGFuZCBzbyBvbikuICBMYXRlciBhc3NpZ25tZW50cyB0byB0aGUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0KK2NsYXNzIHZhcmlhYmxlIHdpbGwgcmFpc2UgYW4gQXR0cmlidXRlRXJyb3IuCisKK1N0cnVjdHVyZSBhbmQgdW5pb24gc3ViY2xhc3MgY29uc3RydWN0b3JzIGFjY2VwdCBib3RoIHBvc2l0aW9uYWwKK2FuZCBuYW1lZCBhcmd1bWVudHMuICBQb3NpdGlvbmFsIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBpbml0aWFsaXplCit0aGUgZmllbGRzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXBwZWFyIGluIHRoZSBcbWVtYmVye3tcX31maWVsZHN7XF99fQorZGVmaW5pdGlvbiwgbmFtZWQgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkcyB3aXRoCit0aGUgY29ycmVzcG9uZGluZyBuYW1lLgorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmVkIHN1Yi1zdWJjbGFzc2VzIG9mIHN0cnVjdHVyZSB0eXBlcywgdGhleQoraW5oZXJpdCB0aGUgZmllbGRzIG9mIHRoZSBiYXNlIGNsYXNzIHBsdXMgdGhlIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319IGRlZmluZWQKK2luIHRoZSBzdWItc3ViY2xhc3MsIGlmIGFueS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e19wYWNrX30KK0FuIG9wdGlvbmFsIHNtYWxsIGludGVnZXIgdGhhdCBhbGxvd3MgdG8gb3ZlcnJpZGUgdGhlIGFsaWdubWVudCBvZgorc3RydWN0dXJlIGZpZWxkcyBpbiB0aGUgaW5zdGFuY2UuICBcbWVtYmVye3tcX31wYWNre1xffX0gbXVzdCBhbHJlYWR5IGJlCitkZWZpbmVkIHdoZW4gXG1lbWJlcnt7XF99ZmllbGRze1xffX0gaXMgYXNzaWduZWQsIG90aGVyd2lzZSBpdCB3aWxsIGhhdmUgbm8KK2VmZmVjdC4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e19hbm9ueW1vdXNffQorQW4gb3B0aW9uYWwgc2VxdWVuY2UgdGhhdCBsaXN0cyB0aGUgbmFtZXMgb2YgdW5uYW1lZCAoYW5vbnltb3VzKQorZmllbGRzLiAgXGNvZGV7e1xffWFub255bW91c3tcX319IG11c3QgYmUgYWxyZWFkeSBkZWZpbmVkIHdoZW4gXG1lbWJlcnt7XF99ZmllbGRze1xffX0KK2lzIGFzc2lnbmVkLCBvdGhlcndpc2UgaXQgd2lsbCBoYXZlIG5vIGVmZmVjdC4KKworVGhlIGZpZWxkcyBsaXN0ZWQgaW4gdGhpcyB2YXJpYWJsZSBtdXN0IGJlIHN0cnVjdHVyZSBvciB1bmlvbiB0eXBlCitmaWVsZHMuICBcY29kZXtjdHlwZXN9IHdpbGwgY3JlYXRlIGRlc2NyaXB0b3JzIGluIHRoZSBzdHJ1Y3R1cmUgdHlwZQordGhhdCBhbGxvd3MgdG8gYWNjZXNzIHRoZSBuZXN0ZWQgZmllbGRzIGRpcmVjdGx5LCB3aXRob3V0IHRoZSBuZWVkCit0byBjcmVhdGUgdGhlIHN0cnVjdHVyZSBvciB1bmlvbiBmaWVsZC4KKworSGVyZSBpcyBhbiBleGFtcGxlIHR5cGUgKFdpbmRvd3MpOgorXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgX1UoVW5pb24pOgorICAgIF9maWVsZHNfID0gWygibHB0ZGVzYyIsIFBPSU5URVIoVFlQRURFU0MpKSwKKyAgICAgICAgICAgICAgICAoImxwYWRlc2MiLCBQT0lOVEVSKEFSUkFZREVTQykpLAorICAgICAgICAgICAgICAgICgiaHJlZnR5cGUiLCBIUkVGVFlQRSldCisKK2NsYXNzIFRZUEVERVNDKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCJ1IiwgX1UpLAorICAgICAgICAgICAgICAgICgidnQiLCBWQVJUWVBFKV0KKworICAgIF9hbm9ueW1vdXNfID0gKCJ1IiwpCitcZW5ke3ZlcmJhdGltfQorCitUaGUgXGNvZGV7VFlQRURFU0N9IHN0cnVjdHVyZSBkZXNjcmliZXMgYSBDT00gZGF0YSB0eXBlLCB0aGUgXGNvZGV7dnR9CitmaWVsZCBzcGVjaWZpZXMgd2hpY2ggb25lIG9mIHRoZSB1bmlvbiBmaWVsZHMgaXMgdmFsaWQuICBTaW5jZSB0aGUKK1xjb2Rle3V9IGZpZWxkIGlzIGRlZmluZWQgYXMgYW5vbnltb3VzIGZpZWxkLCBpdCBpcyBub3cgcG9zc2libGUgdG8KK2FjY2VzcyB0aGUgbWVtYmVycyBkaXJlY3RseSBvZmYgdGhlIFRZUEVERVNDIGluc3RhbmNlLgorXGNvZGV7dGQubHB0ZGVzY30gYW5kIFxjb2Rle3RkLnUubHB0ZGVzY30gYXJlIGVxdWl2YWxlbnQsIGJ1dCB0aGUgZm9ybWVyCitpcyBmYXN0ZXIgc2luY2UgaXQgZG9lcyBub3QgbmVlZCB0byBjcmVhdGUgYSB0ZW1wb3JhcnkgdW5pb24KK2luc3RhbmNlOgorXGJlZ2lue3ZlcmJhdGltfQordGQgPSBUWVBFREVTQygpCit0ZC52dCA9IFZUX1BUUgordGQubHB0ZGVzYyA9IFBPSU5URVIoc29tZV90eXBlKQordGQudS5scHRkZXNjID0gUE9JTlRFUihzb21lX3R5cGUpCitcZW5ke3ZlcmJhdGltfQorXGVuZHttZW1iZXJkZXNjfQorCitJdCBpcyBwb3NzaWJsZSB0byBkZWZpbmVkIHN1Yi1zdWJjbGFzc2VzIG9mIHN0cnVjdHVyZXMsIHRoZXkgaW5oZXJpdAordGhlIGZpZWxkcyBvZiB0aGUgYmFzZSBjbGFzcy4gIElmIHRoZSBzdWJjbGFzcyBkZWZpbml0aW9uIGhhcyBhCitzZXBhcmF0ZSBcbWVtYmVye3tcX31maWVsZHN7XF99fSB2YXJpYWJsZSwgdGhlIGZpZWxkcyBzcGVjaWZpZWQgaW4gdGhpcyBhcmUKK2FwcGVuZGVkIHRvIHRoZSBmaWVsZHMgb2YgdGhlIGJhc2UgY2xhc3MuCisKK1N0cnVjdHVyZSBhbmQgdW5pb24gY29uc3RydWN0b3JzIGFjY2VwdCBib3RoIHBvc2l0aW9uYWwgYW5kCitrZXl3b3JkIGFyZ3VtZW50cy4gIFBvc2l0aW9uYWwgYXJndW1lbnRzIGFyZSB1c2VkIHRvIGluaXRpYWxpemUgbWVtYmVyCitmaWVsZHMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhleSBhcmUgYXBwZWFyIGluIFxtZW1iZXJ7e1xffWZpZWxkc3tcX319LiAgS2V5d29yZAorYXJndW1lbnRzIGluIHRoZSBjb25zdHJ1Y3RvciBhcmUgaW50ZXJwcmV0ZWQgYXMgYXR0cmlidXRlIGFzc2lnbm1lbnRzLAorc28gdGhleSB3aWxsIGluaXRpYWxpemUgXG1lbWJlcnt7XF99ZmllbGRze1xffX0gd2l0aCB0aGUgc2FtZSBuYW1lLCBvciBjcmVhdGUgbmV3CithdHRyaWJ1dGVzIGZvciBuYW1lcyBub3QgcHJlc2VudCBpbiBcbWVtYmVye3tcX31maWVsZHN7XF99fS4KKworCitcc3Vic3Vic2VjdGlvbntBcnJheXMgYW5kIHBvaW50ZXJzXGxhYmVse2N0eXBlcy1hcnJheXMtcG9pbnRlcnN9fQorCitYWFgKKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJjdHlwZXNyZWYudGV4IGIvRG9jL2xpYi9saWJjdHlwZXNyZWYudGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk1MGY0Li4wMDAwMDAwCi0tLSBhL0RvYy9saWIvbGliY3R5cGVzcmVmLnRleAorKysgL2Rldi9udWxsCkBAIC0xLDQ1NyArMCwwIEBACi1cc3Vic2VjdGlvbntjdHlwZXMgcmVmZXJlbmNlXGxhYmVse2N0eXBlcy1yZWZlcmVuY2V9fQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGZ1bmN0aW9ucwotXHN1YnN1YnNlY3Rpb257Y3R5cGVzIGZ1bmN0aW9uc30KLQotXGJlZ2lue2Z1bmNkZXNjfXthZGRyZXNzb2Z9e29ian0KLVJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBidWZmZXIgYXMgaW50ZWdlci4gIFx2YXJ7b2JqfSBtdXN0Ci1iZSBhbiBpbnN0YW5jZSBvZiBhIGN0eXBlcyB0eXBlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXthbGlnbm1lbnR9e29ial9vcl90eXBlfQotUmV0dXJucyB0aGUgYWxpZ25tZW50IHJlcXVpcmVtZW50cyBvZiBhIGN0eXBlcyB0eXBlLgotXHZhcntvYmpfb3JfdHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlIG9yIGFuIGluc3RhbmNlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2V4Y2NsYXNzZGVzY317QXJndW1lbnRFcnJvcn17fQotVGhpcyBleGNlcHRpb24gaXMgcmFpc2VkIHdoZW4gYSBmb3JlaWduIGZ1bmN0aW9uIGNhbGwgY2Fubm90IGNvbnZlcnQKLW9uZSBvZiB0aGUgcGFzc2VkIGFyZ3VtZW50cy4KLVxlbmR7ZXhjY2xhc3NkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e2J5cmVmfXtvYmp9Ci1SZXR1cm5zIGEgbGlnaHQtd2VpZ2h0IHBvaW50ZXIgdG8gXHZhcntvYmp9LCB3aGljaCBtdXN0IGJlIGFuIGluc3RhbmNlCi1vZiBhIGN0eXBlcyB0eXBlLiAgVGhlIHJldHVybmVkIG9iamVjdCBjYW4gb25seSBiZSB1c2VkIGFzIGEgZm9yZWlnbgotZnVuY3Rpb24gY2FsbCBwYXJhbWV0ZXIuICBJdCBiZWhhdmVzIHNpbWlsYXIgdG8gXGNvZGV7cG9pbnRlcihvYmopfSwKLWJ1dCB0aGUgY29uc3RydWN0aW9uIGlzIGEgbG90IGZhc3Rlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y2FzdH17b2JqLCB0eXBlfQotVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSBjYXN0IG9wZXJhdG9yIGluIEMuICBJdCByZXR1cm5zIGEgbmV3Ci1pbnN0YW5jZSBvZiBcdmFye3R5cGV9IHdoaWNoIHBvaW50cyB0byB0aGUgc2FtZSBtZW1vcnkgYmxvY2sgYXMKLVxjb2Rle29ian0uICBcY29kZXt0eXBlfSBtdXN0IGJlIGEgcG9pbnRlciB0eXBlLCBhbmQgXGNvZGV7b2JqfQotIG11c3QgYmUgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGludGVycHJldGVkIGFzIGEgcG9pbnRlci4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLSUgWFhYIHNlcGFyYXRlIHNlY3Rpb24gZm9yIENGVU5DVFlQRSwgV0lORlVOQ1RZUEUsIFBZRlVOQ1RZUEU/Ci0KLVxiZWdpbntmdW5jZGVzY317Q0ZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1UaGlzIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBmdW5jdGlvbiBwcm90b3R5cGUuICBUaGUKLWZ1bmN0aW9uIHByb3RvdHlwZSBkZXNjcmliZXMgYSBmdW5jdGlvbiB0aGF0IGhhcyBhIHJlc3VsdCB0eXBlIG9mCi1cY29kZXtyZXN0eXBlfSwgYW5kIGFjY2VwdHMgYXJndW1lbnRzIGFzIHNwZWNpZmllZCBieSBcY29kZXthcmd0eXBlc30uCi1UaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSB1c2VkIHRvIGNvbnN0cnVjdCBzZXZlcmFsIGtpbmRzIG9mCi1mdW5jdGlvbnMsIGRlcGVuZGluZyBvbiBob3cgdGhlIHByb3RvdHlwZSBpcyBjYWxsZWQuCi0KLVRoZSBwcm90b3R5cGVzIHJldHVybmVkIGJ5IFxjb2Rle0NGVU5DVFlQRX0gb3IgXGNvZGV7UFlGVU5DVFlQRX0KLWNyZWF0ZSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhlIHN0YW5kYXJkIEMgY2FsbGluZyBjb252ZW50aW9uLAotcHJvdG90eXBlcyByZXR1cm5lZCBmcm9tIFxjb2Rle1dJTkZVTkNUWVBFfSAob24gV2luZG93cykgdXNlIHRoZQotXGNvZGV7X19zdGRjYWxsfSBjYWxsaW5nIGNvbnZlbnRpb24uCi0KLUZ1bmN0aW9ucyBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIFxjb2Rle0NGVU5DVFlQRX0gYW5kCi1cY29kZXtXSU5GVU5DVFlQRX0gcHJvdG90eXBlcyByZWxlYXNlIHRoZSBQeXRob24gR0lMCi1iZWZvcmUgZW50ZXJpbmcgdGhlIGZvcmVpZ24gZnVuY3Rpb24sIGFuZCBhY3F1aXJlIGl0IGJhY2sgYWZ0ZXIKLWxlYXZpbmcgdGhlIGZ1bmN0aW9uIGNvZGUuCi0KLSUgWFhYIGRpZmZlcmVuY2VzIGJldHdlZW4gQ0ZVTkNUWVBFIC8gV0lORlVOQ1RZUEUgLyBQWUZVTkNUWVBFCi0KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3N0cmluZ19idWZmZXJ9e2luaXRfb3Jfc2l6ZVxvcHRpb25hbHssIHNpemV9fQotVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgbXV0YWJsZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlIHJldHVybmVkIG9iamVjdAotaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y19jaGFyfS4KLQotXHZhcntpbml0X29yX3NpemV9IG11c3QgYmUgYW4gaW50ZWdlciB3aGljaCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlCi1hcnJheSwgb3IgYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5IGl0ZW1zLgotCi1JZiBhIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZSBvbmUKLWl0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudCBpbgotdGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZCBhcwotc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZiB0aGUKLWxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KLQotSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIHVuaWNvZGUgc3RyaW5nLCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhbgotOC1iaXQgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317Y3JlYXRlX3VuaWNvZGVfYnVmZmVyfXtpbml0X29yX3NpemVcb3B0aW9uYWx7LCBzaXplfX0KLVRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhIG11dGFibGUgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyLiAgVGhlCi1yZXR1cm5lZCBvYmplY3QgaXMgYSBjdHlwZXMgYXJyYXkgb2YgXGNvZGV7Y193Y2hhcn0uCi0KLVx2YXJ7aW5pdF9vcl9zaXplfSBtdXN0IGJlIGFuIGludGVnZXIgd2hpY2ggc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZQotYXJyYXksIG9yIGEgdW5pY29kZSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFycmF5Ci1pdGVtcy4KLQotSWYgYSB1bmljb2RlIHN0cmluZyBpcyBzcGVjaWZpZWQgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSBidWZmZXIgaXMgbWFkZQotb25lIGl0ZW0gbGFyZ2VyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNvIHRoYXQgdGhlIGxhc3QgZWxlbWVudAotaW4gdGhlIGFycmF5IGlzIGEgTlVMIHRlcm1pbmF0aW9uIGNoYXJhY3Rlci4gIEFuIGludGVnZXIgY2FuIGJlIHBhc3NlZAotYXMgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIGFsbG93cyB0byBzcGVjaWZ5IHRoZSBzaXplIG9mIHRoZSBhcnJheSBpZgotdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHNob3VsZCBub3QgYmUgdXNlZC4KLQotSWYgdGhlIGZpcnN0IHBhcmFtZXRlciBpcyBhIDgtYml0IHN0cmluZywgaXQgaXMgY29udmVydGVkIGludG8gYW4KLXVuaWNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBjdHlwZXMgY29udmVyc2lvbiBydWxlcy4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317RGxsQ2FuVW5sb2FkTm93fXt9Ci1XaW5kb3dzIG9ubHk6IFRoaXMgZnVuY3Rpb24gaXMgYSBob29rIHdoaWNoIGFsbG93cyB0byBpbXBsZW1lbnQKLWlucHJvY2VzcyBDT00gc2VydmVycyB3aXRoIGN0eXBlcy4gIEl0IGlzIGNhbGxlZCBmcm9tIHRoZQotXGNvZGV7RGxsQ2FuVW5sb2FkTm93fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQotZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtEbGxHZXRDbGFzc09iamVjdH17fQotV2luZG93cyBvbmx5OiBUaGlzIGZ1bmN0aW9uIGlzIGEgaG9vayB3aGljaCBhbGxvd3MgdG8gaW1wbGVtZW50Ci1pbnByb2Nlc3MgQ09NIHNlcnZlcnMgd2l0aCBjdHlwZXMuICBJdCBpcyBjYWxsZWQgZnJvbSB0aGUKLVxjb2Rle0RsbEdldENsYXNzT2JqZWN0fSBmdW5jdGlvbiB0aGF0IHRoZSBcY29kZXtfY3R5cGVzfQotZXh0ZW5zaW9uIGRsbCBleHBvcnRzLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtGb3JtYXRFcnJvcn17XG9wdGlvbmFse2NvZGV9fQotV2luZG93cyBvbmx5OiBSZXR1cm5zIGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IgY29kZS4gIElmIG5vCi1lcnJvciBjb2RlIGlzIHNwZWNpZmllZCwgdGhlIGxhc3QgZXJyb3IgY29kZSBpcyB1c2VkIGJ5IGNhbGxpbmcgdGhlCi1XaW5kb3dzIGFwaSBmdW5jdGlvbiBcY29kZXtHZXRMYXN0RXJyb3J9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtHZXRMYXN0RXJyb3J9e30KLVdpbmRvd3Mgb25seTogUmV0dXJucyB0aGUgbGFzdCBlcnJvciBjb2RlIHNldCBieSBXaW5kb3dzIGluIHRoZQotY2FsbGluZyB0aHJlYWQuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21lbW1vdmV9e2RzdCwgc3JjLCBjb3VudH0KLVNhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtbW92ZX0gbGlicmFyeSBmdW5jdGlvbjogY29waWVzCi1cdmFye2NvdW50fSBieXRlcyBmcm9tIFxjb2Rle3NyY30gdG8gXGNvZGV7ZHN0fS4gIFxjb2Rle2RzdH0gYW5kCi1cY29kZXtzcmN9IG11c3QgYmUgaW50ZWdlcnMgb3IgY3R5cGVzIGluc3RhbmNlcyB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlcnMuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e21lbXNldH17ZHN0LCBjLCBjb3VudH0KLVNhbWUgYXMgdGhlIHN0YW5kYXJkIEMgXGNvZGV7bWVtc2V0fSBsaWJyYXJ5IGZ1bmN0aW9uOiBmaWxscyB0aGUKLW1lbW9yeSBjbG9jayBhdCBhZGRyZXNzIFxjb2Rle2RzdH0gd2l0aCBcdmFye2NvdW50fSBieXRlcyBvZiB2YWx1ZQotXHZhcntjfS4gIFx2YXJ7ZHN0fSBtdXN0IGJlIGFuIGludGVnZXIgc3BlY2lmeWluZyBhbiBhZGRyZXNzLCBvciBhIGN0eXBlcyBpbnN0YW5jZS4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317UE9JTlRFUn17dHlwZX0KLVRoaXMgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IGN0eXBlcyBwb2ludGVyIHR5cGUuCi1Qb2ludGVyIHR5cGVzIGFyZSBjYWNoZWQgYW4gcmV1c2VkIGludGVybmFsbHksIHNvIGNhbGxpbmcgdGhpcwotZnVuY3Rpb24gcmVwZWF0ZWRseSBpcyBjaGVhcC4gIFx2YXJ7dHlwZX0gbXVzdCBiZSBhIGN0eXBlcyB0eXBlLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtwb2ludGVyfXtvYmp9Ci1UaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBuZXcgcG9pbnRlciBpbnN0YW5jZSwgcG9pbnRpbmcgdG8gXHZhcntvYmp9LgotVGhlIHJldHVybmVkIG9iamVjdCBpcyBvZiB0aGUgdHlwZSBcY29kZXtQT0lOVEVSKHR5cGUob2JqKSl9LgotCi1Ob3RlOiBJZiB5b3UganVzdCB3YW50IHRvIHBhc3MgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB0byBhIGZvcmVpZ24KLWZ1bmN0aW9uIGNhbGwsIHlvdSBzaG91bGQgdXNlIFxjb2Rle2J5cmVmKG9iail9IHdoaWNoIGlzIG11Y2ggZmFzdGVyLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtQWUZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3B5dGhvbmFwaX17fQotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtyZXNpemV9e29iaiwgc2l6ZX0KLVRoaXMgZnVuY3Rpb24gcmVzaXplcyB0aGUgaW50ZXJuYWwgbWVtb3J5IGJ1ZmZlciBvZiBcdmFye29ian0sIHdoaWNoCi1tdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEgY3R5cGVzIHR5cGUuICBJdCBpcyBub3QgcG9zc2libGUgdG8gbWFrZSB0aGUKLWJ1ZmZlciBzbWFsbGVyIHRoYW4gdGhlIG5hdGl2ZSBzaXplIG9mIHRoZSBvYmplY3RzIHR5cGUsIGFzIGdpdmVuIGJ5Ci1cY29kZXtzaXplb2YodHlwZShvYmopKX0sIGJ1dCBpdCBpcyBwb3NzaWJsZSB0byBlbmxhcmdlIHRoZSBidWZmZXIuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3NldF9jb252ZXJzaW9uX21vZGV9e2VuY29kaW5nLCBlcnJvcnN9Ci1UaGlzIGZ1bmN0aW9uIHNldHMgdGhlIHJ1bGVzIHRoYXQgY3R5cGVzIG9iamVjdHMgdXNlIHdoZW4gY29udmVydGluZwotYmV0d2VlbiA4LWJpdCBzdHJpbmdzIGFuZCB1bmljb2RlIHN0cmluZ3MuICBcdmFye2VuY29kaW5nfSBtdXN0IGJlIGEKLXN0cmluZyBzcGVjaWZ5aW5nIGFuIGVuY29kaW5nLCBsaWtlICd1dGYtOCcgb3IgJ21iY3MnLCBcdmFye2Vycm9yc30KLW11c3QgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyB0aGUgZXJyb3IgaGFuZGxpbmcgb24gZW5jb2RpbmcvZGVjb2RpbmcKLWVycm9ycy4gIEV4YW1wbGVzIG9mIHBvc3NpYmxlIHZhbHVlcyBhcmUgYGBzdHJpY3QnJywgYGByZXBsYWNlJycsIG9yCi1gYGlnbm9yZScnLgotCi1cY29kZXtzZXRfY29udmVyc2lvbl9tb2RlfSByZXR1cm5zIGEgMi10dXBsZSBjb250YWluaW5nIHRoZSBwcmV2aW91cwotY29udmVyc2lvbiBydWxlcy4gIE9uIHdpbmRvd3MsIHRoZSBpbml0aWFsIGNvbnZlcnNpb24gcnVsZXMgYXJlCi1cY29kZXsoJ21iY3MnLCAnaWdub3JlJyl9LCBvbiBvdGhlciBzeXN0ZW1zIFxjb2RleygnYXNjaWknLCAnc3RyaWN0Jyl9LgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzaXplb2Z9e29ial9vcl90eXBlfQotUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhIGN0eXBlcyB0eXBlIG9yIGluc3RhbmNlIG1lbW9yeSBidWZmZXIuCi1Eb2VzIHRoZSBzYW1lIGFzIHRoZSBDIHNpemVvZigpIGZ1bmN0aW9uLgotXGVuZHtmdW5jZGVzY30KLQotXGJlZ2lue2Z1bmNkZXNjfXtzdHJpbmdfYXR9e2FkZHJlc3Ncb3B0aW9uYWx7c2l6ZX19Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkgYWRkcmVzcwotXHZhcnthZGRyZXNzfS4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLCBpdCBpcyB1c2VkIGFzIHNpemUsCi1vdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlIHplcm8tdGVybWluYXRlZC4KLVxlbmR7ZnVuY2Rlc2N9Ci0KLVxiZWdpbntmdW5jZGVzY317V2luRXJyb3J9e2NvZGU9Tm9uZSwgZGVzY3I9Tm9uZX0KLVdpbmRvd3Mgb25seTogdGhpcyBmdW5jdGlvbiBpcyBwcm9iYWJseSB0aGUgd29yc3QtbmFtZWQgdGhpbmcgaW4KLWN0eXBlcy4gIEl0IGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgXGNvZGV7V2luZG93c0Vycm9yfS4gIElmIFx2YXJ7Y29kZX0KLWlzIG5vdCBzcGVjaWZpZWQsIFxjb2Rle0dldExhc3RFcnJvcn0gaXMgY2FsbGVkIHRvIGRldGVybWluZSB0aGUgZXJyb3IKLWNvZGUuICBJZiBcdmFye2Rlc2NyfSBpcyBub3Qgc3BjaWZpZWQsIFx2YXJ7Rm9ybWF0RXJyb3J9IGlzIGNhbGxlZCB0bwotZ2V0IGEgdGV4dHVhbCBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e1dJTkZVTkNUWVBFfXtyZXN0eXBlLCAqYXJndHlwZXN9Ci1cZW5ke2Z1bmNkZXNjfQotCi1cYmVnaW57ZnVuY2Rlc2N9e3dzdHJpbmdfYXR9e2FkZHJlc3N9Ci1UaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHdpZGUgY2hhcmFjdGVyIHN0cmluZyBzdGFydGluZyBhdCBtZW1vcnkKLWFkZHJlc3MgXHZhcnthZGRyZXNzfSBhcyB1bmljb2RlIHN0cmluZy4gIElmIFx2YXJ7c2l6ZX0gaXMgc3BlY2lmaWVkLAotaXQgaXMgdXNlZCBhcyBzaXplLCBvdGhlcndpc2UgdGhlIHN0cmluZyBpcyBhc3N1bWVkIHRvIGJlCi16ZXJvLXRlcm1pbmF0ZWQuCi1cZW5ke2Z1bmNkZXNjfQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue2RhdGEgdHlwZXN9Ci0KLWN0eXBlcyBkZWZpbmVzIGEgbG90IG9mIEMgY29tcGF0aWJsZSBkYXRhdHlwZXMsIGFuZCBhbHNvIGFsbG93cyB0bwotZGVmaW5lIHlvdXIgb3duIHR5cGVzLiAgQW1vbmcgb3RoZXIgdGhpbmdzLCBhIGN0eXBlcyB0eXBlIGluc3RhbmNlCi1ob2xkcyBhIG1lbW9yeSBibG9jayB0aGF0IGNvbnRhaW5zIEMgY29tcGF0aWJsZSBkYXRhLgotCi1cYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9DRGF0YX17fQotVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0Ci1pcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gbWV0aG9kcyBvZiB0aGUgY3R5cGVzCi1kYXRhIHR5cGVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLUNvbW1vbiBtZXRob2RzIG9mIGN0eXBlcyBkYXRhIHR5cGVzLCB0aGVzZSBhcmUgYWxsIGNsYXNzIG1ldGhvZHMgKHRvCi1iZSBleGFjdCwgdGhleSBhcmUgbWV0aG9kcyBvZiB0aGUgbWV0YWNsYXNzKToKLQotXGJlZ2lue21ldGhvZGRlc2N9e2Zyb21fYWRkcmVzc317YWRkcmVzc30KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSB1c2luZyB0aGUgbWVtb3J5IHNwZWNpZmllZAotYnkgXGNvZGV7YWRkcmVzc30uIAotXGVuZHttZXRob2RkZXNjfQotCi1cYmVnaW57bWV0aG9kZGVzY317ZnJvbV9wYXJhbX17b2JqfQotVGhpcyBtZXRob2QgYWRhcHRzIFxjb2Rle29ian0gdG8gYSBjdHlwZXMgdHlwZS4KLVxlbmR7bWV0aG9kZGVzY30KLQotXGJlZ2lue21ldGhvZGRlc2N9e2luX2RsbH17bmFtZSwgbGlicmFyeX0KLVRoaXMgbWV0aG9kIHJldHVybnMgYSBjdHlwZXMgdHlwZSBpbnN0YW5jZSBleHBvcnRlZCBieSBhIHNoYXJlZAotbGlicmFyeS4gIFx2YXJ7bmFtZX0gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IGV4cG9ydHMgdGhlIGRhdGEsCi1cdmFye2xpYnJhcnl9IGlzIHRoZSBsb2FkZWQgc2hhcmVkIGxpYnJhcnkuCi1cZW5ke21ldGhvZGRlc2N9Ci0KLSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKLSUgc2ltcGxlIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue3NpbXBsZSBkYXRhIHR5cGVzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtfY3R5cGVzLl9TaW1wbGVDRGF0YX17fQotVGhpcyBub24tcHVibGljIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCBjdHlwZXMgZGF0YSB0eXBlcy4gIEl0Ci1pcyBtZW50aW9uZWQgaGVyZSBiZWNhdXNlIGl0IGNvbnRhaW5zIHRoZSBjb21tb24gYXR0cmlidXRlcyBvZiB0aGUKLWN0eXBlcyBkYXRhIHR5cGVzLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXt2YWx1ZX0KLVRoaXMgYXR0cmlidXRlIGNvbnRhaW5zIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIGluc3RhbmNlLiAgRm9yIGludGVnZXIKLXR5cGVzLCBpdCBpcyBhbiBpbnRlZ2VyLgotXGVuZHttZW1iZXJkZXNjfQotCi1IZXJlIGFyZSB0aGUgc2ltcGxlIGN0eXBlcyBkYXRhIHR5cGVzOgotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2J5dGV9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQotYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKLWluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfY2hhcn17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXJ9IGRhdGF0eXBlLCBhbmQgaW50ZXJwcmV0cyB0aGUgdmFsdWUgYXMgYQotc2luZ2xlIGNoYXJhY3Rlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIHN0cmluZwotaW5pdGlhbGl6ZXIsIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZyBtdXN0IGJlIGV4YWN0bHkgb25lIGNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2NoYXJfcH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle2NoYXIgKn0gZGF0YXR5cGUsIHdoaWNoIG11c3QgYmUgYSBwb2ludGVyIHRvIGEKLXplcm8tdGVybWluYXRlZCBzdHJpbmcuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbiBpbnRlZ2VyIGFkZHJlc3MsCi1vciBhIHN0cmluZy4KLSUgWFhYIEV4cGxhaW4gdGhlIGRpZmZlcmVuY2UgdG8gUE9JTlRFUihjX2NoYXIpCi1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317Y19kb3VibGV9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfZmxvYXR9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtkb3VibGV9IGRhdGF0eXBlLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLW9wdGlvbmFsIGZsb2F0IGluaXRpYWxpemVyLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cyBhbgotb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCi1wbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgotYWxpYXMgdG8gXHZhcntjX2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50MTZ9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyAxNi1iaXQgXGNvZGV7c2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXHZhcntjX3Nob3J0fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2ludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfaW50fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2ludDY0fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgNjQtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfbG9uZ2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfaW50OH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIDgtYml0IFxjb2Rle3NpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcyBmb3IgXGNvZGV7Y19ieXRlfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmd9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXtzaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX2xvbmdsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKLWFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Nob3J0fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCi1hbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2Nfc2l6ZV90fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7c2l6ZV90fSBkYXRhdHlwZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VieXRlfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgY2hhcn0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZQotYXMgc21hbGwgaW50ZWdlci4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzIGFuIG9wdGlvbmFsIGludGVnZXIKLWluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4gIE9uCi1wbGF0Zm9ybXMgd2hlcmUgXGNvZGV7c2l6ZW9mKGludCkgPT0gc2l6ZW9mKGxvbmcpfSBcdmFye2NfaW50fSBpcyBhbgotYWxpYXMgdG8gXHZhcntjX2xvbmd9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludDE2fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMTYtYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXGNvZGV7Y191c2hvcnR9LgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2NfdWludDMyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgMzItYml0IFxjb2Rle3Vuc2lnbmVkIGludH0gZGF0YXR5cGUuICBVc3VhbGx5IGFuIGFsaWFzCi1mb3IgXGNvZGV7Y191aW50fS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ2NH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIDY0LWJpdCBcY29kZXt1bnNpZ25lZCBpbnR9IGRhdGF0eXBlLiAgVXN1YWxseSBhbiBhbGlhcwotZm9yIFxjb2Rle2NfdWxvbmdsb25nfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VpbnQ4fXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgOC1iaXQgXGNvZGV7dW5zaWduZWQgaW50fSBkYXRhdHlwZS4gIFVzdWFsbHkgYW4gYWxpYXMKLWZvciBcY29kZXtjX3VieXRlfS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dW5zaWduZWQgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IgYWNjZXB0cwotYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3Vsb25nbG9uZ317XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIGxvbmcgbG9uZ30gZGF0YXR5cGUuICBUaGUgY29uc3RydWN0b3IKLWFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplcjsgbm8gb3ZlcmZsb3cgY2hlY2tpbmcgaXMgZG9uZS4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3VzaG9ydH17XG9wdGlvbmFse3ZhbHVlfX0KLVJlcHJlc2VudHMgYSBDIFxjb2Rle3Vuc2lnbmVkIHNob3J0fSBkYXRhdHlwZS4gIFRoZSBjb25zdHJ1Y3RvciBhY2NlcHRzCi1hbiBvcHRpb25hbCBpbnRlZ2VyIGluaXRpYWxpemVyOyBubyBvdmVyZmxvdyBjaGVja2luZyBpcyBkb25lLgotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e2Nfdm9pZF9wfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7dm9pZCAqfSB0eXBlLiAgVGhlIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFzCi1pbnRlZ2VyLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwgaW50ZWdlciBpbml0aWFsaXplci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyfXtcb3B0aW9uYWx7dmFsdWV9fQotUmVwcmVzZW50cyBhIEMgXGNvZGV7d2NoYXJfdH0gZGF0YXR5cGUsIGFuZCBpbnRlcnByZXRzIHRoZSB2YWx1ZSBhcyBhCi1zaW5nbGUgY2hhcmFjdGVyIHVuaWNvZGUgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4gb3B0aW9uYWwKLXN0cmluZyBpbml0aWFsaXplciwgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIG11c3QgYmUgZXhhY3RseSBvbmUKLWNoYXJhY3Rlci4KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtjX3djaGFyX3B9e1xvcHRpb25hbHt2YWx1ZX19Ci1SZXByZXNlbnRzIGEgQyBcY29kZXt3Y2hhcl90ICp9IGRhdGF0eXBlLCB3aGljaCBtdXN0IGJlIGEgcG9pbnRlciB0byBhCi16ZXJvLXRlcm1pbmF0ZWQgd2lkZSBjaGFyYWN0ZXIgc3RyaW5nLiAgVGhlIGNvbnN0cnVjdG9yIGFjY2VwdHMgYW4KLWludGVnZXIgYWRkcmVzcywgb3IgYSBzdHJpbmcuCi0lIFhYWCBFeHBsYWluIHRoZSBkaWZmZXJlbmNlIHRvIFBPSU5URVIoY193Y2hhcikKLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtIUkVTVUxUfXt9Ci1XaW5kb3dzIG9ubHk6IFJlcHJlc2VudHMgYSBcY29kZXtIUkVTVUxUfSB2YWx1ZSwgd2hpY2ggY29udGFpbnMKLXN1Y2Nlc3Mgb3IgZXJyb3IgaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gb3IgbWV0aG9kIGNhbGwuCi1cZW5ke2NsYXNzZGVzY30KLQotJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQotJSBzdHJ1Y3R1cmVkIGRhdGEgdHlwZXMKLVxzdWJzdWJzZWN0aW9ue3N0cnVjdHVyZWQgZGF0YSB0eXBlc30KLQotXGJlZ2lue2NsYXNzZGVzY317QmlnRW5kaWFuU3RydWN0dXJlfXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317TGl0dGxlRW5kaWFuU3RydWN0dXJlfXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2NsYXNzZGVzY317U3RydWN0dXJlfXt9Ci1CYXNlIGNsYXNzIGZvciBTdHJ1Y3R1cmUgZGF0YSB0eXBlcy4KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1VuaW9ufXt9Ci1cZW5ke2NsYXNzZGVzY30KLQotCi0lJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCi0lIGxpYnJhcmllcwotXHN1YnN1YnNlY3Rpb257bGlicmFyaWVzfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtDRExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317Y2RsbH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e0xpYnJhcnlMb2FkZXJ9e2RsbHR5cGV9Ci0KLVxiZWdpbnttZW1iZXJkZXNjfXtMb2FkTGlicmFyeX17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KLVxlbmR7bWVtYmVyZGVzY30KLQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e09sZURMTH17bmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZX0KLVxlbmR7Y2xhc3NkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e29sZWRsbH0KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e3B5X29iamVjdH17fQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntjbGFzc2Rlc2N9e1B5RExMfXtuYW1lLCBtb2RlPVJUTERfTE9DQUwsIGhhbmRsZT1Ob25lfQotXGVuZHtjbGFzc2Rlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317cHlkbGx9e30KLVxlbmR7ZGF0YWRlc2N9Ci0KLVxiZWdpbntkYXRhZGVzY317UlRMRF9HTE9CQUx9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57ZGF0YWRlc2N9e1JUTERfTE9DQUx9Ci1cZW5ke2RhdGFkZXNjfQotCi1cYmVnaW57Y2xhc3NkZXNjfXtXaW5ETEx9e25hbWUsIG1vZGU9UlRMRF9MT0NBTCwgaGFuZGxlPU5vbmV9Ci1cZW5ke2NsYXNzZGVzY30KLQotXGJlZ2lue2RhdGFkZXNjfXt3aW5kbGx9Ci1cZW5ke2RhdGFkZXNjfQotCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYmRpZmZsaWIudGV4IGIvRG9jL2xpYi9saWJkaWZmbGliLnRleAppbmRleCA3NjVhY2NjLi5hY2I1ZWQxIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmRpZmZsaWIudGV4CisrKyBiL0RvYy9saWIvbGliZGlmZmxpYi50ZXgKQEAgLTQxOSw2ICs0MTksMTYgQEAKICAgbGVuKFx2YXJ7Yn0pLCAwKX0uICBJdCBpcyB0aGUgb25seSB0cmlwbGUgd2l0aCBcY29kZXtcdmFye259ID09IDB9LgogICAlIEV4cGxhaW4gd2h5IGEgZHVtbXkgaXMgdXNlZCEKIAorICBJZgorICBcY29kZXsoXHZhcntpfSwgXHZhcntqfSwgXHZhcntufSl9IGFuZAorICBcY29kZXsoXHZhcntpJ30sIFx2YXJ7aid9LCBcdmFye24nfSl9IGFyZSBhZGphY2VudCB0cmlwbGVzIGluIHRoZSBsaXN0LAorICBhbmQgdGhlIHNlY29uZCBpcyBub3QgdGhlIGxhc3QgdHJpcGxlIGluIHRoZSBsaXN0LCB0aGVuCisgIFxjb2Rle1x2YXJ7aX0rXHZhcntufSAhPSBcdmFye2knfX0gb3IKKyAgXGNvZGV7XHZhcntqfStcdmFye259ICE9IFx2YXJ7aid9fTsgaW4gb3RoZXIgd29yZHMsIGFkamFjZW50IHRyaXBsZXMKKyAgYWx3YXlzIGRlc2NyaWJlIG5vbi1hZGphY2VudCBlcXVhbCBibG9ja3MuCisgIFx2ZXJzaW9uY2hhbmdlZFtUaGUgZ3VhcmFudGVlIHRoYXQgYWRqYWNlbnQgdHJpcGxlcyBhbHdheXMgZGVzY3JpYmUKKyAgICAgICAgICAgICAgICAgIG5vbi1hZGphY2VudCBibG9ja3Mgd2FzIGltcGxlbWVudGVkXXsyLjV9CisKIFxiZWdpbnt2ZXJiYXRpbX0KID4+PiBzID0gU2VxdWVuY2VNYXRjaGVyKE5vbmUsICJhYnhjZCIsICJhYmNkIikKID4+PiBzLmdldF9tYXRjaGluZ19ibG9ja3MoKQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJldHJlZS50ZXggYi9Eb2MvbGliL2xpYmV0cmVlLnRleApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI5ODg3Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jL2xpYi9saWJldHJlZS50ZXgKQEAgLTAsMCArMSwzNjcgQEAKK1xzZWN0aW9ue1xtb2R1bGV7ZWxlbWVudHRyZWV9IC0tLSBUaGUgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIE1vZHVsZX0KK1xkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtlbGVtZW50dHJlZX0KK1xtb2R1bGVhdXRob3J7RnJlZHJpayBMdW5kaH17ZnJlZHJpa0BweXRob253YXJlLmNvbX0KK1xtb2R1bGVzeW5vcHNpc3tUaGlzIG1vZHVsZSBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMKK29mIHRoZSBFbGVtZW50IGFuZCBFbGVtZW50VHJlZSB0eXBlcywgcGx1cyBzdXBwb3J0IGNsYXNzZXMuCisKK0EgQyB2ZXJzaW9uIG9mIHRoaXMgQVBJIGlzIGF2YWlsYWJsZSBhcyB4bWwuZXRyZWUuY0VsZW1lbnRUcmVlLn0KK1x2ZXJzaW9uYWRkZWR7Mi41fQorCisKK1xzdWJzZWN0aW9ue092ZXJ2aWV3XGxhYmVse2VsZW1lbnR0cmVlLW92ZXJ2aWV3fX0KKworVGhlIEVsZW1lbnQgdHlwZSBpcyBhIGZsZXhpYmxlIGNvbnRhaW5lciBvYmplY3QsIGRlc2lnbmVkIHRvIHN0b3JlCitoaWVyYXJjaGljYWwgZGF0YSBzdHJ1Y3R1cmVzIGluIG1lbW9yeS4gVGhlIHR5cGUgY2FuIGJlIGRlc2NyaWJlZCBhcyBhCitjcm9zcyBiZXR3ZWVuIGEgbGlzdCBhbmQgYSBkaWN0aW9uYXJ5LgorCitFYWNoIGVsZW1lbnQgaGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIGl0OgorXGJlZ2lue2l0ZW1pemV9CitcaXRlbSB7fSAKK2EgdGFnIHdoaWNoIGlzIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHdoYXQga2luZCBvZiBkYXRhCit0aGlzIGVsZW1lbnQgcmVwcmVzZW50cyAodGhlIGVsZW1lbnQgdHlwZSwgaW4gb3RoZXIgd29yZHMpLgorCitcaXRlbSB7fSAKK2EgbnVtYmVyIG9mIGF0dHJpYnV0ZXMsIHN0b3JlZCBpbiBhIFB5dGhvbiBkaWN0aW9uYXJ5LgorCitcaXRlbSB7fSAKK2EgdGV4dCBzdHJpbmcuCisKK1xpdGVtIHt9IAorYW4gb3B0aW9uYWwgdGFpbCBzdHJpbmcuCisKK1xpdGVtIHt9IAorYSBudW1iZXIgb2YgY2hpbGQgZWxlbWVudHMsIHN0b3JlZCBpbiBhIFB5dGhvbiBzZXF1ZW5jZQorCitcZW5ke2l0ZW1pemV9CisKK1RvIGNyZWF0ZSBhbiBlbGVtZW50IGluc3RhbmNlLCB1c2UgdGhlIEVsZW1lbnQgb3IgU3ViRWxlbWVudCBmYWN0b3J5CitmdW5jdGlvbnMuCisKK1RoZSBFbGVtZW50VHJlZSBjbGFzcyBjYW4gYmUgdXNlZCB0byB3cmFwIGFuIGVsZW1lbnQKK3N0cnVjdHVyZSwgYW5kIGNvbnZlcnQgaXQgZnJvbSBhbmQgdG8gWE1MLgorCisKK1xzdWJzZWN0aW9ue0Z1bmN0aW9uc1xsYWJlbHtlbGVtZW50dHJlZS1mdW5jdGlvbnN9fQorCitcYmVnaW57ZnVuY2Rlc2N9e0NvbW1lbnR9e1xvcHRpb25hbHt0ZXh0fX0KK0NvbW1lbnQgZWxlbWVudCBmYWN0b3J5LiAgVGhpcyBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZXMgYSBzcGVjaWFsCitlbGVtZW50IHRoYXQgd2lsbCBiZSBzZXJpYWxpemVkIGFzIGFuIFhNTCBjb21tZW50LgorVGhlIGNvbW1lbnQgc3RyaW5nIGNhbiBiZSBlaXRoZXIgYW4gOC1iaXQgQVNDSUkgc3RyaW5nIG9yIGEgVW5pY29kZQorc3RyaW5nLgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb21tZW50IHN0cmluZy4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gZWxlbWVudCBpbnN0YW5jZSwgcmVwcmVzZW50aW5nIGEgY29tbWVudC4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317ZHVtcH17ZWxlbX0KK1dyaXRlcyBhbiBlbGVtZW50IHRyZWUgb3IgZWxlbWVudCBzdHJ1Y3R1cmUgdG8gc3lzLnN0ZG91dC4gIFRoaXMKK2Z1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seS4KKworVGhlIGV4YWN0IG91dHB1dCBmb3JtYXQgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LiAgSW4gdGhpcwordmVyc2lvbiwgaXQncyB3cml0dGVuIGFzIGFuIG9yZGluYXJ5IFhNTCBmaWxlLgorCitcdmFye2VsZW19IGlzIGFuIGVsZW1lbnQgdHJlZSBvciBhbiBpbmRpdmlkdWFsIGVsZW1lbnQuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e0VsZW1lbnR9e3RhZ1xvcHRpb25hbHssIGF0dHJpYn1cb3B0aW9uYWx7LCAqKmV4dHJhfX0KK0VsZW1lbnQgZmFjdG9yeS4gIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBvYmplY3QgaW1wbGVtZW50aW5nIHRoZQorc3RhbmRhcmQgRWxlbWVudCBpbnRlcmZhY2UuICBUaGUgZXhhY3QgY2xhc3Mgb3IgdHlwZSBvZiB0aGF0IG9iamVjdAoraXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LCBidXQgaXQgd2lsbCBhbHdheXMgYmUgY29tcGF0aWJsZSB3aXRoCit0aGUge1xffUVsZW1lbnRJbnRlcmZhY2UgY2xhc3MgaW4gdGhpcyBtb2R1bGUuCisKK1RoZSBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCitlaXRoZXIgOC1iaXQgQVNDSUkgc3RyaW5ncyBvciBVbmljb2RlIHN0cmluZ3MuCitcdmFye3RhZ30gaXMgdGhlIGVsZW1lbnQgbmFtZS4KK1x2YXJ7YXR0cmlifSBpcyBhbiBvcHRpb25hbCBkaWN0aW9uYXJ5LCBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KK1x2YXJ7ZXh0cmF9IGNvbnRhaW5zIGFkZGl0aW9uYWwgYXR0cmlidXRlcywgZ2l2ZW4gYXMga2V5d29yZCBhcmd1bWVudHMuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2Zyb21zdHJpbmd9e3RleHR9CitQYXJzZXMgYW4gWE1MIHNlY3Rpb24gZnJvbSBhIHN0cmluZyBjb25zdGFudC4gIFNhbWUgYXMgWE1MLgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIFhNTCBkYXRhLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBFbGVtZW50IGluc3RhbmNlLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtpc2VsZW1lbnR9e2VsZW1lbnR9CitDaGVja3MgaWYgYW4gb2JqZWN0IGFwcGVhcnMgdG8gYmUgYSB2YWxpZCBlbGVtZW50IG9iamVjdC4KK1x2YXJ7ZWxlbWVudH0gaXMgYW4gZWxlbWVudCBpbnN0YW5jZS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQSB0cnVlIHZhbHVlIGlmIHRoaXMgaXMgYW4gZWxlbWVudCBvYmplY3QuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2l0ZXJwYXJzZX17c291cmNlXG9wdGlvbmFseywgZXZlbnRzfX0KK1BhcnNlcyBhbiBYTUwgc2VjdGlvbiBpbnRvIGFuIGVsZW1lbnQgdHJlZSBpbmNyZW1lbnRhbGx5LCBhbmQgcmVwb3J0cword2hhdCdzIGdvaW5nIG9uIHRvIHRoZSB1c2VyLgorXHZhcntzb3VyY2V9IGlzIGEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwgZGF0YS4KK1x2YXJ7ZXZlbnRzfSBpcyBhIGxpc3Qgb2YgZXZlbnRzIHRvIHJlcG9ydCBiYWNrLiAgSWYgb21pdHRlZCwgb25seSBgYGVuZCcnCitldmVudHMgYXJlIHJlcG9ydGVkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBIChldmVudCwgZWxlbSkgaXRlcmF0b3IuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3BhcnNlfXtzb3VyY2Vcb3B0aW9uYWx7LCBwYXJzZXJ9fQorUGFyc2VzIGFuIFhNTCBzZWN0aW9uIGludG8gYW4gZWxlbWVudCB0cmVlLgorXHZhcntzb3VyY2V9IGlzIGEgZmlsZW5hbWUgb3IgZmlsZSBvYmplY3QgY29udGFpbmluZyBYTUwgZGF0YS4KK1x2YXJ7cGFyc2VyfSBpcyBhbiBvcHRpb25hbCBwYXJzZXIgaW5zdGFuY2UuICBJZiBub3QgZ2l2ZW4sIHRoZQorc3RhbmRhcmQgWE1MVHJlZUJ1aWxkZXIgcGFyc2VyIGlzIHVzZWQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIEVsZW1lbnRUcmVlIGluc3RhbmNlCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1Byb2Nlc3NpbmdJbnN0cnVjdGlvbn17dGFyZ2V0XG9wdGlvbmFseywgdGV4dH19CitQSSBlbGVtZW50IGZhY3RvcnkuICBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gY3JlYXRlcyBhIHNwZWNpYWwgZWxlbWVudAordGhhdCB3aWxsIGJlIHNlcmlhbGl6ZWQgYXMgYW4gWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCitcdmFye3RhcmdldH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgUEkgdGFyZ2V0LgorXHZhcnt0ZXh0fSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBQSSBjb250ZW50cywgaWYgZ2l2ZW4uCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UsIHJlcHJlc2VudGluZyBhIFBJLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtTdWJFbGVtZW50fXtwYXJlbnQsIHRhZ1xvcHRpb25hbHssIGF0dHJpYn0gXG9wdGlvbmFseywgKipleHRyYX19CitTdWJlbGVtZW50IGZhY3RvcnkuICBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gZWxlbWVudCBpbnN0YW5jZSwgYW5kCithcHBlbmRzIGl0IHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQuCisKK1RoZSBlbGVtZW50IG5hbWUsIGF0dHJpYnV0ZSBuYW1lcywgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlCitlaXRoZXIgOC1iaXQgQVNDSUkgc3RyaW5ncyBvciBVbmljb2RlIHN0cmluZ3MuCitcdmFye3BhcmVudH0gaXMgdGhlIHBhcmVudCBlbGVtZW50LgorXHZhcnt0YWd9IGlzIHRoZSBzdWJlbGVtZW50IG5hbWUuCitcdmFye2F0dHJpYn0gaXMgYW4gb3B0aW9uYWwgZGljdGlvbmFyeSwgY29udGFpbmluZyBlbGVtZW50IGF0dHJpYnV0ZXMuCitcdmFye2V4dHJhfSBjb250YWlucyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMsIGdpdmVuIGFzIGtleXdvcmQgYXJndW1lbnRzLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBlbGVtZW50IGluc3RhbmNlLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt0b3N0cmluZ317ZWxlbWVudFxvcHRpb25hbHssIGVuY29kaW5nfX0KK0dlbmVyYXRlcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBYTUwgZWxlbWVudCwgaW5jbHVkaW5nIGFsbAorc3ViZWxlbWVudHMuCitcdmFye2VsZW1lbnR9IGlzIGFuIEVsZW1lbnQgaW5zdGFuY2UuCitcdmFye2VuY29kaW5nfSBpcyB0aGUgb3V0cHV0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gZW5jb2RlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgWE1MIGRhdGEuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e1hNTH17dGV4dH0KK1BhcnNlcyBhbiBYTUwgc2VjdGlvbiBmcm9tIGEgc3RyaW5nIGNvbnN0YW50LiAgVGhpcyBmdW5jdGlvbiBjYW4KK2JlIHVzZWQgdG8gZW1iZWQgYGBYTUwgbGl0ZXJhbHMnJyBpbiBQeXRob24gY29kZS4KK1x2YXJ7dGV4dH0gaXMgYSBzdHJpbmcgY29udGFpbmluZyBYTUwgZGF0YS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gRWxlbWVudCBpbnN0YW5jZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317WE1MSUR9e3RleHR9CitQYXJzZXMgYW4gWE1MIHNlY3Rpb24gZnJvbSBhIHN0cmluZyBjb25zdGFudCwgYW5kIGFsc28gcmV0dXJucworYSBkaWN0aW9uYXJ5IHdoaWNoIG1hcHMgZnJvbSBlbGVtZW50IGlkOnMgdG8gZWxlbWVudHMuCitcdmFye3RleHR9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgWE1MIGRhdGEuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0EgdHVwbGUgY29udGFpbmluZyBhbiBFbGVtZW50IGluc3RhbmNlIGFuZCBhIGRpY3Rpb25hcnkuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke2Z1bmNkZXNjfQorCisKK1xzdWJzZWN0aW9ue0VsZW1lbnRUcmVlIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtZWxlbWVudHRyZWUtb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e0VsZW1lbnRUcmVlfXtcb3B0aW9uYWx7ZWxlbWVudCx9IFxvcHRpb25hbHtmaWxlfX0KK0VsZW1lbnRUcmVlIHdyYXBwZXIgY2xhc3MuICBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gZW50aXJlIGVsZW1lbnQKK2hpZXJhcmNoeSwgYW5kIGFkZHMgc29tZSBleHRyYSBzdXBwb3J0IGZvciBzZXJpYWxpemF0aW9uIHRvIGFuZCBmcm9tCitzdGFuZGFyZCBYTUwuCisKK1x2YXJ7ZWxlbWVudH0gaXMgdGhlIHJvb3QgZWxlbWVudC4KK1RoZSB0cmVlIGlzIGluaXRpYWxpemVkIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZSBYTUwgXHZhcntmaWxlfSBpZiBnaXZlbi4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317X3NldHJvb3R9e2VsZW1lbnR9CitSZXBsYWNlcyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGlzIHRyZWUuICBUaGlzIGRpc2NhcmRzIHRoZQorY3VycmVudCBjb250ZW50cyBvZiB0aGUgdHJlZSwgYW5kIHJlcGxhY2VzIGl0IHdpdGggdGhlIGdpdmVuCitlbGVtZW50LiAgVXNlIHdpdGggY2FyZS4KK1x2YXJ7ZWxlbWVudH0gaXMgYW4gZWxlbWVudCBpbnN0YW5jZS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmR9e3BhdGh9CitGaW5kcyB0aGUgZmlyc3QgdG9wbGV2ZWwgZWxlbWVudCB3aXRoIGdpdmVuIHRhZy4KK1NhbWUgYXMgZ2V0cm9vdCgpLmZpbmQocGF0aCkuCitcdmFye3BhdGh9IGlzIHRoZSBlbGVtZW50IHRvIGxvb2sgZm9yLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgZmlyc3QgbWF0Y2hpbmcgZWxlbWVudCwgb3IgTm9uZSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2ZpbmRhbGx9e3BhdGh9CitGaW5kcyBhbGwgdG9wbGV2ZWwgZWxlbWVudHMgd2l0aCB0aGUgZ2l2ZW4gdGFnLgorU2FtZSBhcyBnZXRyb290KCkuZmluZGFsbChwYXRoKS4KK1x2YXJ7cGF0aH0gaXMgdGhlIGVsZW1lbnQgdG8gbG9vayBmb3IuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0EgbGlzdCBvciBpdGVyYXRvciBjb250YWluaW5nIGFsbCBtYXRjaGluZyBlbGVtZW50cywKK2luIHNlY3Rpb24gb3JkZXIuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmaW5kdGV4dH17cGF0aFxvcHRpb25hbHssIGRlZmF1bHR9fQorRmluZHMgdGhlIGVsZW1lbnQgdGV4dCBmb3IgdGhlIGZpcnN0IHRvcGxldmVsIGVsZW1lbnQgd2l0aCBnaXZlbgordGFnLiAgU2FtZSBhcyBnZXRyb290KCkuZmluZHRleHQocGF0aCkuCitcdmFye3BhdGh9IGlzIHRoZSB0b3BsZXZlbCBlbGVtZW50IHRvIGxvb2sgZm9yLgorXHZhcntkZWZhdWx0fSBpcyB0aGUgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgZm91bmQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK1RoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQsIG9yIHRoZQorZGVmYXVsdCB2YWx1ZSBubyBlbGVtZW50IHdhcyBmb3VuZC4gIE5vdGUgdGhhdCBpZiB0aGUgZWxlbWVudAoraGFzIGlzIGZvdW5kLCBidXQgaGFzIG5vIHRleHQgY29udGVudCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbgorZW1wdHkgc3RyaW5nLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0aXRlcmF0b3J9e1xvcHRpb25hbHt0YWd9fQorQ3JlYXRlcyBhIHRyZWUgaXRlcmF0b3IgZm9yIHRoZSByb290IGVsZW1lbnQuICBUaGUgaXRlcmF0b3IgbG9vcHMKK292ZXIgYWxsIGVsZW1lbnRzIGluIHRoaXMgdHJlZSwgaW4gc2VjdGlvbiBvcmRlci4KK1x2YXJ7dGFnfSBpcyB0aGUgdGFnIHRvIGxvb2sgZm9yIChkZWZhdWx0IGlzIHRvIHJldHVybiBhbGwgZWxlbWVudHMpCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGl0ZXJhdG9yLgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0cm9vdH17fQorR2V0cyB0aGUgcm9vdCBlbGVtZW50IGZvciB0aGlzIHRyZWUuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIGVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtwYXJzZX17c291cmNlXG9wdGlvbmFseywgcGFyc2VyfX0KK0xvYWRzIGFuIGV4dGVybmFsIFhNTCBzZWN0aW9uIGludG8gdGhpcyBlbGVtZW50IHRyZWUuCitcdmFye3NvdXJjZX0gaXMgYSBmaWxlIG5hbWUgb3IgZmlsZSBvYmplY3QuCitcdmFye3BhcnNlcn0gaXMgYW4gb3B0aW9uYWwgcGFyc2VyIGluc3RhbmNlLiAgSWYgbm90IGdpdmVuLCB0aGUKK3N0YW5kYXJkIFhNTFRyZWVCdWlsZGVyIHBhcnNlciBpcyB1c2VkLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgc2VjdGlvbiByb290IGVsZW1lbnQuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXt3cml0ZX17ZmlsZVxvcHRpb25hbHssIGVuY29kaW5nfX0KK1dyaXRlcyB0aGUgZWxlbWVudCB0cmVlIHRvIGEgZmlsZSwgYXMgWE1MLgorXHZhcntmaWxlfSBpcyBhIGZpbGUgbmFtZSwgb3IgYSBmaWxlIG9iamVjdCBvcGVuZWQgZm9yIHdyaXRpbmcuCitcdmFye2VuY29kaW5nfSBpcyB0aGUgb3V0cHV0IGVuY29kaW5nIChkZWZhdWx0IGlzIFVTLUFTQ0lJKS4KK1xlbmR7bWV0aG9kZGVzY30KKworCitcc3Vic2VjdGlvbntRTmFtZSBPYmplY3RzXGxhYmVse2VsZW1lbnR0cmVlLXFuYW1lLW9iamVjdHN9fQorCitcYmVnaW57Y2xhc3NkZXNjfXtRTmFtZX17dGV4dF9vcl91cmlcb3B0aW9uYWx7LCB0YWd9fQorUU5hbWUgd3JhcHBlci4gIFRoaXMgY2FuIGJlIHVzZWQgdG8gd3JhcCBhIFFOYW1lIGF0dHJpYnV0ZSB2YWx1ZSwgaW4KK29yZGVyIHRvIGdldCBwcm9wZXIgbmFtZXNwYWNlIGhhbmRsaW5nIG9uIG91dHB1dC4KK1x2YXJ7dGV4dF9vcl91cml9IGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIFFOYW1lIHZhbHVlLAoraW4gdGhlIGZvcm0ge1x7fXVyaXtcfX1sb2NhbCwgb3IsIGlmIHRoZSB0YWcgYXJndW1lbnQgaXMgZ2l2ZW4sCit0aGUgVVJJIHBhcnQgb2YgYSBRTmFtZS4KK0lmIFx2YXJ7dGFnfSBpcyBnaXZlbiwgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzCithbiBVUkksIGFuZCB0aGlzIGFyZ3VtZW50IGlzIGludGVycHJldGVkIGFzIGEgbG9jYWwgbmFtZS4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorQW4gb3BhcXVlIG9iamVjdCwgcmVwcmVzZW50aW5nIHRoZSBRTmFtZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7Y2xhc3NkZXNjfQorCisKK1xzdWJzZWN0aW9ue1RyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUtdHJlZWJ1aWxkZXItb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1RyZWVCdWlsZGVyfXtcb3B0aW9uYWx7ZWxlbWVudF9mYWN0b3J5fX0KK0dlbmVyaWMgZWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlci4gIFRoaXMgYnVpbGRlciBjb252ZXJ0cyBhIHNlcXVlbmNlCitvZiBzdGFydCwgZGF0YSwgYW5kIGVuZCBtZXRob2QgY2FsbHMgdG8gYSB3ZWxsLWZvcm1lZCBlbGVtZW50IHN0cnVjdHVyZS4KK1lvdSBjYW4gdXNlIHRoaXMgY2xhc3MgdG8gYnVpbGQgYW4gZWxlbWVudCBzdHJ1Y3R1cmUgdXNpbmcgYSBjdXN0b20gWE1MCitwYXJzZXIsIG9yIGEgcGFyc2VyIGZvciBzb21lIG90aGVyIFhNTC1saWtlIGZvcm1hdC4KK1RoZSBcdmFye2VsZW1lbnRfZmFjdG9yeX0gaXMgY2FsbGVkIHRvIGNyZWF0ZSBuZXcgRWxlbWVudCBpbnN0YW5jZXMgd2hlbgorZ2l2ZW4uCitcZW5ke2NsYXNzZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2Nsb3NlfXt9CitGbHVzaGVzIHRoZSBwYXJzZXIgYnVmZmVycywgYW5kIHJldHVybnMgdGhlIHRvcGxldmVsIGRvY3VtZW4KK2VsZW1lbnQuCisKK1xiZWdpbntkYXRhZGVzY25pfXtSZXR1cm5zOn0KK0FuIEVsZW1lbnQgaW5zdGFuY2UuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtkYXRhfXtkYXRhfQorQWRkcyB0ZXh0IHRvIHRoZSBjdXJyZW50IGVsZW1lbnQuCitcdmFye2RhdGF9IGlzIGEgc3RyaW5nLiAgVGhpcyBzaG91bGQgYmUgZWl0aGVyIGFuIDgtYml0IHN0cmluZworY29udGFpbmluZyBBU0NJSSB0ZXh0LCBvciBhIFVuaWNvZGUgc3RyaW5nLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZW5kfXt0YWd9CitDbG9zZXMgdGhlIGN1cnJlbnQgZWxlbWVudC4KK1x2YXJ7dGFnfSBpcyB0aGUgZWxlbWVudCBuYW1lLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitUaGUgY2xvc2VkIGVsZW1lbnQuCitcZW5ke2RhdGFkZXNjbml9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtzdGFydH17dGFnLCBhdHRyc30KK09wZW5zIGEgbmV3IGVsZW1lbnQuCitcdmFye3RhZ30gaXMgdGhlIGVsZW1lbnQgbmFtZS4KK1x2YXJ7YXR0cnN9IGlzIGEgZGljdGlvbmFyeSBjb250YWluaW5nIGVsZW1lbnQgYXR0cmlidXRlcy4KKworXGJlZ2lue2RhdGFkZXNjbml9e1JldHVybnM6fQorVGhlIG9wZW5lZCBlbGVtZW50LgorXGVuZHtkYXRhZGVzY25pfQorXGVuZHttZXRob2RkZXNjfQorCisKK1xzdWJzZWN0aW9ue1hNTFRyZWVCdWlsZGVyIE9iamVjdHNcbGFiZWx7ZWxlbWVudHRyZWUteG1sdHJlZWJ1aWxkZXItb2JqZWN0c319CisKK1xiZWdpbntjbGFzc2Rlc2N9e1hNTFRyZWVCdWlsZGVyfXtcb3B0aW9uYWx7aHRtbCx9IFxvcHRpb25hbHt0YXJnZXR9fQorRWxlbWVudCBzdHJ1Y3R1cmUgYnVpbGRlciBmb3IgWE1MIHNvdXJjZSBkYXRhLCBiYXNlZCBvbiB0aGUKK2V4cGF0IHBhcnNlci4KK1x2YXJ7aHRtbH0gYXJlIHByZWRlZmluZWQgSFRNTCBlbnRpdGllcy4gIFRoaXMgZmxhZyBpcyBub3Qgc3VwcG9ydGVkCitieSB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4KK1x2YXJ7dGFyZ2V0fSBpcyB0aGUgdGFyZ2V0IG9iamVjdC4gIElmIG9taXR0ZWQsIHRoZSBidWlsZGVyIHVzZXMgYW4KK2luc3RhbmNlIG9mIHRoZSBzdGFuZGFyZCBUcmVlQnVpbGRlciBjbGFzcy4KK1xlbmR7Y2xhc3NkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KK0ZpbmlzaGVzIGZlZWRpbmcgZGF0YSB0byB0aGUgcGFyc2VyLgorCitcYmVnaW57ZGF0YWRlc2NuaX17UmV0dXJuczp9CitBbiBlbGVtZW50IHN0cnVjdHVyZS4KK1xlbmR7ZGF0YWRlc2NuaX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2RvY3R5cGV9e25hbWUsIHB1YmlkLCBzeXN0ZW19CitIYW5kbGVzIGEgZG9jdHlwZSBkZWNsYXJhdGlvbi4KK1x2YXJ7bmFtZX0gaXMgdGhlIGRvY3R5cGUgbmFtZS4KK1x2YXJ7cHViaWR9IGlzIHRoZSBwdWJsaWMgaWRlbnRpZmllci4KK1x2YXJ7c3lzdGVtfSBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtmZWVkfXtkYXRhfQorRmVlZHMgZGF0YSB0byB0aGUgcGFyc2VyLgorCitcdmFye2RhdGF9IGlzIGVuY29kZWQgZGF0YS4KK1xlbmR7bWV0aG9kZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZnVuY3MudGV4IGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKaW5kZXggODkwNGQ1Zi4uNjViMGJmNSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJmdW5jcy50ZXgKKysrIGIvRG9jL2xpYi9saWJmdW5jcy50ZXgKQEAgLTQwMSw3NyArNDAxLDI3IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2ZpbGV9e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGJ1ZnNpemV9fX0KLSAgUmV0dXJuIGEgbmV3IGZpbGUgb2JqZWN0IChkZXNjcmliZWQgaW4KLSAgc2VjdGlvbn5ccmVme2JsdGluLWZpbGUtb2JqZWN0c30sIGBgXHVsaW5re0ZpbGUKLSAgT2JqZWN0c317Ymx0aW4tZmlsZS1vYmplY3RzLmh0bWx9JycpLgotICBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIFxjb2Rle3N0ZGlvfSdzCi0gIFxjZnVuY3Rpb257Zm9wZW4oKX06IFx2YXJ7ZmlsZW5hbWV9IGlzIHRoZSBmaWxlIG5hbWUgdG8gYmUgb3BlbmVkLAotICBcdmFye21vZGV9IGluZGljYXRlcyBob3cgdGhlIGZpbGUgaXMgdG8gYmUgb3BlbmVkOiBcY29kZXsncid9IGZvcgotICByZWFkaW5nLCBcY29kZXsndyd9IGZvciB3cml0aW5nICh0cnVuY2F0aW5nIGFuIGV4aXN0aW5nIGZpbGUpLCBhbmQKLSAgXGNvZGV7J2EnfSBvcGVucyBpdCBmb3IgYXBwZW5kaW5nICh3aGljaCBvbiBcZW1waHtzb21lfSBcVU5JWHt9Ci0gIHN5c3RlbXMgbWVhbnMgdGhhdCBcZW1waHthbGx9IHdyaXRlcyBhcHBlbmQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZSwKLSAgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uKS4KKyAgQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoZSBcY2xhc3N7ZmlsZX0gdHlwZSwgZGVzY3JpYmVkIGZ1cnRoZXIgCisgIGluIHNlY3Rpb25+XHJlZntibHRpbi1maWxlLW9iamVjdHN9LCBgYFx1bGlua3tGaWxlCisgIE9iamVjdHN9e2JsdGluLWZpbGUtb2JqZWN0cy5odG1sfScnLiAgVGhlIGNvbnN0cnVjdG9yJ3MgYXJndW1lbnRzCisgIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBvZiB0aGUgXGZ1bmN0aW9ue29wZW4oKX0gYnVpbHQtaW4gZnVuY3Rpb24KKyAgZGVzY3JpYmVkIGJlbG93LgogCi0gIE1vZGVzIFxjb2RleydyKyd9LCBcY29kZXsndysnfSBhbmQgXGNvZGV7J2ErJ30gb3BlbiB0aGUgZmlsZSBmb3IKLSAgdXBkYXRpbmcgKG5vdGUgdGhhdCBcY29kZXsndysnfSB0cnVuY2F0ZXMgdGhlIGZpbGUpLiAgQXBwZW5kCi0gIFxjb2RleydiJ30gdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgb24gc3lzdGVtcwotICB0aGF0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBiaW5hcnkgYW5kIHRleHQgZmlsZXMgKGVsc2UgaXQgaXMKLSAgaWdub3JlZCkuICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLCBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzCi0gIHJhaXNlZC4KLSAgCi0gIEluIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBcY2Z1bmN0aW9ue2ZvcGVuKCl9IHZhbHVlcyBcdmFye21vZGV9Ci0gIG1heSBiZSBcY29kZXsnVSd9IG9yIFxjb2RleydyVSd9LiBJZiBQeXRob24gaXMgYnVpbHQgd2l0aCB1bml2ZXJzYWwKLSAgbmV3bGluZSBzdXBwb3J0ICh0aGUgZGVmYXVsdCkgdGhlIGZpbGUgaXMgb3BlbmVkIGFzIGEgdGV4dCBmaWxlLCBidXQKLSAgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIFxjb2RleydcZSBuJ30sIHRoZSBVbml4IGVuZC1vZi1saW5lCi0gIGNvbnZlbnRpb24sCi0gIFxjb2RleydcZSByJ30sIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBvciBcY29kZXsnXGUgclxlIG4nfSwgdGhlIFdpbmRvd3MKLSAgY29udmVudGlvbi4gQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcwotICBcY29kZXsnXGUgbid9Ci0gIGJ5IHRoZSBQeXRob24gcHJvZ3JhbS4gSWYgUHl0aG9uIGlzIGJ1aWx0IHdpdGhvdXQgdW5pdmVyc2FsIG5ld2xpbmUgc3VwcG9ydAotICBcdmFye21vZGV9IFxjb2RleydVJ30gaXMgdGhlIHNhbWUgYXMgbm9ybWFsIHRleHQgbW9kZS4gIE5vdGUgdGhhdAotICBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZSBhbiBhdHRyaWJ1dGUgY2FsbGVkCi0gIFxtZW1iZXJ7bmV3bGluZXN9IHdoaWNoIGhhcyBhIHZhbHVlIG9mIFxjb2Rle05vbmV9IChpZiBubyBuZXdsaW5lcwotICBoYXZlIHlldCBiZWVuIHNlZW4pLCBcY29kZXsnXGUgbid9LCBcY29kZXsnXGUgcid9LCBcY29kZXsnXGUgclxlIG4nfSwKLSAgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLgotCi0gIFB5dGhvbiBlbmZvcmNlcyB0aGF0IHRoZSBtb2RlLCBhZnRlciBzdHJpcHBpbmcgXGNvZGV7J1UnfSwgYmVnaW5zIHdpdGgKLSAgXGNvZGV7J3InfSwgXGNvZGV7J3cnfSBvciBcY29kZXsnYSd9LgotCi0gIElmIFx2YXJ7bW9kZX0gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gXGNvZGV7J3InfS4gIFdoZW4gb3BlbmluZyBhCi0gIGJpbmFyeSBmaWxlLCB5b3Ugc2hvdWxkIGFwcGVuZCBcY29kZXsnYid9IHRvIHRoZSBcdmFye21vZGV9IHZhbHVlCi0gIGZvciBpbXByb3ZlZCBwb3J0YWJpbGl0eS4gIChJdCdzIHVzZWZ1bCBldmVuIG9uIHN5c3RlbXMgd2hpY2ggZG9uJ3QKLSAgdHJlYXQgYmluYXJ5IGFuZCB0ZXh0IGZpbGVzIGRpZmZlcmVudGx5LCB3aGVyZSBpdCBzZXJ2ZXMgYXMKLSAgZG9jdW1lbnRhdGlvbi4pCi0gIFxpbmRleHtsaW5lLWJ1ZmZlcmVkIEkvT31caW5kZXh7dW5idWZmZXJlZCBJL099XGluZGV4e2J1ZmZlciBzaXplLCBJL099Ci0gIFxpbmRleHtJL08gY29udHJvbCFidWZmZXJpbmd9Ci0gIFRoZSBvcHRpb25hbCBcdmFye2J1ZnNpemV9IGFyZ3VtZW50IHNwZWNpZmllcyB0aGUKLSAgZmlsZSdzIGRlc2lyZWQgYnVmZmVyIHNpemU6IDAgbWVhbnMgdW5idWZmZXJlZCwgMSBtZWFucyBsaW5lCi0gIGJ1ZmZlcmVkLCBhbnkgb3RoZXIgcG9zaXRpdmUgdmFsdWUgbWVhbnMgdXNlIGEgYnVmZmVyIG9mCi0gIChhcHByb3hpbWF0ZWx5KSB0aGF0IHNpemUuICBBIG5lZ2F0aXZlIFx2YXJ7YnVmc2l6ZX0gbWVhbnMgdG8gdXNlCi0gIHRoZSBzeXN0ZW0gZGVmYXVsdCwgd2hpY2ggaXMgdXN1YWxseSBsaW5lIGJ1ZmZlcmVkIGZvciB0dHkKLSAgZGV2aWNlcyBhbmQgZnVsbHkgYnVmZmVyZWQgZm9yIG90aGVyIGZpbGVzLiAgSWYgb21pdHRlZCwgdGhlIHN5c3RlbQotICBkZWZhdWx0IGlzIHVzZWQuXGZvb3Rub3RlewotICAgIFNwZWNpZnlpbmcgYSBidWZmZXIgc2l6ZSBjdXJyZW50bHkgaGFzIG5vIGVmZmVjdCBvbiBzeXN0ZW1zIHRoYXQKLSAgICBkb24ndCBoYXZlIFxjZnVuY3Rpb257c2V0dmJ1ZigpfS4gIFRoZSBpbnRlcmZhY2UgdG8gc3BlY2lmeSB0aGUKLSAgICBidWZmZXIgc2l6ZSBpcyBub3QgZG9uZSB1c2luZyBhIG1ldGhvZCB0aGF0IGNhbGxzCi0gICAgXGNmdW5jdGlvbntzZXR2YnVmKCl9LCBiZWNhdXNlIHRoYXQgbWF5IGR1bXAgY29yZSB3aGVuIGNhbGxlZAotICAgIGFmdGVyIGFueSBJL08gaGFzIGJlZW4gcGVyZm9ybWVkLCBhbmQgdGhlcmUncyBubyByZWxpYWJsZSB3YXkgdG8KLSAgICBkZXRlcm1pbmUgd2hldGhlciB0aGlzIGlzIHRoZSBjYXNlLn0KKyAgV2hlbiBvcGVuaW5nIGEgZmlsZSwgaXQncyBwcmVmZXJhYmxlIHRvIHVzZSBcZnVuY3Rpb257b3BlbigpfSBpbnN0ZWFkIG9mIAorICBpbnZva2luZyB0aGlzIGNvbnN0cnVjdG9yIGRpcmVjdGx5LiAgXGNsYXNze2ZpbGV9IGlzIG1vcmUgc3VpdGVkIHRvCisgIHR5cGUgdGVzdGluZyAoZm9yIGV4YW1wbGUsIHdyaXRpbmcgXHNhbXB7aXNpbnN0YW5jZShmLCBmaWxlKX0pLgogCiAgIFx2ZXJzaW9uYWRkZWR7Mi4yfQotCi0gIFx2ZXJzaW9uY2hhbmdlZFtSZXN0cmljdGlvbiBvbiBmaXJzdCBsZXR0ZXIgb2YgbW9kZSBzdHJpbmcKLSAgICAgICAgICAgICAgICAgIGludHJvZHVjZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317ZmlsdGVyfXtmdW5jdGlvbiwgbGlzdH0KICAgQ29uc3RydWN0IGEgbGlzdCBmcm9tIHRob3NlIGVsZW1lbnRzIG9mIFx2YXJ7bGlzdH0gZm9yIHdoaWNoCiAgIFx2YXJ7ZnVuY3Rpb259IHJldHVybnMgdHJ1ZS4gIFx2YXJ7bGlzdH0gbWF5IGJlIGVpdGhlciBhIHNlcXVlbmNlLCBhCiAgIGNvbnRhaW5lciB3aGljaCBzdXBwb3J0cyBpdGVyYXRpb24sIG9yIGFuIGl0ZXJhdG9yLCAgSWYgXHZhcntsaXN0fQotICBpcyBhIHN0cmluZyBvciBhIHR1cGxlLCB0aGUgcmVzdWx0IGFsc28gaGFzIHRoYXQgdHlwZTsgb3RoZXJ3aXNlIGl0Ci0gIGlzIGFsd2F5cyBhIGxpc3QuICBJZiBcdmFye2Z1bmN0aW9ufSBpcyBcY29kZXtOb25lfSwgdGhlIGlkZW50aXR5Ci0gIGZ1bmN0aW9uIGlzIGFzc3VtZWQsIHRoYXQgaXMsIGFsbCBlbGVtZW50cyBvZiBcdmFye2xpc3R9IHRoYXQgYXJlIGZhbHNlCi0gICh6ZXJvIG9yIGVtcHR5KSBhcmUgcmVtb3ZlZC4KKyAgaXMgYSBzdHJpbmcgb3IgYSB0dXBsZSwgdGhlIHJlc3VsdAorICBhbHNvIGhhcyB0aGF0IHR5cGU7IG90aGVyd2lzZSBpdCBpcyBhbHdheXMgYSBsaXN0LiAgSWYgXHZhcntmdW5jdGlvbn0gaXMKKyAgXGNvZGV7Tm9uZX0sIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBpcyBhc3N1bWVkLCB0aGF0IGlzLCBhbGwgZWxlbWVudHMgb2YKKyAgXHZhcntsaXN0fSB0aGF0IGFyZSBmYWxzZSBhcmUgcmVtb3ZlZC4KIAogICBOb3RlIHRoYXQgXGNvZGV7ZmlsdGVyKGZ1bmN0aW9uLCBcdmFye2xpc3R9KX0gaXMgZXF1aXZhbGVudCB0bwogICBcY29kZXtbaXRlbSBmb3IgaXRlbSBpbiBcdmFye2xpc3R9IGlmIGZ1bmN0aW9uKGl0ZW0pXX0gaWYgZnVuY3Rpb24gaXMKQEAgLTcwOSwxMCArNjU5LDcxIEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e29wZW59e2ZpbGVuYW1lXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGJ1ZnNpemV9fX0KLSAgQSB3cmFwcGVyIGZvciB0aGUgXGZ1bmN0aW9ue2ZpbGUoKX0gZnVuY3Rpb24gYWJvdmUuICBUaGUgaW50ZW50IGlzCi0gIGZvciBcZnVuY3Rpb257b3BlbigpfSB0byBiZSBwcmVmZXJyZWQgZm9yIHVzZSBhcyBhIGZhY3RvcnkgZnVuY3Rpb24KLSAgcmV0dXJuaW5nIGEgbmV3IFxjbGFzc3tmaWxlfSBvYmplY3QuICBcY2xhc3N7ZmlsZX0gaXMgbW9yZSBzdWl0ZWQgdG8KLSAgdHlwZSB0ZXN0aW5nIChmb3IgZXhhbXBsZSwgd3JpdGluZyBcc2FtcHtpc2luc3RhbmNlKGYsIGZpbGUpfSkuCisgIE9wZW4gYSBmaWxlLCByZXR1cm5pbmcgYW4gb2JqZWN0IG9mIHRoZSBcY2xhc3N7ZmlsZX0gdHlwZSBkZXNjcmliZWQKKyAgaW4gc2VjdGlvbn5ccmVme2JsdGluLWZpbGUtb2JqZWN0c30sIGBgXHVsaW5re0ZpbGUKKyAgT2JqZWN0c317Ymx0aW4tZmlsZS1vYmplY3RzLmh0bWx9JycuICBJZiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLAorICBcZXhjZXB0aW9ue0lPRXJyb3J9IGlzIHJhaXNlZC4gIFdoZW4gb3BlbmluZyBhIGZpbGUsIGl0J3MKKyAgcHJlZmVyYWJsZSB0byB1c2UgXGZ1bmN0aW9ue29wZW4oKX0gaW5zdGVhZCBvZiBpbnZva2luZyB0aGUKKyAgXGNsYXNze2ZpbGV9IGNvbnN0cnVjdG9yIGRpcmVjdGx5LgorCisgIFRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSB0aGUgc2FtZSBhcyBmb3IgXGNvZGV7c3RkaW99J3MKKyAgXGNmdW5jdGlvbntmb3BlbigpfTogXHZhcntmaWxlbmFtZX0gaXMgdGhlIGZpbGUgbmFtZSB0byBiZSBvcGVuZWQsCisgIGFuZCBcdmFye21vZGV9IGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSBmaWxlIGlzIHRvIGJlIG9wZW5lZC4KKworICBUaGUgbW9zdCBjb21tb25seS11c2VkIHZhbHVlcyBvZiBcdmFye21vZGV9IGFyZSBcY29kZXsncid9IGZvcgorICByZWFkaW5nLCBcY29kZXsndyd9IGZvciB3cml0aW5nICh0cnVuY2F0aW5nIHRoZSBmaWxlIGlmIGl0IGFscmVhZHkKKyAgZXhpc3RzKSwgYW5kIFxjb2RleydhJ30gZm9yIGFwcGVuZGluZyAod2hpY2ggb24gXGVtcGh7c29tZX0gXFVOSVh7fQorICBzeXN0ZW1zIG1lYW5zIHRoYXQgXGVtcGh7YWxsfSB3cml0ZXMgYXBwZW5kIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUKKyAgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBzZWVrIHBvc2l0aW9uKS4gIElmIFx2YXJ7bW9kZX0gaXMgb21pdHRlZCwKKyAgaXQgZGVmYXVsdHMgdG8gXGNvZGV7J3InfS4gIFdoZW4gb3BlbmluZyBhIGJpbmFyeSBmaWxlLCB5b3Ugc2hvdWxkCisgIGFwcGVuZCBcY29kZXsnYid9IHRvIHRoZSBcdmFye21vZGV9IHZhbHVlIHRvIG9wZW4gdGhlIGZpbGUgaW4gYmluYXJ5CisgIG1vZGUsIHdoaWNoIHdpbGwgaW1wcm92ZSBwb3J0YWJpbGl0eS4gIChBcHBlbmRpbmcgXGNvZGV7J2InfSBpcworICB1c2VmdWwgZXZlbiBvbiBzeXN0ZW1zIHRoYXQgZG9uJ3QgdHJlYXQgYmluYXJ5IGFuZCB0ZXh0IGZpbGVzCisgIGRpZmZlcmVudGx5LCB3aGVyZSBpdCBzZXJ2ZXMgYXMgZG9jdW1lbnRhdGlvbi4pICBTZWUgYmVsb3cgZm9yIG1vcmUKKyAgcG9zc2libGUgdmFsdWVzIG9mIFx2YXJ7bW9kZX0uCisKKyAgXGluZGV4e2xpbmUtYnVmZmVyZWQgSS9PfVxpbmRleHt1bmJ1ZmZlcmVkIEkvT31caW5kZXh7YnVmZmVyIHNpemUsIEkvT30KKyAgXGluZGV4e0kvTyBjb250cm9sIWJ1ZmZlcmluZ30KKyAgVGhlIG9wdGlvbmFsIFx2YXJ7YnVmc2l6ZX0gYXJndW1lbnQgc3BlY2lmaWVzIHRoZQorICBmaWxlJ3MgZGVzaXJlZCBidWZmZXIgc2l6ZTogMCBtZWFucyB1bmJ1ZmZlcmVkLCAxIG1lYW5zIGxpbmUKKyAgYnVmZmVyZWQsIGFueSBvdGhlciBwb3NpdGl2ZSB2YWx1ZSBtZWFucyB1c2UgYSBidWZmZXIgb2YKKyAgKGFwcHJveGltYXRlbHkpIHRoYXQgc2l6ZS4gIEEgbmVnYXRpdmUgXHZhcntidWZzaXplfSBtZWFucyB0byB1c2UKKyAgdGhlIHN5c3RlbSBkZWZhdWx0LCB3aGljaCBpcyB1c3VhbGx5IGxpbmUgYnVmZmVyZWQgZm9yIHR0eQorICBkZXZpY2VzIGFuZCBmdWxseSBidWZmZXJlZCBmb3Igb3RoZXIgZmlsZXMuICBJZiBvbWl0dGVkLCB0aGUgc3lzdGVtCisgIGRlZmF1bHQgaXMgdXNlZC5cZm9vdG5vdGV7CisgICAgU3BlY2lmeWluZyBhIGJ1ZmZlciBzaXplIGN1cnJlbnRseSBoYXMgbm8gZWZmZWN0IG9uIHN5c3RlbXMgdGhhdAorICAgIGRvbid0IGhhdmUgXGNmdW5jdGlvbntzZXR2YnVmKCl9LiAgVGhlIGludGVyZmFjZSB0byBzcGVjaWZ5IHRoZQorICAgIGJ1ZmZlciBzaXplIGlzIG5vdCBkb25lIHVzaW5nIGEgbWV0aG9kIHRoYXQgY2FsbHMKKyAgICBcY2Z1bmN0aW9ue3NldHZidWYoKX0sIGJlY2F1c2UgdGhhdCBtYXkgZHVtcCBjb3JlIHdoZW4gY2FsbGVkCisgICAgYWZ0ZXIgYW55IEkvTyBoYXMgYmVlbiBwZXJmb3JtZWQsIGFuZCB0aGVyZSdzIG5vIHJlbGlhYmxlIHdheSB0bworICAgIGRldGVybWluZSB3aGV0aGVyIHRoaXMgaXMgdGhlIGNhc2UufQorCisgIE1vZGVzIFxjb2RleydyKyd9LCBcY29kZXsndysnfSBhbmQgXGNvZGV7J2ErJ30gb3BlbiB0aGUgZmlsZSBmb3IKKyAgdXBkYXRpbmcgKG5vdGUgdGhhdCBcY29kZXsndysnfSB0cnVuY2F0ZXMgdGhlIGZpbGUpLiAgQXBwZW5kCisgIFxjb2RleydiJ30gdG8gdGhlIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZSwgb24gc3lzdGVtcworICB0aGF0IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBiaW5hcnkgYW5kIHRleHQgZmlsZXM7IG9uIHN5c3RlbXMKKyAgdGhhdCBkb24ndCBoYXZlIHRoaXMgZGlzdGluY3Rpb24sIGFkZGluZyB0aGUgXGNvZGV7J2InfSBoYXMgbm8gZWZmZWN0LgorICAKKyAgSW4gYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIFxjZnVuY3Rpb257Zm9wZW4oKX0gdmFsdWVzIFx2YXJ7bW9kZX0KKyAgbWF5IGJlIFxjb2RleydVJ30gb3IgXGNvZGV7J3JVJ30uICBQeXRob24gaXMgdXN1YWxseSBidWlsdCB3aXRoIHVuaXZlcnNhbAorICBuZXdsaW5lIHN1cHBvcnQ7IHN1cHBseWluZyBcY29kZXsnVSd9IG9wZW5zIHRoZSBmaWxlIGFzIGEgdGV4dCBmaWxlLCBidXQKKyAgbGluZXMgbWF5IGJlIHRlcm1pbmF0ZWQgYnkgYW55IG9mIHRoZSBmb2xsb3dpbmc6IHRoZSBcVU5JWHt9IGVuZC1vZi1saW5lCisgIGNvbnZlbnRpb24gXGNvZGV7J1xlIG4nfSwgCisgIHRoZSBNYWNpbnRvc2ggY29udmVudGlvbiBcY29kZXsnXGUgcid9LCBvciB0aGUgV2luZG93cworICBjb252ZW50aW9uIFxjb2RleydcZSByXGUgbid9LiBBbGwgb2YgdGhlc2UgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb25zIGFyZSBzZWVuIGFzCisgIFxjb2RleydcZSBuJ30KKyAgYnkgdGhlIFB5dGhvbiBwcm9ncmFtLiBJZiBQeXRob24gaXMgYnVpbHQgd2l0aG91dCB1bml2ZXJzYWwgbmV3bGluZSBzdXBwb3J0CisgIGEgXHZhcnttb2RlfSB3aXRoIFxjb2RleydVJ30gaXMgdGhlIHNhbWUgYXMgbm9ybWFsIHRleHQgbW9kZS4gIE5vdGUgdGhhdAorICBmaWxlIG9iamVjdHMgc28gb3BlbmVkIGFsc28gaGF2ZSBhbiBhdHRyaWJ1dGUgY2FsbGVkCisgIFxtZW1iZXJ7bmV3bGluZXN9IHdoaWNoIGhhcyBhIHZhbHVlIG9mIFxjb2Rle05vbmV9IChpZiBubyBuZXdsaW5lcworICBoYXZlIHlldCBiZWVuIHNlZW4pLCBcY29kZXsnXGUgbid9LCBcY29kZXsnXGUgcid9LCBcY29kZXsnXGUgclxlIG4nfSwKKyAgb3IgYSB0dXBsZSBjb250YWluaW5nIGFsbCB0aGUgbmV3bGluZSB0eXBlcyBzZWVuLgorCisgIFB5dGhvbiBlbmZvcmNlcyB0aGF0IHRoZSBtb2RlLCBhZnRlciBzdHJpcHBpbmcgXGNvZGV7J1UnfSwgYmVnaW5zIHdpdGgKKyAgXGNvZGV7J3InfSwgXGNvZGV7J3cnfSBvciBcY29kZXsnYSd9LgorCisgIFx2ZXJzaW9uY2hhbmdlZFtSZXN0cmljdGlvbiBvbiBmaXJzdCBsZXR0ZXIgb2YgbW9kZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgIGludHJvZHVjZWRdezIuNX0KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317b3JkfXtjfQpAQCAtNzY0LDE1ICs3NzUsMzAgQEAKIFxiZWdpbnt2ZXJiYXRpbX0KIGNsYXNzIEMob2JqZWN0KToKICAgICBkZWYgX19pbml0X18oc2VsZik6IHNlbGYuX194ID0gTm9uZQotICAgIGRlZiBnZXR4KHNlbGYpOiByZXR1cm4gc2VsZi5fX3gKLSAgICBkZWYgc2V0eChzZWxmLCB2YWx1ZSk6IHNlbGYuX194ID0gdmFsdWUKLSAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX194CisgICAgZGVmIGdldHgoc2VsZik6IHJldHVybiBzZWxmLl94CisgICAgZGVmIHNldHgoc2VsZiwgdmFsdWUpOiBzZWxmLl94ID0gdmFsdWUKKyAgICBkZWYgZGVseChzZWxmKTogZGVsIHNlbGYuX3gKICAgICB4ID0gcHJvcGVydHkoZ2V0eCwgc2V0eCwgZGVseCwgIkknbSB0aGUgJ3gnIHByb3BlcnR5LiIpCiBcZW5ke3ZlcmJhdGltfQogCiAgIElmIGdpdmVuLCBcdmFye2RvY30gd2lsbCBiZSB0aGUgZG9jc3RyaW5nIG9mIHRoZSBwcm9wZXJ0eSBhdHRyaWJ1dGUuCiAgIE90aGVyd2lzZSwgdGhlIHByb3BlcnR5IHdpbGwgY29weSBcdmFye2ZnZXR9J3MgZG9jc3RyaW5nIChpZiBpdAotICBleGlzdHMpLgorICBleGlzdHMpLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBjcmVhdGUgcmVhZC1vbmx5IHByb3BlcnRpZXMKKyAgZWFzaWx5IHVzaW5nIFxmdW5jdGlvbntwcm9wZXJ0eSgpfSBhcyBhIGRlY29yYXRvcjoKKworXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgUGFycm90KG9iamVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLl92b2x0YWdlID0gMTAwMDAwCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdm9sdGFnZShzZWxmKToKKyAgICAgICAgIiIiR2V0IHRoZSBjdXJyZW50IHZvbHRhZ2UuIiIiCisgICAgICAgIHJldHVybiBzZWxmLl92b2x0YWdlCitcZW5ke3ZlcmJhdGltfQorCisgIHR1cm5zIHRoZSBcbWV0aG9ke3ZvbHRhZ2UoKX0gbWV0aG9kIGludG8gYSBgYGdldHRlcicnIGZvciBhIHJlYWQtb25seQorICBhdHRyaWJ1dGUgd2l0aCB0aGUgc2FtZSBuYW1lLgogCiAgIFx2ZXJzaW9uYWRkZWR7Mi4yfQogICBcdmVyc2lvbmNoYW5nZWRbVXNlIFx2YXJ7ZmdldH0ncyBkb2NzdHJpbmcgaWYgbm8gXHZhcntkb2N9IGdpdmVuXXsyLjV9CkBAIC05NTgsOCArOTg0LDMwIEBACiBcYmVnaW57ZnVuY2Rlc2N9e3NvcnRlZH17aXRlcmFibGVcb3B0aW9uYWx7LCBjbXBcb3B0aW9uYWx7LAogICAgICAgICAgICAgICAgICAgICAgICAgIGtleVxvcHRpb25hbHssIHJldmVyc2V9fX19CiAgIFJldHVybiBhIG5ldyBzb3J0ZWQgbGlzdCBmcm9tIHRoZSBpdGVtcyBpbiBcdmFye2l0ZXJhYmxlfS4KLSAgVGhlIG9wdGlvbmFsIGFyZ3VtZW50cyBcdmFye2NtcH0sIFx2YXJ7a2V5fSwgYW5kIFx2YXJ7cmV2ZXJzZX0KLSAgaGF2ZSB0aGUgc2FtZSBtZWFuaW5nIGFzIHRob3NlIGZvciB0aGUgXG1ldGhvZHtsaXN0LnNvcnQoKX0gbWV0aG9kLgorCisgIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgXHZhcntjbXB9LCBcdmFye2tleX0sIGFuZCBcdmFye3JldmVyc2V9IGhhdmUKKyAgdGhlIHNhbWUgbWVhbmluZyBhcyB0aG9zZSBmb3IgdGhlIFxtZXRob2R7bGlzdC5zb3J0KCl9IG1ldGhvZAorICAoZGVzY3JpYmVkIGluIHNlY3Rpb25+XHJlZnt0eXBlc3NlcS1tdXRhYmxlfSkuCisKKyAgXHZhcntjbXB9IHNwZWNpZmllcyBhIGN1c3RvbSBjb21wYXJpc29uIGZ1bmN0aW9uIG9mIHR3byBhcmd1bWVudHMKKyAgKGl0ZXJhYmxlIGVsZW1lbnRzKSB3aGljaCBzaG91bGQgcmV0dXJuIGEgbmVnYXRpdmUsIHplcm8gb3IgcG9zaXRpdmUKKyAgbnVtYmVyIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBmaXJzdCBhcmd1bWVudCBpcyBjb25zaWRlcmVkIHNtYWxsZXIKKyAgdGhhbiwgZXF1YWwgdG8sIG9yIGxhcmdlciB0aGFuIHRoZSBzZWNvbmQgYXJndW1lbnQ6CisgIFxzYW1we1x2YXJ7Y21wfT1ca2V5d29yZHtsYW1iZGF9IFx2YXJ7eH0sXHZhcnt5fToKKyAgXGZ1bmN0aW9ue2NtcH0oeC5sb3dlcigpLCB5Lmxvd2VyKCkpfQorICAgICAKKyAgXHZhcntrZXl9IHNwZWNpZmllcyBhIGZ1bmN0aW9uIG9mIG9uZSBhcmd1bWVudCB0aGF0IGlzIHVzZWQgdG8KKyAgICAgZXh0cmFjdCBhIGNvbXBhcmlzb24ga2V5IGZyb20gZWFjaCBsaXN0IGVsZW1lbnQ6CisgICAgIFxzYW1we1x2YXJ7a2V5fT1cZnVuY3Rpb257c3RyLmxvd2VyfX0KKworICBcdmFye3JldmVyc2V9IGlzIGEgYm9vbGVhbiB2YWx1ZS4gIElmIHNldCB0byBcY29kZXtUcnVlfSwgdGhlbiB0aGUKKyAgICAgbGlzdCBlbGVtZW50cyBhcmUgc29ydGVkIGFzIGlmIGVhY2ggY29tcGFyaXNvbiB3ZXJlIHJldmVyc2VkLgorCisgIEluIGdlbmVyYWwsIHRoZSBcdmFye2tleX0gYW5kIFx2YXJ7cmV2ZXJzZX0gY29udmVyc2lvbiBwcm9jZXNzZXMgYXJlCisgIG11Y2ggZmFzdGVyIHRoYW4gc3BlY2lmeWluZyBhbiBlcXVpdmFsZW50IFx2YXJ7Y21wfSBmdW5jdGlvbi4gIFRoaXMgaXMKKyAgYmVjYXVzZSBcdmFye2NtcH0gaXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGZvciBlYWNoIGxpc3QgZWxlbWVudCB3aGlsZQorICBcdmFye2tleX0gYW5kIFx2YXJ7cmV2ZXJzZX0gdG91Y2ggZWFjaCBlbGVtZW50IG9ubHkgb25jZS4KKwogICBcdmVyc2lvbmFkZGVkezIuNH0KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliZ2V0dGV4dC50ZXggYi9Eb2MvbGliL2xpYmdldHRleHQudGV4CmluZGV4IGU0MWY4YmYuLjVjN2M2YjkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGliZ2V0dGV4dC50ZXgKKysrIGIvRG9jL2xpYi9saWJnZXR0ZXh0LnRleApAQCAtNTQ5LDcgKzU0OSw3IEBACiB3cml0dGVuIGEgcHJvZ3JhbSBjYWxsZWQKIFxwcm9ncmFte3hwb3R9IHdoaWNoIGRvZXMgYSBzaW1pbGFyIGpvYi4gIEl0IGlzIGF2YWlsYWJsZSBhcyBwYXJ0IG9mCiBoaXMgXHByb2dyYW17cG8tdXRpbHN9IHBhY2thZ2UgYXQKLVx1cmx7aHR0cDovL3d3dy5pcm8udW1vbnRyZWFsLmNhL2NvbnRyaWIvcG8tdXRpbHMvSFRNTC99Ln0gcHJvZ3JhbQorXHVybHtodHRwOi8vcG8tdXRpbHMucHJvZ2ljaWVscy1icGkuY2EvfS59IHByb2dyYW0KIHNjYW5zIGFsbCB5b3VyIFB5dGhvbiBzb3VyY2UgY29kZSBsb29raW5nIGZvciB0aGUgc3RyaW5ncyB5b3UKIHByZXZpb3VzbHkgbWFya2VkIGFzIHRyYW5zbGF0YWJsZS4gIEl0IGlzIHNpbWlsYXIgdG8gdGhlIEdOVQogXHByb2dyYW17Z2V0dGV4dH0gcHJvZ3JhbSBleGNlcHQgdGhhdCBpdCB1bmRlcnN0YW5kcyBhbGwgdGhlCkBAIC01ODUsOCArNTg1LDggQEAKIHRyYW5zbGF0aW9uIHByb2Nlc3NpbmcgZHVyaW5nIHJ1bi10aW1lLgogCiBIb3cgeW91IHVzZSB0aGUgXG1vZHVsZXtnZXR0ZXh0fSBtb2R1bGUgaW4geW91ciBjb2RlIGRlcGVuZHMgb24KLXdoZXRoZXIgeW91IGFyZSBpbnRlcm5hdGlvbmFsaXppbmcgeW91ciBlbnRpcmUgYXBwbGljYXRpb24gb3IgYSBzaW5nbGUKLW1vZHVsZS4KK3doZXRoZXIgeW91IGFyZSBpbnRlcm5hdGlvbmFsaXppbmcgYSBzaW5nbGUgbW9kdWxlIG9yIHlvdXIgZW50aXJlIGFwcGxpY2F0aW9uLgorVGhlIG5leHQgdHdvIHNlY3Rpb25zIHdpbGwgZGlzY3VzcyBlYWNoIGNhc2UuCiAKIFxzdWJzdWJzZWN0aW9ue0xvY2FsaXppbmcgeW91ciBtb2R1bGV9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGliaW1wLnRleCBiL0RvYy9saWIvbGliaW1wLnRleAppbmRleCBlMGE3NzVjLi41OThkMzUxIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmltcC50ZXgKKysrIGIvRG9jL2xpYi9saWJpbXAudGV4CkBAIC0yMzIsNiArMjMyLDI0IEBACiBzb3VyY2UgZmlsZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntjbGFzc2Rlc2N9e051bGxJbXBvcnRlcn17cGF0aF9zdHJpbmd9CitUaGUgXGNsYXNze051bGxJbXBvcnRlcn0gdHlwZSBpcyBhIFxwZXB7MzAyfSBpbXBvcnQgaG9vayB0aGF0IGhhbmRsZXMKK25vbi1kaXJlY3RvcnkgcGF0aCBzdHJpbmdzIGJ5IGZhaWxpbmcgdG8gZmluZCBhbnkgbW9kdWxlcy4gIENhbGxpbmcgdGhpcwordHlwZSB3aXRoIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBvciBlbXB0eSBzdHJpbmcgcmFpc2VzCitcZXhjZXB0aW9ue0ltcG9ydEVycm9yfS4gIE90aGVyd2lzZSwgYSBcY2xhc3N7TnVsbEltcG9ydGVyfSBpbnN0YW5jZSBpcworcmV0dXJuZWQuCisKK1B5dGhvbiBhZGRzIGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgdG8gXGNvZGV7c3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGV9IGZvcgorYW55IHBhdGggZW50cmllcyB0aGF0IGFyZSBub3QgZGlyZWN0b3JpZXMgYW5kIGFyZSBub3QgaGFuZGxlZCBieSBhbnkgb3RoZXIKK3BhdGggaG9va3Mgb24gXGNvZGV7c3lzLnBhdGhfaG9va3N9LiAgSW5zdGFuY2VzIGhhdmUgb25seSBvbmUgbWV0aG9kOgorCitcYmVnaW57bWV0aG9kZGVzY317ZmluZF9tb2R1bGV9e2Z1bGxuYW1lIFxvcHRpb25hbHssIHBhdGh9fQorVGhpcyBtZXRob2QgYWx3YXlzIHJldHVybnMgXGNvZGV7Tm9uZX0sIGluZGljYXRpbmcgdGhhdCB0aGUgcmVxdWVzdGVkCittb2R1bGUgY291bGQgbm90IGJlIGZvdW5kLgorXGVuZHttZXRob2RkZXNjfQorCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7Y2xhc3NkZXNjfQogCiBcc3Vic2VjdGlvbntFeGFtcGxlc30KIFxsYWJlbHtleGFtcGxlcy1pbXB9CkBAIC0yNTcsNyArMjc1LDcgQEAKICAgICAjIHRoZXJlJ3MgYSBwcm9ibGVtIHdlIGNhbid0IGhhbmRsZSAtLSBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQuCiAKICAgICBmcCwgcGF0aG5hbWUsIGRlc2NyaXB0aW9uID0gaW1wLmZpbmRfbW9kdWxlKG5hbWUpCi0gICAgCisKICAgICB0cnk6CiAgICAgICAgIHJldHVybiBpbXAubG9hZF9tb2R1bGUobmFtZSwgZnAsIHBhdGhuYW1lLCBkZXNjcmlwdGlvbikKICAgICBmaW5hbGx5OgpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleCBiL0RvYy9saWIvbGliaW5zcGVjdC50ZXgKaW5kZXggNWNhYmI4MC4uODU2NTFmMCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJpbnNwZWN0LnRleAorKysgYi9Eb2MvbGliL2xpYmluc3BlY3QudGV4CkBAIC0xODAsMTMgKzE4MCwzMiBAQAogICBSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgZGF0YSBkZXNjcmlwdG9yLgogCiAgIERhdGEgZGVzY3JpcHRvcnMgaGF2ZSBib3RoIGEgX19nZXRfXyBhbmQgYSBfX3NldF9fIGF0dHJpYnV0ZS4gIEV4YW1wbGVzIGFyZQotICBwcm9wZXJ0aWVzIChkZWZpbmVkIGluIFB5dGhvbikgYW5kIGdldHNldHMgYW5kIG1lbWJlcnMgKGRlZmluZWQgaW4gQykuCi0gIFR5cGljYWxseSwgZGF0YSBkZXNjcmlwdG9ycyB3aWxsIGFsc28gaGF2ZSBfX25hbWVfXyBhbmQgX19kb2NfXyBhdHRyaWJ1dGVzIAotICAocHJvcGVydGllcywgZ2V0c2V0cywgYW5kIG1lbWJlcnMgaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMpLCBidXQgdGhpcyAKLSAgaXMgbm90IGd1YXJhbnRlZWQuCisgIHByb3BlcnRpZXMgKGRlZmluZWQgaW4gUHl0aG9uKSwgZ2V0c2V0cywgYW5kIG1lbWJlcnMuICBUaGUgbGF0dGVyIHR3byBhcmUKKyAgZGVmaW5lZCBpbiBDIGFuZCB0aGVyZSBhcmUgbW9yZSBzcGVjaWZpYyB0ZXN0cyBhdmFpbGFibGUgZm9yIHRob3NlIHR5cGVzLAorICB3aGljaCBpcyByb2J1c3QgYWNyb3NzIFB5dGhvbiBpbXBsZW1lbnRhdGlvbnMuICBUeXBpY2FsbHksIGRhdGEgZGVzY3JpcHRvcnMKKyAgd2lsbCBhbHNvIGhhdmUgX19uYW1lX18gYW5kIF9fZG9jX18gYXR0cmlidXRlcyAocHJvcGVydGllcywgZ2V0c2V0cywgYW5kCisgIG1lbWJlcnMgaGF2ZSBib3RoIG9mIHRoZXNlIGF0dHJpYnV0ZXMpLCBidXQgdGhpcyBpcyBub3QgZ3VhcmFudGVlZC4KIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtpc2dldHNldGRlc2NyaXB0b3J9e29iamVjdH0KKyAgUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdldHNldCBkZXNjcmlwdG9yLgorCisgIGdldHNldHMgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB2aWEgXGNvZGV7UHlHZXRTZXREZWZ9CisgIHN0cnVjdHVyZXMuICBGb3IgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHN1Y2ggdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwKKyAgYWx3YXlzIHJldHVybiBcY29kZXtGYWxzZX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317aXNtZW1iZXJkZXNjcmlwdG9yfXtvYmplY3R9CisgIFJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBtZW1iZXIgZGVzY3JpcHRvci4KKworICBNZW1iZXIgZGVzY3JpcHRvcnMgYXJlIGF0dHJpYnV0ZXMgZGVmaW5lZCBpbiBleHRlbnNpb24gbW9kdWxlcyB2aWEKKyAgXGNvZGV7UHlNZW1iZXJEZWZ9IHN0cnVjdHVyZXMuICBGb3IgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aXRob3V0IHN1Y2gKKyAgdHlwZXMsIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzIHJldHVybiBcY29kZXtGYWxzZX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxzdWJzZWN0aW9ue1JldHJpZXZpbmcgc291cmNlIGNvZGUKICAgICAgICAgICAgIFxsYWJlbHtpbnNwZWN0LXNvdXJjZX19CiAKQEAgLTI3MiwxOCArMjkxLDE4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e2Zvcm1hdGFyZ3NwZWN9e2FyZ3Ncb3B0aW9uYWx7LCB2YXJhcmdzLCB2YXJrdywgZGVmYXVsdHMsCi0gICAgICBhcmdmb3JtYXQsIHZhcmFyZ3Nmb3JtYXQsIHZhcmt3Zm9ybWF0LCBkZWZhdWx0Zm9ybWF0fX0KKyAgICAgIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBqb2lufX0KIAogICBGb3JtYXQgYSBwcmV0dHkgYXJndW1lbnQgc3BlYyBmcm9tIHRoZSBmb3VyIHZhbHVlcyByZXR1cm5lZCBieQotICBcZnVuY3Rpb257Z2V0YXJnc3BlYygpfS4gIFRoZSBvdGhlciBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlCisgIFxmdW5jdGlvbntnZXRhcmdzcGVjKCl9LiAgVGhlIGZvcm1hdCogYXJndW1lbnRzIGFyZSB0aGUKICAgY29ycmVzcG9uZGluZyBvcHRpb25hbCBmb3JtYXR0aW5nIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdG8gdHVybgogICBuYW1lcyBhbmQgdmFsdWVzIGludG8gc3RyaW5ncy4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Zm9ybWF0YXJndmFsdWVzfXthcmdzXG9wdGlvbmFseywgdmFyYXJncywgdmFya3csIGxvY2FscywKLSAgICAgIGFyZ2Zvcm1hdCwgdmFyYXJnc2Zvcm1hdCwgdmFya3dmb3JtYXQsIHZhbHVlZm9ybWF0fX0KKyAgICAgIGZvcm1hdGFyZywgZm9ybWF0dmFyYXJncywgZm9ybWF0dmFya3csIGZvcm1hdHZhbHVlLCBqb2lufX0KICAgRm9ybWF0IGEgcHJldHR5IGFyZ3VtZW50IHNwZWMgZnJvbSB0aGUgZm91ciB2YWx1ZXMgcmV0dXJuZWQgYnkKLSAgXGZ1bmN0aW9ue2dldGFyZ3ZhbHVlcygpfS4gIFRoZSBvdGhlciBmb3VyIGFyZ3VtZW50cyBhcmUgdGhlCisgIFxmdW5jdGlvbntnZXRhcmd2YWx1ZXMoKX0uICBUaGUgZm9ybWF0KiBhcmd1bWVudHMgYXJlIHRoZQogICBjb3JyZXNwb25kaW5nIG9wdGlvbmFsIGZvcm1hdHRpbmcgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCB0byB0dXJuCiAgIG5hbWVzIGFuZCB2YWx1ZXMgaW50byBzdHJpbmdzLgogXGVuZHtmdW5jZGVzY30KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibGluZWNhY2hlLnRleCBiL0RvYy9saWIvbGlibGluZWNhY2hlLnRleAppbmRleCAxNDc3ZDNjLi43MmM3NzQzIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYmxpbmVjYWNoZS50ZXgKKysrIGIvRG9jL2xpYi9saWJsaW5lY2FjaGUudGV4CkBAIC0zOCw3ICszOCw3IEBACiBcYmVnaW57ZnVuY2Rlc2N9e2NoZWNrY2FjaGV9e1xvcHRpb25hbHtmaWxlbmFtZX19CiBDaGVjayB0aGUgY2FjaGUgZm9yIHZhbGlkaXR5LiAgVXNlIHRoaXMgZnVuY3Rpb24gaWYgZmlsZXMgaW4gdGhlIGNhY2hlIAogbWF5IGhhdmUgY2hhbmdlZCBvbiBkaXNrLCBhbmQgeW91IHJlcXVpcmUgdGhlIHVwZGF0ZWQgdmVyc2lvbi4gIElmCi1cdmFye2ZpbGVuYW1lfSBpcyBvbWl0dGVkLCBpdCB3aWxsIGNoZWNrIHRoZSB3aG9sZSBjYWNoZSBlbnRyaWVzLgorXHZhcntmaWxlbmFtZX0gaXMgb21pdHRlZCwgaXQgd2lsbCBjaGVjayBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIGNhY2hlLgogXGVuZHtmdW5jZGVzY30KIAogRXhhbXBsZToKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlibG9nZ2luZy50ZXggYi9Eb2MvbGliL2xpYmxvZ2dpbmcudGV4CmluZGV4IDU3NmUyZTcuLmNjNDQyOTQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibG9nZ2luZy50ZXgKKysrIGIvRG9jL2xpYi9saWJsb2dnaW5nLnRleApAQCAtMTA2OCwxMyArMTA2OCwxMSBAQAogXGVuZHt0YWJsZWlpfQogCiBJZiBcdmFye2JhY2t1cENvdW50fSBpcyBub24temVybywgdGhlIHN5c3RlbSB3aWxsIHNhdmUgb2xkIGxvZyBmaWxlcyBieQotYXBwZW5kaW5nIHRoZSBleHRlbnNpb25zICIuMSIsICIuMiIgZXRjLiwgdG8gdGhlIGZpbGVuYW1lLiBGb3IgZXhhbXBsZSwKLXdpdGggYSBcdmFye2JhY2t1cENvdW50fSBvZiA1IGFuZCBhIGJhc2UgZmlsZSBuYW1lIG9mIFxmaWxle2FwcC5sb2d9LAoteW91IHdvdWxkIGdldCBcZmlsZXthcHAubG9nfSwgXGZpbGV7YXBwLmxvZy4xfSwgXGZpbGV7YXBwLmxvZy4yfSwgdXAgdG8KLVxmaWxle2FwcC5sb2cuNX0uIFRoZSBmaWxlIGJlaW5nIHdyaXR0ZW4gdG8gaXMgYWx3YXlzIFxmaWxle2FwcC5sb2d9LgotV2hlbiB0aGlzIGZpbGUgaXMgZmlsbGVkLCBpdCBpcyBjbG9zZWQgYW5kIHJlbmFtZWQgdG8gXGZpbGV7YXBwLmxvZy4xfSwKLWFuZCBpZiBmaWxlcyBcZmlsZXthcHAubG9nLjF9LCBcZmlsZXthcHAubG9nLjJ9LCBldGMuIGV4aXN0LCB0aGVuIHRoZXkKLWFyZSByZW5hbWVkIHRvIFxmaWxle2FwcC5sb2cuMn0sIFxmaWxle2FwcC5sb2cuM30gZXRjLiByZXNwZWN0aXZlbHkuCithcHBlbmRpbmcgZXh0ZW5zaW9ucyB0byB0aGUgZmlsZW5hbWUuIFRoZSBleHRlbnNpb25zIGFyZSBkYXRlLWFuZC10aW1lCitiYXNlZCwgdXNpbmcgdGhlIHN0cmZ0aW1lIGZvcm1hdCBcY29kZXtcJVktXCVtLVwlZF9cJUgtXCVNLVwlU30gb3IgYSBsZWFkaW5nCitwb3J0aW9uIHRoZXJlb2YsIGRlcGVuZGluZyBvbiB0aGUgcm9sbG92ZXIgaW50ZXJ2YWwuIEF0IG1vc3QgXHZhcntiYWNrdXBDb3VudH0KK2ZpbGVzIHdpbGwgYmUga2VwdCwgYW5kIGlmIG1vcmUgd291bGQgYmUgY3JlYXRlZCB3aGVuIHJvbGxvdmVyIG9jY3VycywgdGhlCitvbGRlc3Qgb25lIGlzIGRlbGV0ZWQuCiBcZW5ke2NsYXNzZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9e2RvUm9sbG92ZXJ9e30KQEAgLTE1MzksNyArMTUzNyw3IEBACiBUbyBzdG9wIHRoZSBzZXJ2ZXIsIGNhbGwgXGZ1bmN0aW9ue3N0b3BMaXN0ZW5pbmcoKX0uIFRvIHNlbmQgYSBjb25maWd1cmF0aW9uCiB0byB0aGUgc29ja2V0LCByZWFkIGluIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIHNlbmQgaXQgdG8gdGhlIHNvY2tldAogYXMgYSBzdHJpbmcgb2YgYnl0ZXMgcHJlY2VkZWQgYnkgYSBmb3VyLWJ5dGUgbGVuZ3RoIHBhY2tlZCBpbiBiaW5hcnkgdXNpbmcKLXN0cnVjdC5cY29kZXtwYWNrKCI+TCIsIG4pfS4KK3N0cnVjdC5cY29kZXtwYWNrKCc+TCcsIG4pfS4KIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317c3RvcExpc3RlbmluZ317fQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtYWlsYm94LnRleCBiL0RvYy9saWIvbGlibWFpbGJveC50ZXgKaW5kZXggMGExZjc5Mi4uNzVlYTdlMSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJtYWlsYm94LnRleAorKysgYi9Eb2MvbGliL2xpYm1haWxib3gudGV4CkBAIC0xMzY3LDkgKzEzNjcsOCBAQAogICAgICAgICBwcmludCBzdWJqZWN0CiBcZW5ke3ZlcmJhdGltfQogCi1BIChzdXJwcmlzaW5nbHkpIHNpbXBsZSBleGFtcGxlIG9mIGNvcHlpbmcgYWxsIG1haWwgZnJvbSBhIEJhYnlsIG1haWxib3ggdG8gYW4KLU1IIG1haWxib3gsIGNvbnZlcnRpbmcgYWxsIG9mIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUKLWNvbnZlcnRlZDoKK1RvIGNvcHkgYWxsIG1haWwgZnJvbSBhIEJhYnlsIG1haWxib3ggdG8gYW4gTUggbWFpbGJveCwgY29udmVydGluZyBhbGwKK29mIHRoZSBmb3JtYXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgY29udmVydGVkOgogCiBcYmVnaW57dmVyYmF0aW19CiBpbXBvcnQgbWFpbGJveApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJtaW1ldHlwZXMudGV4IGIvRG9jL2xpYi9saWJtaW1ldHlwZXMudGV4CmluZGV4IDhlMDc3NjguLjZjNDZkNmYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibWltZXR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYm1pbWV0eXBlcy50ZXgKQEAgLTE1OCw2ICsxNTgsMjAgQEAKICAgXHZlcnNpb25hZGRlZHsyLjJ9CiBcZW5ke2NsYXNzZGVzY30KIAorQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgbW9kdWxlOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gaW1wb3J0IG1pbWV0eXBlcworPj4+IG1pbWV0eXBlcy5pbml0KCkKKz4+PiBtaW1ldHlwZXMua25vd25maWxlcworWycvZXRjL21pbWUudHlwZXMnLCAnL2V0Yy9odHRwZC9taW1lLnR5cGVzJywgLi4uIF0KKz4+PiBtaW1ldHlwZXMuc3VmZml4X21hcFsnLnRneiddCisnLnRhci5neicKKz4+PiBtaW1ldHlwZXMuZW5jb2RpbmdzX21hcFsnLmd6J10KKydnemlwJworPj4+IG1pbWV0eXBlcy50eXBlc19tYXBbJy50Z3onXQorJ2FwcGxpY2F0aW9uL3gtdGFyLWd6JworXGVuZHt2ZXJiYXRpbX0KIAogXHN1YnNlY3Rpb257TWltZVR5cGVzIE9iamVjdHMgXGxhYmVse21pbWV0eXBlcy1vYmplY3RzfX0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJuZXcudGV4IGIvRG9jL2xpYi9saWJuZXcudGV4CmluZGV4IGUzZjJhNDkuLjE4MTYyZGMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlibmV3LnRleAorKysgYi9Eb2MvbGliL2xpYm5ldy50ZXgKQEAgLTIyLDEzICsyMiwxNiBAQAogY2FsbGFibGUuCiBcZW5ke2Z1bmNkZXNjfQogCi1cYmVnaW57ZnVuY2Rlc2N9e2Z1bmN0aW9ufXtjb2RlLCBnbG9iYWxzXG9wdGlvbmFseywgbmFtZVxvcHRpb25hbHssIGFyZ2RlZnN9fX0KK1xiZWdpbntmdW5jZGVzY317ZnVuY3Rpb259e2NvZGUsIGdsb2JhbHNcb3B0aW9uYWx7LCBuYW1lXG9wdGlvbmFseywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ2RlZnNcb3B0aW9uYWx7LCBjbG9zdXJlfX19fQogUmV0dXJucyBhIChQeXRob24pIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGNvZGUgYW5kIGdsb2JhbHMuIElmCiBcdmFye25hbWV9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgc3RyaW5nIG9yIFxjb2Rle05vbmV9LiAgSWYgaXQgaXMgYQogc3RyaW5nLCB0aGUgZnVuY3Rpb24gd2lsbCBoYXZlIHRoZSBnaXZlbiBuYW1lLCBvdGhlcndpc2UgdGhlIGZ1bmN0aW9uCiBuYW1lIHdpbGwgYmUgdGFrZW4gZnJvbSBcY29kZXtcdmFye2NvZGV9LmNvX25hbWV9LiAgSWYKIFx2YXJ7YXJnZGVmc30gaXMgZ2l2ZW4sIGl0IG11c3QgYmUgYSB0dXBsZSBhbmQgd2lsbCBiZSB1c2VkIHRvCi1kZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuCitkZXRlcm1pbmUgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHBhcmFtZXRlcnMuICBJZiBcdmFye2Nsb3N1cmV9IGlzIGdpdmVuLAoraXQgbXVzdCBiZSBcY29kZXtOb25lfSBvciBhIHR1cGxlIG9mIGNlbGwgb2JqZWN0cyBjb250YWluaW5nIG9iamVjdHMKK3RvIGJpbmQgdG8gdGhlIG5hbWVzIGluIFxjb2Rle1x2YXJ7Y29kZX0uY29fZnJlZXZhcnN9LgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtjb2RlfXthcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlib3B0cGFyc2UudGV4IGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKaW5kZXggZWM0M2UzZC4uZGY5NmRkNCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKKysrIGIvRG9jL2xpYi9saWJvcHRwYXJzZS50ZXgKQEAgLTEsMyArMSw1IEBACislIFRISVMgRklMRSBJUyBBVVRPLUdFTkVSQVRFRCEgIERPIE5PVCBFRElUIQorJSAoWW91ciBjaGFuZ2VzIHdpbGwgYmUgbG9zdCB0aGUgbmV4dCB0aW1lIGl0IGlzIGdlbmVyYXRlZC4pCiBcc2VjdGlvbntcbW9kdWxle29wdHBhcnNlfSAtLS0gTW9yZSBwb3dlcmZ1bCBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNlcn0KIFxkZWNsYXJlbW9kdWxle3N0YW5kYXJkfXtvcHRwYXJzZX0KIFxtb2R1bGVhdXRob3J7R3JlZyBXYXJkfXtnd2FyZEBweXRob24ubmV0fQpAQCAtMzA2LDcgKzMwOCw3IEBACiAKIEFjdGlvbnMgdGVsbCBcbW9kdWxle29wdHBhcnNlfSB3aGF0IHRvIGRvIHdoZW4gaXQgZW5jb3VudGVycyBhbiBvcHRpb24gb24gdGhlCiBjb21tYW5kIGxpbmUuICBUaGVyZSBpcyBhIGZpeGVkIHNldCBvZiBhY3Rpb25zIGhhcmQtY29kZWQgaW50byBcbW9kdWxle29wdHBhcnNlfTsKLWFkZGluZyBuZXcgYWN0aW9ucyBpcyBhbiBhZHZhbmNlZCB0b3BpYyBjb3ZlcmVkIGluIHNlY3Rpb25+XHJlZntvcHRwYXJzZS1leHRlbmRpbmd9LCBFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX0uCithZGRpbmcgbmV3IGFjdGlvbnMgaXMgYW4gYWR2YW5jZWQgdG9waWMgY292ZXJlZCBpbiBzZWN0aW9uflxyZWZ7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfSwgRXh0ZW5kaW5nIFxtb2R1bGV7b3B0cGFyc2V9LgogTW9zdCBhY3Rpb25zIHRlbGwgXG1vZHVsZXtvcHRwYXJzZX0gdG8gc3RvcmUgYSB2YWx1ZSBpbiBzb21lIHZhcmlhYmxley0tLX1mb3IKIGV4YW1wbGUsIHRha2UgYSBzdHJpbmcgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGFuZCBzdG9yZSBpdCBpbiBhbgogYXR0cmlidXRlIG9mIFxjb2Rle29wdGlvbnN9LgpAQCAtMzcxLDcgKzM3Myw3IEBACiBzdHJpbmc6IHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGZvciBcY29kZXsiLWYifSBpcyBcY29kZXtmfS4KIAogXG1vZHVsZXtvcHRwYXJzZX0gYWxzbyBpbmNsdWRlcyBidWlsdC1pbiBcY29kZXtsb25nfSBhbmQgXGNvZGV7Y29tcGxleH0gdHlwZXMuICBBZGRpbmcKLXR5cGVzIGlzIGNvdmVyZWQgaW4gc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZ30sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KK3R5cGVzIGlzIGNvdmVyZWQgaW4gc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZy1vcHRwYXJzZX0sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KIAogCiBcc3Vic3Vic2VjdGlvbntIYW5kbGluZyBib29sZWFuIChmbGFnKSBvcHRpb25zXGxhYmVse29wdHBhcnNlLWhhbmRsaW5nLWJvb2xlYW4tb3B0aW9uc319CkBAIC01NjYsNyArNTY4LDcgQEAKIHBhcnNlciA9IE9wdGlvblBhcnNlcih1c2FnZT0iJXByb2cgWy1mXSBbLXFdIiwgdmVyc2lvbj0iJXByb2cgMS4wIikKIFxlbmR7dmVyYmF0aW19CiAKLU5vdGUgdGhhdCBcY29kZXsie1wlfXByb2cifSBpcyBleHBhbmRlZCBqdXN0IGxpa2UgaXQgaXMgaW4gXGNvZGV7dXNhZ2V9LiAgQXBhcnQKK1xjb2RleyJ7XCV9cHJvZyJ9IGlzIGV4cGFuZGVkIGp1c3QgbGlrZSBpdCBpcyBpbiBcY29kZXt1c2FnZX0uICBBcGFydAogZnJvbSB0aGF0LCBcY29kZXt2ZXJzaW9ufSBjYW4gY29udGFpbiBhbnl0aGluZyB5b3UgbGlrZS4gIFdoZW4geW91IHN1cHBseQogaXQsIFxtb2R1bGV7b3B0cGFyc2V9IGF1dG9tYXRpY2FsbHkgYWRkcyBhIFxjb2RleyIte30tdmVyc2lvbiJ9IG9wdGlvbiB0byB5b3VyIHBhcnNlci4KIElmIGl0IGVuY291bnRlcnMgdGhpcyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZSwgaXQgZXhwYW5kcyB5b3VyCkBAIC02NTksNyArNjYxLDcgQEAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgbWFpbigpCiBcZW5ke3ZlcmJhdGltfQotJSAkSWQ6IHR1dG9yaWFsLnR4dCA1MDUgMjAwNS0wNy0yMiAwMTo1Mjo0MFogZ3dhcmQgJCAKKyUgJElkOiB0dXRvcmlhbC50eHQgNTE1IDIwMDYtMDYtMTAgMTU6Mzc6NDVaIGd3YXJkICQgCiAKIAogXHN1YnNlY3Rpb257UmVmZXJlbmNlIEd1aWRlXGxhYmVse29wdHBhcnNlLXJlZmVyZW5jZS1ndWlkZX19CkBAIC0xMTQ2LDcgKzExNDgsNyBAQAogCiBcbW9kdWxle29wdHBhcnNlfSBoYXMgc2l4IGJ1aWx0LWluIG9wdGlvbiB0eXBlczogXGNvZGV7c3RyaW5nfSwgXGNvZGV7aW50fSwgXGNvZGV7bG9uZ30sCiBcY29kZXtjaG9pY2V9LCBcY29kZXtmbG9hdH0gYW5kIFxjb2Rle2NvbXBsZXh9LiAgSWYgeW91IG5lZWQgdG8gYWRkIG5ldyBvcHRpb24KLXR5cGVzLCBzZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZ30sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KK3R5cGVzLCBzZWUgc2VjdGlvbn5ccmVme29wdHBhcnNlLWV4dGVuZGluZy1vcHRwYXJzZX0sIEV4dGVuZGluZyBcbW9kdWxle29wdHBhcnNlfS4KIAogQXJndW1lbnRzIHRvIHN0cmluZyBvcHRpb25zIGFyZSBub3QgY2hlY2tlZCBvciBjb252ZXJ0ZWQgaW4gYW55IHdheTogdGhlCiB0ZXh0IG9uIHRoZSBjb21tYW5kIGxpbmUgaXMgc3RvcmVkIGluIHRoZSBkZXN0aW5hdGlvbiAob3IgcGFzc2VkIHRvIHRoZQpAQCAtMTE5NSwxNiArMTE5NywxNiBAQAogd2hlcmUgdGhlIGlucHV0IHBhcmFtZXRlcnMgYXJlCiBcYmVnaW57ZGVzY3JpcHRpb259CiBcaXRlbVtcY29kZXthcmdzfV0KLXRoZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwcm9jZXNzIChcY29kZXtzeXMuYXJndntbfTE6XX0gYnkgZGVmYXVsdCkKK3RoZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwcm9jZXNzIChkZWZhdWx0OiBcY29kZXtzeXMuYXJndntbfTE6XX0pCiBcaXRlbVtcY29kZXtvcHRpb25zfV0KLW9iamVjdCB0byBzdG9yZSBvcHRpb24gYXJndW1lbnRzIGluIChhIG5ldyBpbnN0YW5jZSBvZgotb3B0cGFyc2UuVmFsdWVzIGJ5IGRlZmF1bHQpCitvYmplY3QgdG8gc3RvcmUgb3B0aW9uIGFyZ3VtZW50cyBpbiAoZGVmYXVsdDogYSBuZXcgaW5zdGFuY2Ugb2YKK29wdHBhcnNlLlZhbHVlcykKIFxlbmR7ZGVzY3JpcHRpb259CiAKIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUKIFxiZWdpbntkZXNjcmlwdGlvbn0KIFxpdGVtW1xjb2Rle29wdGlvbnN9XQotdGhlIHNhbWUgb2JqZWN0IGFzIHdhcyBwYXNzZWQgaW4gYXMgXGNvZGV7b3B0aW9uc30sIG9yIHRoZSBuZXcKK3RoZSBzYW1lIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgaW4gYXMgXGNvZGV7b3B0aW9uc30sIG9yIHRoZQogb3B0cGFyc2UuVmFsdWVzIGluc3RhbmNlIGNyZWF0ZWQgYnkgXG1vZHVsZXtvcHRwYXJzZX0KIFxpdGVtW1xjb2Rle2FyZ3N9XQogdGhlIGxlZnRvdmVyIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFmdGVyIGFsbCBvcHRpb25zIGhhdmUgYmVlbgpAQCAtMTIxMiw5ICsxMjE0LDkgQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIFRoZSBtb3N0IGNvbW1vbiB1c2FnZSBpcyB0byBzdXBwbHkgbmVpdGhlciBrZXl3b3JkIGFyZ3VtZW50LiAgSWYgeW91Ci1zdXBwbHkgYSBcY29kZXt2YWx1ZXN9IG9iamVjdCwgaXQgd2lsbCBiZSByZXBlYXRlZGx5IG1vZGlmaWVkIHdpdGggYQotXGNvZGV7c2V0YXR0cigpfSBjYWxsIGZvciBldmVyeSBvcHRpb24gYXJndW1lbnQgd3JpdHRlbiB0byBhbiBvcHRpb24KLWRlc3RpbmF0aW9uLCBhbmQgZmluYWxseSByZXR1cm5lZCBieSBcbWV0aG9ke3BhcnNle1xffWFyZ3MoKX0uCitzdXBwbHkgXGNvZGV7b3B0aW9uc30sIGl0IHdpbGwgYmUgbW9kaWZpZWQgd2l0aCByZXBlYXRlZCBcY29kZXtzZXRhdHRyKCl9CitjYWxscyAocm91Z2hseSBvbmUgZm9yIGV2ZXJ5IG9wdGlvbiBhcmd1bWVudCBzdG9yZWQgdG8gYW4gb3B0aW9uCitkZXN0aW5hdGlvbikgYW5kIHJldHVybmVkIGJ5IFxtZXRob2R7cGFyc2V7XF99YXJncygpfS4KIAogSWYgXG1ldGhvZHtwYXJzZXtcX31hcmdzKCl9IGVuY291bnRlcnMgYW55IGVycm9ycyBpbiB0aGUgYXJndW1lbnQgbGlzdCwgaXQgY2FsbHMKIHRoZSBPcHRpb25QYXJzZXIncyBcbWV0aG9ke2Vycm9yKCl9IG1ldGhvZCB3aXRoIGFuIGFwcHJvcHJpYXRlIGVuZC11c2VyIGVycm9yCkBAIC0xMzg4LDcgKzEzOTAsNyBAQAogXGVuZHt2ZXJiYXRpbX0KIAogXGVuZHtpdGVtaXplfQotJSAkSWQ6IHJlZmVyZW5jZS50eHQgNTA1IDIwMDUtMDctMjIgMDE6NTI6NDBaIGd3YXJkICQgCislICRJZDogcmVmZXJlbmNlLnR4dCA1MTkgMjAwNi0wNi0xMSAxNDozOToxMVogZ3dhcmQgJCAKIAogCiBcc3Vic2VjdGlvbntPcHRpb24gQ2FsbGJhY2tzXGxhYmVse29wdHBhcnNlLW9wdGlvbi1jYWxsYmFja3N9fQpAQCAtMTY4MSwzICsxNjgzLDIwNiBAQAogXGNvZGV7Ii1jIn0uICBGaXhpbmcgdGhpcyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIGZvciB0aGUgcmVhZGVyLgogJSAkSWQ6IGNhbGxiYWNrcy50eHQgNDE1IDIwMDQtMDktMzAgMDI6MjY6MTdaIGdyZWcgJCAKIAorCitcc3Vic2VjdGlvbntFeHRlbmRpbmcgXG1vZHVsZXtvcHRwYXJzZX1cbGFiZWx7b3B0cGFyc2UtZXh0ZW5kaW5nLW9wdHBhcnNlfX0KKworU2luY2UgdGhlIHR3byBtYWpvciBjb250cm9sbGluZyBmYWN0b3JzIGluIGhvdyBcbW9kdWxle29wdHBhcnNlfSBpbnRlcnByZXRzCitjb21tYW5kLWxpbmUgb3B0aW9ucyBhcmUgdGhlIGFjdGlvbiBhbmQgdHlwZSBvZiBlYWNoIG9wdGlvbiwgdGhlIG1vc3QKK2xpa2VseSBkaXJlY3Rpb24gb2YgZXh0ZW5zaW9uIGlzIHRvIGFkZCBuZXcgYWN0aW9ucyBhbmQgbmV3IHR5cGVzLgorCisKK1xzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgdHlwZXNcbGFiZWx7b3B0cGFyc2UtYWRkaW5nLW5ldy10eXBlc319CisKK1RvIGFkZCBuZXcgdHlwZXMsIHlvdSBuZWVkIHRvIGRlZmluZSB5b3VyIG93biBzdWJjbGFzcyBvZiBcbW9kdWxle29wdHBhcnNlfSdzIE9wdGlvbgorY2xhc3MuICBUaGlzIGNsYXNzIGhhcyBhIGNvdXBsZSBvZiBhdHRyaWJ1dGVzIHRoYXQgZGVmaW5lIFxtb2R1bGV7b3B0cGFyc2V9J3MgdHlwZXM6CitcbWVtYmVye1RZUEVTfSBhbmQgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9LgorCitcbWVtYmVye1RZUEVTfSBpcyBhIHR1cGxlIG9mIHR5cGUgbmFtZXM7IGluIHlvdXIgc3ViY2xhc3MsIHNpbXBseSBkZWZpbmUgYSBuZXcKK3R1cGxlIFxtZW1iZXJ7VFlQRVN9IHRoYXQgYnVpbGRzIG9uIHRoZSBzdGFuZGFyZCBvbmUuCisKK1xtZW1iZXJ7VFlQRXtcX31DSEVDS0VSfSBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZyB0eXBlIG5hbWVzIHRvIHR5cGUtY2hlY2tpbmcKK2Z1bmN0aW9ucy4gIEEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CitcYmVnaW57dmVyYmF0aW19CitkZWYgY2hlY2tfbXl0eXBlKG9wdGlvbiwgb3B0LCB2YWx1ZSkKK1xlbmR7dmVyYmF0aW19CisKK3doZXJlIFxjb2Rle29wdGlvbn0gaXMgYW4gXGNsYXNze09wdGlvbn0gaW5zdGFuY2UsIFxjb2Rle29wdH0gaXMgYW4gb3B0aW9uIHN0cmluZworKGUuZy4sIFxjb2RleyItZiJ9KSwgYW5kIFxjb2Rle3ZhbHVlfSBpcyB0aGUgc3RyaW5nIGZyb20gdGhlIGNvbW1hbmQgbGluZSB0aGF0CittdXN0IGJlIGNoZWNrZWQgYW5kIGNvbnZlcnRlZCB0byB5b3VyIGRlc2lyZWQgdHlwZS4gIFxjb2Rle2NoZWNre1xffW15dHlwZSgpfQorc2hvdWxkIHJldHVybiBhbiBvYmplY3Qgb2YgdGhlIGh5cG90aGV0aWNhbCB0eXBlIFxjb2Rle215dHlwZX0uICBUaGUgdmFsdWUKK3JldHVybmVkIGJ5IGEgdHlwZS1jaGVja2luZyBmdW5jdGlvbiB3aWxsIHdpbmQgdXAgaW4gdGhlIE9wdGlvblZhbHVlcworaW5zdGFuY2UgcmV0dXJuZWQgYnkgXG1ldGhvZHtPcHRpb25QYXJzZXIucGFyc2V7XF99YXJncygpfSwgb3IgYmUgcGFzc2VkIHRvIGEKK2NhbGxiYWNrIGFzIHRoZSBcY29kZXt2YWx1ZX0gcGFyYW1ldGVyLgorCitZb3VyIHR5cGUtY2hlY2tpbmcgZnVuY3Rpb24gc2hvdWxkIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IgaWYgaXQKK2VuY291bnRlcnMgYW55IHByb2JsZW1zLiAgT3B0aW9uVmFsdWVFcnJvciB0YWtlcyBhIHNpbmdsZSBzdHJpbmcKK2FyZ3VtZW50LCB3aGljaCBpcyBwYXNzZWQgYXMtaXMgdG8gT3B0aW9uUGFyc2VyJ3MgXG1ldGhvZHtlcnJvcigpfSBtZXRob2QsCit3aGljaCBpbiB0dXJuIHByZXBlbmRzIHRoZSBwcm9ncmFtIG5hbWUgYW5kIHRoZSBzdHJpbmcgXGNvZGV7ImVycm9yOiJ9IGFuZAorcHJpbnRzIGV2ZXJ5dGhpbmcgdG8gc3RkZXJyIGJlZm9yZSB0ZXJtaW5hdGluZyB0aGUgcHJvY2Vzcy4KKworSGVyZSdzIGEgc2lsbHkgZXhhbXBsZSB0aGF0IGRlbW9uc3RyYXRlcyBhZGRpbmcgYSBcY29kZXtjb21wbGV4fSBvcHRpb24KK3R5cGUgdG8gcGFyc2UgUHl0aG9uLXN0eWxlIGNvbXBsZXggbnVtYmVycyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgKFRoaXMKK2lzIGV2ZW4gc2lsbGllciB0aGFuIGl0IHVzZWQgdG8gYmUsIGJlY2F1c2UgXG1vZHVsZXtvcHRwYXJzZX0gMS4zIGFkZGVkIGJ1aWx0LWluCitzdXBwb3J0IGZvciBjb21wbGV4IG51bWJlcnMsIGJ1dCBuZXZlciBtaW5kLikKKworRmlyc3QsIHRoZSBuZWNlc3NhcnkgaW1wb3J0czoKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gY29weSBpbXBvcnQgY29weQorZnJvbSBvcHRwYXJzZSBpbXBvcnQgT3B0aW9uLCBPcHRpb25WYWx1ZUVycm9yCitcZW5ke3ZlcmJhdGltfQorCitZb3UgbmVlZCB0byBkZWZpbmUgeW91ciB0eXBlLWNoZWNrZXIgZmlyc3QsIHNpbmNlIGl0J3MgcmVmZXJyZWQgdG8gbGF0ZXIKKyhpbiB0aGUgXG1lbWJlcntUWVBFe1xffUNIRUNLRVJ9IGNsYXNzIGF0dHJpYnV0ZSBvZiB5b3VyIE9wdGlvbiBzdWJjbGFzcyk6CitcYmVnaW57dmVyYmF0aW19CitkZWYgY2hlY2tfY29tcGxleChvcHRpb24sIG9wdCwgdmFsdWUpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIGNvbXBsZXgodmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJhaXNlIE9wdGlvblZhbHVlRXJyb3IoCisgICAgICAgICAgICAib3B0aW9uICVzOiBpbnZhbGlkIGNvbXBsZXggdmFsdWU6ICVyIiAlIChvcHQsIHZhbHVlKSkKK1xlbmR7dmVyYmF0aW19CisKK0ZpbmFsbHksIHRoZSBPcHRpb24gc3ViY2xhc3M6CitcYmVnaW57dmVyYmF0aW19CitjbGFzcyBNeU9wdGlvbiAoT3B0aW9uKToKKyAgICBUWVBFUyA9IE9wdGlvbi5UWVBFUyArICgiY29tcGxleCIsKQorICAgIFRZUEVfQ0hFQ0tFUiA9IGNvcHkoT3B0aW9uLlRZUEVfQ0hFQ0tFUikKKyAgICBUWVBFX0NIRUNLRVJbImNvbXBsZXgiXSA9IGNoZWNrX2NvbXBsZXgKK1xlbmR7dmVyYmF0aW19CisKKyhJZiB3ZSBkaWRuJ3QgbWFrZSBhIFxmdW5jdGlvbntjb3B5KCl9IG9mIFxtZW1iZXJ7T3B0aW9uLlRZUEV7XF99Q0hFQ0tFUn0sIHdlIHdvdWxkIGVuZAordXAgbW9kaWZ5aW5nIHRoZSBcbWVtYmVye1RZUEV7XF99Q0hFQ0tFUn0gYXR0cmlidXRlIG9mIFxtb2R1bGV7b3B0cGFyc2V9J3MgT3B0aW9uIGNsYXNzLgorVGhpcyBiZWluZyBQeXRob24sIG5vdGhpbmcgc3RvcHMgeW91IGZyb20gZG9pbmcgdGhhdCBleGNlcHQgZ29vZCBtYW5uZXJzCithbmQgY29tbW9uIHNlbnNlLikKKworVGhhdCdzIGl0ISAgTm93IHlvdSBjYW4gd3JpdGUgYSBzY3JpcHQgdGhhdCB1c2VzIHRoZSBuZXcgb3B0aW9uIHR5cGUKK2p1c3QgbGlrZSBhbnkgb3RoZXIgXG1vZHVsZXtvcHRwYXJzZX0tYmFzZWQgc2NyaXB0LCBleGNlcHQgeW91IGhhdmUgdG8gaW5zdHJ1Y3QgeW91cgorT3B0aW9uUGFyc2VyIHRvIHVzZSBNeU9wdGlvbiBpbnN0ZWFkIG9mIE9wdGlvbjoKK1xiZWdpbnt2ZXJiYXRpbX0KK3BhcnNlciA9IE9wdGlvblBhcnNlcihvcHRpb25fY2xhc3M9TXlPcHRpb24pCitwYXJzZXIuYWRkX29wdGlvbigiLWMiLCB0eXBlPSJjb21wbGV4IikKK1xlbmR7dmVyYmF0aW19CisKK0FsdGVybmF0ZWx5LCB5b3UgY2FuIGJ1aWxkIHlvdXIgb3duIG9wdGlvbiBsaXN0IGFuZCBwYXNzIGl0IHRvCitPcHRpb25QYXJzZXI7IGlmIHlvdSBkb24ndCB1c2UgXG1ldGhvZHthZGR7XF99b3B0aW9uKCl9IGluIHRoZSBhYm92ZSB3YXksIHlvdQorZG9uJ3QgbmVlZCB0byB0ZWxsIE9wdGlvblBhcnNlciB3aGljaCBvcHRpb24gY2xhc3MgdG8gdXNlOgorXGJlZ2lue3ZlcmJhdGltfQorb3B0aW9uX2xpc3QgPSBbTXlPcHRpb24oIi1jIiwgYWN0aW9uPSJzdG9yZSIsIHR5cGU9ImNvbXBsZXgiLCBkZXN0PSJjIildCitwYXJzZXIgPSBPcHRpb25QYXJzZXIob3B0aW9uX2xpc3Q9b3B0aW9uX2xpc3QpCitcZW5ke3ZlcmJhdGltfQorCisKK1xzdWJzdWJzZWN0aW9ue0FkZGluZyBuZXcgYWN0aW9uc1xsYWJlbHtvcHRwYXJzZS1hZGRpbmctbmV3LWFjdGlvbnN9fQorCitBZGRpbmcgbmV3IGFjdGlvbnMgaXMgYSBiaXQgdHJpY2tpZXIsIGJlY2F1c2UgeW91IGhhdmUgdG8gdW5kZXJzdGFuZAordGhhdCBcbW9kdWxle29wdHBhcnNlfSBoYXMgYSBjb3VwbGUgb2YgY2xhc3NpZmljYXRpb25zIGZvciBhY3Rpb25zOgorXGJlZ2lue2Rlc2NyaXB0aW9ufQorXGl0ZW1bYGBzdG9yZScnIGFjdGlvbnNdCithY3Rpb25zIHRoYXQgcmVzdWx0IGluIFxtb2R1bGV7b3B0cGFyc2V9IHN0b3JpbmcgYSB2YWx1ZSB0byBhbiBhdHRyaWJ1dGUgb2YgdGhlCitjdXJyZW50IE9wdGlvblZhbHVlcyBpbnN0YW5jZTsgdGhlc2Ugb3B0aW9ucyByZXF1aXJlIGEgXG1lbWJlcntkZXN0fQorYXR0cmlidXRlIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSBPcHRpb24gY29uc3RydWN0b3IKK1xpdGVtW2BgdHlwZWQnJyBhY3Rpb25zXQorYWN0aW9ucyB0aGF0IHRha2UgYSB2YWx1ZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgYW5kIGV4cGVjdCBpdCB0byBiZQorb2YgYSBjZXJ0YWluIHR5cGU7IG9yIHJhdGhlciwgYSBzdHJpbmcgdGhhdCBjYW4gYmUgY29udmVydGVkIHRvIGEKK2NlcnRhaW4gdHlwZS4gIFRoZXNlIG9wdGlvbnMgcmVxdWlyZSBhIFxtZW1iZXJ7dHlwZX0gYXR0cmlidXRlIHRvIHRoZQorT3B0aW9uIGNvbnN0cnVjdG9yLgorXGVuZHtkZXNjcmlwdGlvbn0KKworVGhlc2UgYXJlIG92ZXJsYXBwaW5nIHNldHM6IHNvbWUgZGVmYXVsdCBgYHN0b3JlJycgYWN0aW9ucyBhcmUgXGNvZGV7c3RvcmV9LAorXGNvZGV7c3RvcmV7XF99Y29uc3R9LCBcY29kZXthcHBlbmR9LCBhbmQgXGNvZGV7Y291bnR9LCB3aGlsZSB0aGUgZGVmYXVsdCBgYHR5cGVkJycKK2FjdGlvbnMgYXJlIFxjb2Rle3N0b3JlfSwgXGNvZGV7YXBwZW5kfSwgYW5kIFxjb2Rle2NhbGxiYWNrfS4KKworV2hlbiB5b3UgYWRkIGFuIGFjdGlvbiwgeW91IG5lZWQgdG8gY2F0ZWdvcml6ZSBpdCBieSBsaXN0aW5nIGl0IGluIGF0CitsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBjbGFzcyBhdHRyaWJ1dGVzIG9mIE9wdGlvbiAoYWxsIGFyZSBsaXN0cyBvZgorc3RyaW5ncyk6CitcYmVnaW57ZGVzY3JpcHRpb259CitcaXRlbVtcbWVtYmVye0FDVElPTlN9XQorYWxsIGFjdGlvbnMgbXVzdCBiZSBsaXN0ZWQgaW4gQUNUSU9OUworXGl0ZW1bXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfV0KK2Bgc3RvcmUnJyBhY3Rpb25zIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUKK1xpdGVtW1xtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU31dCitgYHR5cGVkJycgYWN0aW9ucyBhcmUgYWRkaXRpb25hbGx5IGxpc3RlZCBoZXJlCitcaXRlbVtcY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU31dCithY3Rpb25zIHRoYXQgYWx3YXlzIHRha2UgYSB0eXBlIChpLmUuIHdob3NlIG9wdGlvbnMgYWx3YXlzIHRha2UgYQordmFsdWUpIGFyZSBhZGRpdGlvbmFsbHkgbGlzdGVkIGhlcmUuICBUaGUgb25seSBlZmZlY3Qgb2YgdGhpcyBpcwordGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUsIFxjb2Rle3N0cmluZ30sIHRvIG9wdGlvbnMgd2l0aCBubworZXhwbGljaXQgdHlwZSB3aG9zZSBhY3Rpb24gaXMgbGlzdGVkIGluIFxjb2Rle0FMV0FZU3tcX31UWVBFRHtcX31BQ1RJT05TfS4KK1xlbmR7ZGVzY3JpcHRpb259CisKK0luIG9yZGVyIHRvIGFjdHVhbGx5IGltcGxlbWVudCB5b3VyIG5ldyBhY3Rpb24sIHlvdSBtdXN0IG92ZXJyaWRlCitPcHRpb24ncyBcbWV0aG9ke3Rha2V7XF99YWN0aW9uKCl9IG1ldGhvZCBhbmQgYWRkIGEgY2FzZSB0aGF0IHJlY29nbml6ZXMgeW91cgorYWN0aW9uLgorCitGb3IgZXhhbXBsZSwgbGV0J3MgYWRkIGFuIFxjb2Rle2V4dGVuZH0gYWN0aW9uLiAgVGhpcyBpcyBzaW1pbGFyIHRvIHRoZQorc3RhbmRhcmQgXGNvZGV7YXBwZW5kfSBhY3Rpb24sIGJ1dCBpbnN0ZWFkIG9mIHRha2luZyBhIHNpbmdsZSB2YWx1ZSBmcm9tCit0aGUgY29tbWFuZC1saW5lIGFuZCBhcHBlbmRpbmcgaXQgdG8gYW4gZXhpc3RpbmcgbGlzdCwgXGNvZGV7ZXh0ZW5kfSB3aWxsCit0YWtlIG11bHRpcGxlIHZhbHVlcyBpbiBhIHNpbmdsZSBjb21tYS1kZWxpbWl0ZWQgc3RyaW5nLCBhbmQgZXh0ZW5kIGFuCitleGlzdGluZyBsaXN0IHdpdGggdGhlbS4gIFRoYXQgaXMsIGlmIFxjb2RleyIte30tbmFtZXMifSBpcyBhbiBcY29kZXtleHRlbmR9CitvcHRpb24gb2YgdHlwZSBcY29kZXtzdHJpbmd9LCB0aGUgY29tbWFuZCBsaW5lCitcYmVnaW57dmVyYmF0aW19CistLW5hbWVzPWZvbyxiYXIgLS1uYW1lcyBibGFoIC0tbmFtZXMgZGluZyxkb25nCitcZW5ke3ZlcmJhdGltfQorCit3b3VsZCByZXN1bHQgaW4gYSBsaXN0CitcYmVnaW57dmVyYmF0aW19CitbImZvbyIsICJiYXIiLCAiYmxhaCIsICJkaW5nIiwgImRvbmciXQorXGVuZHt2ZXJiYXRpbX0KKworQWdhaW4gd2UgZGVmaW5lIGEgc3ViY2xhc3Mgb2YgT3B0aW9uOgorXGJlZ2lue3ZlcmJhdGltfQorY2xhc3MgTXlPcHRpb24gKE9wdGlvbik6CisKKyAgICBBQ1RJT05TID0gT3B0aW9uLkFDVElPTlMgKyAoImV4dGVuZCIsKQorICAgIFNUT1JFX0FDVElPTlMgPSBPcHRpb24uU1RPUkVfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisgICAgVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5UWVBFRF9BQ1RJT05TICsgKCJleHRlbmQiLCkKKyAgICBBTFdBWVNfVFlQRURfQUNUSU9OUyA9IE9wdGlvbi5BTFdBWVNfVFlQRURfQUNUSU9OUyArICgiZXh0ZW5kIiwpCisKKyAgICBkZWYgdGFrZV9hY3Rpb24oc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcik6CisgICAgICAgIGlmIGFjdGlvbiA9PSAiZXh0ZW5kIjoKKyAgICAgICAgICAgIGx2YWx1ZSA9IHZhbHVlLnNwbGl0KCIsIikKKyAgICAgICAgICAgIHZhbHVlcy5lbnN1cmVfdmFsdWUoZGVzdCwgW10pLmV4dGVuZChsdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBPcHRpb24udGFrZV9hY3Rpb24oCisgICAgICAgICAgICAgICAgc2VsZiwgYWN0aW9uLCBkZXN0LCBvcHQsIHZhbHVlLCB2YWx1ZXMsIHBhcnNlcikKK1xlbmR7dmVyYmF0aW19CisKK0ZlYXR1cmVzIG9mIG5vdGU6CitcYmVnaW57aXRlbWl6ZX0KK1xpdGVtIHt9IAorXGNvZGV7ZXh0ZW5kfSBib3RoIGV4cGVjdHMgYSB2YWx1ZSBvbiB0aGUgY29tbWFuZC1saW5lIGFuZCBzdG9yZXMgdGhhdAordmFsdWUgc29tZXdoZXJlLCBzbyBpdCBnb2VzIGluIGJvdGggXG1lbWJlcntTVE9SRXtcX31BQ1RJT05TfSBhbmQKK1xtZW1iZXJ7VFlQRUR7XF99QUNUSU9OU30KKworXGl0ZW0ge30gCit0byBlbnN1cmUgdGhhdCBcbW9kdWxle29wdHBhcnNlfSBhc3NpZ25zIHRoZSBkZWZhdWx0IHR5cGUgb2YgXGNvZGV7c3RyaW5nfSB0bworXGNvZGV7ZXh0ZW5kfSBhY3Rpb25zLCB3ZSBwdXQgdGhlIFxjb2Rle2V4dGVuZH0gYWN0aW9uIGluCitcY29kZXtBTFdBWVN7XF99VFlQRUR7XF99QUNUSU9OU30gYXMgd2VsbAorCitcaXRlbSB7fSAKK1xtZXRob2R7TXlPcHRpb24udGFrZXtcX31hY3Rpb24oKX0gaW1wbGVtZW50cyBqdXN0IHRoaXMgb25lIG5ldyBhY3Rpb24sIGFuZAorcGFzc2VzIGNvbnRyb2wgYmFjayB0byBcbWV0aG9ke09wdGlvbi50YWtle1xffWFjdGlvbigpfSBmb3IgdGhlIHN0YW5kYXJkCitcbW9kdWxle29wdHBhcnNlfSBhY3Rpb25zCisKK1xpdGVtIHt9IAorXGNvZGV7dmFsdWVzfSBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgb3B0cGFyc2V7XF99cGFyc2VyLlZhbHVlcyBjbGFzcywKK3doaWNoIHByb3ZpZGVzIHRoZSB2ZXJ5IHVzZWZ1bCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBtZXRob2QuCitcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSBpcyBlc3NlbnRpYWxseSBcZnVuY3Rpb257Z2V0YXR0cigpfSB3aXRoIGEgc2FmZXR5IHZhbHZlOworaXQgaXMgY2FsbGVkIGFzCitcYmVnaW57dmVyYmF0aW19Cit2YWx1ZXMuZW5zdXJlX3ZhbHVlKGF0dHIsIHZhbHVlKQorXGVuZHt2ZXJiYXRpbX0KKworSWYgdGhlIFxjb2Rle2F0dHJ9IGF0dHJpYnV0ZSBvZiBcY29kZXt2YWx1ZXN9IGRvZXNuJ3QgZXhpc3Qgb3IgaXMgTm9uZSwgdGhlbgorZW5zdXJle1xffXZhbHVlKCkgZmlyc3Qgc2V0cyBpdCB0byBcY29kZXt2YWx1ZX0sIGFuZCB0aGVuIHJldHVybnMgJ3ZhbHVlLgorVGhpcyBpcyB2ZXJ5IGhhbmR5IGZvciBhY3Rpb25zIGxpa2UgXGNvZGV7ZXh0ZW5kfSwgXGNvZGV7YXBwZW5kfSwgYW5kCitcY29kZXtjb3VudH0sIGFsbCBvZiB3aGljaCBhY2N1bXVsYXRlIGRhdGEgaW4gYSB2YXJpYWJsZSBhbmQgZXhwZWN0IHRoYXQKK3ZhcmlhYmxlIHRvIGJlIG9mIGEgY2VydGFpbiB0eXBlIChhIGxpc3QgZm9yIHRoZSBmaXJzdCB0d28sIGFuIGludGVnZXIKK2ZvciB0aGUgbGF0dGVyKS4gIFVzaW5nIFxtZXRob2R7ZW5zdXJle1xffXZhbHVlKCl9IG1lYW5zIHRoYXQgc2NyaXB0cyB1c2luZworeW91ciBhY3Rpb24gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzZXR0aW5nIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlCitvcHRpb24gZGVzdGluYXRpb25zIGluIHF1ZXN0aW9uOyB0aGV5IGNhbiBqdXN0IGxlYXZlIHRoZSBkZWZhdWx0IGFzCitOb25lIGFuZCBcbWV0aG9ke2Vuc3VyZXtcX312YWx1ZSgpfSB3aWxsIHRha2UgY2FyZSBvZiBnZXR0aW5nIGl0IHJpZ2h0IHdoZW4KK2l0J3MgbmVlZGVkLgorCitcZW5ke2l0ZW1pemV9CislICRJZDogZXh0ZW5kaW5nLnR4dCA1MTcgMjAwNi0wNi0xMCAxNjoxODoxMVogZ3dhcmQgJCAKKwpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJvc3NhdWRpb2Rldi50ZXggYi9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleAppbmRleCAyMjNjZjI4Li40YzE5YWFmIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleAorKysgYi9Eb2MvbGliL2xpYm9zc2F1ZGlvZGV2LnRleApAQCAtNjgsNyArNjgsNyBAQAogT3BlbiBhbiBhdWRpbyBkZXZpY2UgYW5kIHJldHVybiBhbiBPU1MgYXVkaW8gZGV2aWNlIG9iamVjdC4gIFRoaXMKIG9iamVjdCBzdXBwb3J0cyBtYW55IGZpbGUtbGlrZSBtZXRob2RzLCBzdWNoIGFzIFxtZXRob2R7cmVhZCgpfSwKIFxtZXRob2R7d3JpdGUoKX0sIGFuZCBcbWV0aG9ke2ZpbGVubygpfSAoYWx0aG91Z2ggdGhlcmUgYXJlIHN1YnRsZQotZGlmZmVyZW5jZXMgYmV0d2VlbiBjb252ZW50aW9uYWwgVW5peCByZWFkL3dyaXRlIHNlbWFudGljcyBhbmQgdGhvc2Ugb2YKK2RpZmZlcmVuY2VzIGJldHdlZW4gY29udmVudGlvbmFsIFxVTklYe30gcmVhZC93cml0ZSBzZW1hbnRpY3MgYW5kIHRob3NlIG9mCiBPU1MgYXVkaW8gZGV2aWNlcykuICBJdCBhbHNvIHN1cHBvcnRzIGEgbnVtYmVyIG9mIGF1ZGlvLXNwZWNpZmljCiBtZXRob2RzOyBzZWUgYmVsb3cgZm9yIHRoZSBjb21wbGV0ZSBsaXN0IG9mIG1ldGhvZHMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicGlja2xlLnRleCBiL0RvYy9saWIvbGlicGlja2xlLnRleAppbmRleCA0NWU4MGI4Li5hOGFiMzllIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBpY2tsZS50ZXgKKysrIGIvRG9jL2xpYi9saWJwaWNrbGUudGV4CkBAIC03MjUsNyArNzI1LDUwIEBACiAKIFxzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3BpY2tsZS1leGFtcGxlfX0KIAotSGVyZSdzIGEgc2ltcGxlIGV4YW1wbGUgb2YgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYQorRm9yIHRoZSBzaW1wbGVzdCBjb2RlLCB1c2UgdGhlIFxmdW5jdGlvbntkdW1wKCl9IGFuZCBcZnVuY3Rpb257bG9hZCgpfQorZnVuY3Rpb25zLiAgTm90ZSB0aGF0IGEgc2VsZi1yZWZlcmVuY2luZyBsaXN0IGlzIHBpY2tsZWQgYW5kIHJlc3RvcmVkCitjb3JyZWN0bHkuCisKK1xiZWdpbnt2ZXJiYXRpbX0KK2ltcG9ydCBwaWNrbGUKKworZGF0YTEgPSB7J2EnOiBbMSwgMi4wLCAzLCA0KzZqXSwKKyAgICAgICAgICdiJzogKCdzdHJpbmcnLCB1J1VuaWNvZGUgc3RyaW5nJyksCisgICAgICAgICAnYyc6IE5vbmV9CisKK3NlbGZyZWZfbGlzdCA9IFsxLCAyLCAzXQorc2VsZnJlZl9saXN0LmFwcGVuZChzZWxmcmVmX2xpc3QpCisKK291dHB1dCA9IG9wZW4oJ2RhdGEucGtsJywgJ3diJykKKworIyBQaWNrbGUgZGljdGlvbmFyeSB1c2luZyBwcm90b2NvbCAwLgorcGlja2xlLmR1bXAoZGF0YTEsIG91dHB1dCkKKworIyBQaWNrbGUgdGhlIGxpc3QgdXNpbmcgdGhlIGhpZ2hlc3QgcHJvdG9jb2wgYXZhaWxhYmxlLgorcGlja2xlLmR1bXAoc2VsZnJlZl9saXN0LCBvdXRwdXQsIC0xKQorCitvdXRwdXQuY2xvc2UoKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlYWRzIHRoZSByZXN1bHRpbmcgcGlja2xlZCBkYXRhLiAgV2hlbiByZWFkaW5nCithIHBpY2tsZS1jb250YWluaW5nIGZpbGUsIHlvdSBzaG91bGQgb3BlbiB0aGUgZmlsZSBpbiBiaW5hcnkgbW9kZQorYmVjYXVzZSB5b3UgY2FuJ3QgYmUgc3VyZSBpZiB0aGUgQVNDSUkgb3IgYmluYXJ5IGZvcm1hdCB3YXMgdXNlZC4KKworXGJlZ2lue3ZlcmJhdGltfQoraW1wb3J0IHBwcmludCwgcGlja2xlCisKK3BrbF9maWxlID0gb3BlbignZGF0YS5wa2wnLCAncmInKQorCitkYXRhMSA9IHBpY2tsZS5sb2FkKHBrbF9maWxlKQorcHByaW50LnBwcmludChkYXRhMSkKKworZGF0YTIgPSBwaWNrbGUubG9hZChwa2xfZmlsZSkKK3BwcmludC5wcHJpbnQoZGF0YTIpCisKK3BrbF9maWxlLmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKK0hlcmUncyBhIGxhcmdlciBleGFtcGxlIHRoYXQgc2hvd3MgaG93IHRvIG1vZGlmeSBwaWNrbGluZyBiZWhhdmlvciBmb3IgYQogY2xhc3MuICBUaGUgXGNsYXNze1RleHRSZWFkZXJ9IGNsYXNzIG9wZW5zIGEgdGV4dCBmaWxlLCBhbmQgcmV0dXJucwogdGhlIGxpbmUgbnVtYmVyIGFuZCBsaW5lIGNvbnRlbnRzIGVhY2ggdGltZSBpdHMgXG1ldGhvZHtyZWFkbGluZSgpfQogbWV0aG9kIGlzIGNhbGxlZC4gSWYgYSBcY2xhc3N7VGV4dFJlYWRlcn0gaW5zdGFuY2UgaXMgcGlja2xlZCwgYWxsCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnBrZ3V0aWwudGV4IGIvRG9jL2xpYi9saWJwa2d1dGlsLnRleAppbmRleCAxNWQ4NjZiLi5hMjg2ZjAwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBrZ3V0aWwudGV4CisrKyBiL0RvYy9saWIvbGlicGtndXRpbC50ZXgKQEAgLTMwLDcgKzMwLDcgQEAKICAgd2l0aCBcY29kZXtpbXBvcnR9LiAgQSBcZmlsZXsqLnBrZ30gZmlsZSBpcyB0cnVzdGVkIGF0IGZhY2UgdmFsdWU6CiAgIGFwYXJ0IGZyb20gY2hlY2tpbmcgZm9yIGR1cGxpY2F0ZXMsIGFsbCBlbnRyaWVzIGZvdW5kIGluIGEKICAgXGZpbGV7Ki5wa2d9IGZpbGUgYXJlIGFkZGVkIHRvIHRoZSBwYXRoLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleQotICBleGlzdCB0aGUgZmlsZXN5c3RlbS4gIChUaGlzIGlzIGEgZmVhdHVyZS4pCisgIGV4aXN0IG9uIHRoZSBmaWxlc3lzdGVtLiAgKFRoaXMgaXMgYSBmZWF0dXJlLikKIAogICBJZiB0aGUgaW5wdXQgcGF0aCBpcyBub3QgYSBsaXN0IChhcyBpcyB0aGUgY2FzZSBmb3IgZnJvemVuCiAgIHBhY2thZ2VzKSBpdCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuICBUaGUgaW5wdXQgcGF0aCBpcyBub3QKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleCBiL0RvYy9saWIvbGlicG9zaXhwYXRoLnRleAppbmRleCA5ZjBkZTFmLi4wYjJkYTY2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnBvc2l4cGF0aC50ZXgKKysrIGIvRG9jL2xpYi9saWJwb3NpeHBhdGgudGV4CkBAIC00Miw4ICs0MiwxMSBAQAogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtleGlzdHN9e3BhdGh9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcGF0aC4KLVJldHVybnMgXGNvZGV7RmFsc2V9IGZvciBicm9rZW4gc3ltYm9saWMgbGlua3MuCitSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgXHZhcntwYXRofSByZWZlcnMgdG8gYW4gZXhpc3RpbmcgcGF0aC4gIFJldHVybnMKK1xjb2Rle0ZhbHNlfSBmb3IgYnJva2VuIHN5bWJvbGljIGxpbmtzLiBPbiBzb21lIHBsYXRmb3JtcywgdGhpcworZnVuY3Rpb24gbWF5IHJldHVybiBcY29kZXtGYWxzZX0gaWYgcGVybWlzc2lvbiBpcyBub3QgZ3JhbnRlZCB0bworZXhlY3V0ZSBcZnVuY3Rpb257b3Muc3RhdCgpfSBvbiB0aGUgcmVxdWVzdGVkIGZpbGUsIGV2ZW4gaWYgdGhlCitcdmFye3BhdGh9IHBoeXNpY2FsbHkgZXhpc3RzLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtsZXhpc3RzfXtwYXRofQpAQCAtMTkwLDkgKzE5Myw4IEBACiBcZW5ke2Z1bmNkZXNjfQogCiBcYmVnaW57ZnVuY2Rlc2N9e3NhbWVvcGVuZmlsZX17ZnAxLCBmcDJ9Ci1SZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgdGhlIGZpbGUgb2JqZWN0cyBcdmFye2ZwMX0gYW5kIFx2YXJ7ZnAyfSByZWZlciB0byB0aGUKLXNhbWUgZmlsZS4gIFRoZSB0d28gZmlsZSBvYmplY3RzIG1heSByZXByZXNlbnQgZGlmZmVyZW50IGZpbGUKLWRlc2NyaXB0b3JzLgorUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBmaWxlIGRlc2NyaXB0b3JzIFx2YXJ7ZnAxfSBhbmQgXHZhcntmcDJ9IHJlZmVyCit0byB0aGUgc2FtZSBmaWxlLgogQXZhaWxhYmlsaXR5OiAgTWFjaW50b3NoLCBcVU5JWC4KIFxlbmR7ZnVuY2Rlc2N9CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmFuZG9tLnRleCBiL0RvYy9saWIvbGlicmFuZG9tLnRleAppbmRleCA2YzJmNzEwLi5jNmI4ODQ2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnJhbmRvbS50ZXgKKysrIGIvRG9jL2xpYi9saWJyYW5kb20udGV4CkBAIC0yMzYsNyArMjM2LDcgQEAKICAgXHZhcntiZXRhfSBpcyB0aGUgc2hhcGUgcGFyYW1ldGVyLgogXGVuZHtmdW5jZGVzY30KIAotQWx0ZXJuYXRpdmUgR2VuZXJhdG9ycworQWx0ZXJuYXRpdmUgR2VuZXJhdG9yczoKIAogXGJlZ2lue2NsYXNzZGVzY317V2ljaG1hbm5IaWxsfXtcb3B0aW9uYWx7c2VlZH19CiBDbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFdpY2htYW5uLUhpbGwgYWxnb3JpdGhtIGFzIHRoZSBjb3JlIGdlbmVyYXRvci4KQEAgLTI2Nyw2ICsyNjcsMzAgQEAKIFx2ZXJzaW9uYWRkZWR7Mi40fQogXGVuZHtjbGFzc2Rlc2N9CiAKK0V4YW1wbGVzIG9mIGJhc2ljIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gcmFuZG9tLnJhbmRvbSgpICAgICAgICAjIFJhbmRvbSBmbG9hdCB4LCAwLjAgPD0geCA8IDEuMAorMC4zNzQ0NDg4NzE3NTY0NjY0NgorPj4+IHJhbmRvbS51bmlmb3JtKDEsIDEwKSAgIyBSYW5kb20gZmxvYXQgeCwgMS4wIDw9IHggPCAxMC4wCisxLjE4MDAxNDYwNzMxMTc1MjMKKz4+PiByYW5kb20ucmFuZGludCgxLCAxMCkgICMgSW50ZWdlciBmcm9tIDEgdG8gMTAsIGVuZHBvaW50cyBpbmNsdWRlZAorNworPj4+IHJhbmRvbS5yYW5kcmFuZ2UoMCwgMTAxLCAyKSAgIyBFdmVuIGludGVnZXIgZnJvbSAwIHRvIDEwMAorMjYKKz4+PiByYW5kb20uY2hvaWNlKCdhYmNkZWZnaGlqJykgICMgQ2hvb3NlIGEgcmFuZG9tIGVsZW1lbnQKKydjJworCis+Pj4gaXRlbXMgPSBbMSwgMiwgMywgNCwgNSwgNiwgN10KKz4+PiByYW5kb20uc2h1ZmZsZShpdGVtcykKKz4+PiBpdGVtcworWzcsIDMsIDIsIDUsIDYsIDQsIDFdCisKKz4+PiByYW5kb20uc2FtcGxlKFsxLCAyLCAzLCA0LCA1XSwgIDMpICAjIENob29zZSAzIGVsZW1lbnRzCitbNCwgMSwgNV0KKworXGVuZHt2ZXJiYXRpbX0KKwogXGJlZ2lue3NlZWFsc299CiAgIFxzZWV0ZXh0e00uIE1hdHN1bW90byBhbmQgVC4gTmlzaGltdXJhLCBgYE1lcnNlbm5lIFR3aXN0ZXI6IEEKIAkgICA2MjMtZGltZW5zaW9uYWxseSBlcXVpZGlzdHJpYnV0ZWQgdW5pZm9ybSBwc2V1ZG9yYW5kb20KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlicmUudGV4IGIvRG9jL2xpYi9saWJyZS50ZXgKaW5kZXggMTQwNGUwOS4uODRlMzgyZCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJyZS50ZXgKKysrIGIvRG9jL2xpYi9saWJyZS50ZXgKQEAgLTg5Nyw3ICs4OTcsNyBAQAogICBcbGluZWlpe1xjb2Rle1wlZH19CiAgICAgICAgICB7XHJlZ2V4cHtbLStdP1xlIGQrfX0KICAgXGxpbmVpaXtcY29kZXtcJWV9LCBcY29kZXtcJUV9LCBcY29kZXtcJWZ9LCBcY29kZXtcJWd9fQotICAgICAgICAge1xyZWdleHB7Wy0rXT8oXGUgZCsoXGUuXGUgZCopP3xcZSBkKlxlLlxlIGQrKShbZUVdWy0rXT9cZSBkKyk/fX0KKyAgICAgICAgIHtccmVnZXhwe1stK10/KFxlIGQrKFxlLlxlIGQqKT98XGUuXGUgZCspKFtlRV1bLStdP1xlIGQrKT99fQogICBcbGluZWlpe1xjb2Rle1wlaX19CiAgICAgICAgICB7XHJlZ2V4cHtbLStdPygwW3hYXVtcZSBkQS1GYS1mXSt8MFswLTddKnxcZSBkKyl9fQogICBcbGluZWlpe1xjb2Rle1wlb319CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnJlYWRsaW5lLnRleCBiL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CmluZGV4IGFjOGUyM2YuLmRlYzM3YjYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CisrKyBiL0RvYy9saWIvbGlicmVhZGxpbmUudGV4CkBAIC03LDEwICs3LDEzIEBACiBcbW9kdWxlc3lub3BzaXN7R05VIHJlYWRsaW5lIHN1cHBvcnQgZm9yIFB5dGhvbi59CiAKIAotVGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB1c2VkIGVpdGhlcgotZGlyZWN0bHkgb3IgZnJvbSB0aGUgXHJlZm1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlIHRvIGZhY2lsaXRhdGUKLWNvbXBsZXRpb24gYW5kIGhpc3RvcnkgZmlsZSByZWFkIGFuZCB3cml0ZSBmcm9tIHRoZSBQeXRob24KLWludGVycHJldGVyLgorVGhlIFxtb2R1bGV7cmVhZGxpbmV9IG1vZHVsZSBkZWZpbmVzIGEgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0bworZmFjaWxpdGF0ZSBjb21wbGV0aW9uIGFuZCByZWFkaW5nL3dyaXRpbmcgb2YgaGlzdG9yeSBmaWxlcyBmcm9tIHRoZQorUHl0aG9uIGludGVycHJldGVyLiAgVGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgZGlyZWN0bHkgb3IgdmlhIHRoZQorXHJlZm1vZHVsZXtybGNvbXBsZXRlcn0gbW9kdWxlLiAgU2V0dGluZ3MgbWFkZSB1c2luZyAKK3RoaXMgbW9kdWxlIGFmZmVjdCB0aGUgYmVoYXZpb3VyIG9mIGJvdGggdGhlIGludGVycHJldGVyJ3MgaW50ZXJhY3RpdmUgcHJvbXB0IAorYW5kIHRoZSBwcm9tcHRzIG9mZmVyZWQgYnkgdGhlIFxmdW5jdGlvbntyYXdfaW5wdXQoKX0gYW5kIFxmdW5jdGlvbntpbnB1dCgpfQorYnVpbHQtaW4gZnVuY3Rpb25zLgogCiBUaGUgXG1vZHVsZXtyZWFkbGluZX0gbW9kdWxlIGRlZmluZXMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXggYi9Eb2MvbGliL2xpYnNnbWxsaWIudGV4CmluZGV4IDNlYzEwMTguLjFmZTBkNjMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic2dtbGxpYi50ZXgKKysrIGIvRG9jL2xpYi9saWJzZ21sbGliLnRleApAQCAtMTMyLDI3ICsxMzIsNTkgQEAKIAogXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZV9jaGFycmVmfXtyZWZ9CiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGNoYXJhY3RlciByZWZlcmVuY2Ugb2YgdGhlIGZvcm0KLVxzYW1we1wmXCNcdmFye3JlZn07fS4gIEluIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCBcdmFye3JlZn0gbXVzdAotYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUKLXJhbmdlIDAtMjU1LiAgSXQgdHJhbnNsYXRlcyB0aGUgY2hhcmFjdGVyIHRvIFxBU0NJSXt9IGFuZCBjYWxscyB0aGUKLW1ldGhvZCBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9IHdpdGggdGhlIGNoYXJhY3RlciBhcyBhcmd1bWVudC4gIElmCi1cdmFye3JlZn0gaXMgaW52YWxpZCBvciBvdXQgb2YgcmFuZ2UsIHRoZSBtZXRob2QKLVxjb2Rle3Vua25vd25fY2hhcnJlZihcdmFye3JlZn0pfSBpcyBjYWxsZWQgdG8gaGFuZGxlIHRoZSBlcnJvci4gIEEKLXN1YmNsYXNzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBzdXBwb3J0IGZvciBuYW1lZAotY2hhcmFjdGVyIGVudGl0aWVzLgorXHNhbXB7XCZcI1x2YXJ7cmVmfTt9LiAgVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gdXNlcworXG1ldGhvZHtjb252ZXJ0X2NoYXJyZWYoKX0gdG8gY29udmVydCB0aGUgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLiAgSWYKK3RoYXQgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcsIGl0IGlzIHBhc3NlZCB0byBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9LAorb3RoZXJ3aXNlIFxtZXRob2R7dW5rbm93bl9jaGFycmVmKFx2YXJ7cmVmfSl9IGlzIGNhbGxlZCB0byBoYW5kbGUgdGhlCitlcnJvci4KK1x2ZXJzaW9uY2hhbmdlZFtVc2UgXG1ldGhvZHtjb252ZXJ0X2NoYXJyZWYoKX0gaW5zdGVhZCBvZiBoYXJkLWNvZGluZwordGhlIGNvbnZlcnNpb25dezIuNX0KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2NvbnZlcnRfY2hhcnJlZn17cmVmfQorQ29udmVydCBhIGNoYXJhY3RlciByZWZlcmVuY2UgdG8gYSBzdHJpbmcsIG9yIFxjb2Rle05vbmV9LiAgXHZhcntyZWZ9CitpcyB0aGUgcmVmZXJlbmNlIHBhc3NlZCBpbiBhcyBhIHN0cmluZy4gIEluIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLAorXHZhcntyZWZ9IG11c3QgYmUgYSBkZWNpbWFsIG51bWJlciBpbiB0aGUgcmFuZ2UgMC0yNTUuICBJdCBjb252ZXJ0cwordGhlIGNvZGUgcG9pbnQgZm91bmQgdXNpbmcgdGhlIFxtZXRob2R7Y29udmVydF9jb2RlcG9pbnQoKX0gbWV0aG9kLgorSWYgXHZhcntyZWZ9IGlzIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlLCB0aGlzIG1ldGhvZCByZXR1cm5zCitcY29kZXtOb25lfS4gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0aGUgZGVmYXVsdAorXG1ldGhvZHtoYW5kbGVfY2hhcnJlZigpfSBpbXBsZW1lbnRhdGlvbiBhbmQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorcGFyc2VyLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjb252ZXJ0X2NvZGVwb2ludH17Y29kZXBvaW50fQorQ29udmVydCBhIGNvZGVwb2ludCB0byBhIFxjbGFzc3tzdHJ9IHZhbHVlLiAgRW5jb2RpbmdzIGNhbiBiZSBoYW5kbGVkCitoZXJlIGlmIGFwcHJvcHJpYXRlLCB0aG91Z2ggdGhlIHJlc3Qgb2YgXG1vZHVsZXtzZ21sbGlifSBpcyBvYmxpdmlvdXMKK29uIHRoaXMgbWF0dGVyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfZW50aXR5cmVmfXtyZWZ9CiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcHJvY2VzcyBhIGdlbmVyYWwgZW50aXR5IHJlZmVyZW5jZSBvZiB0aGUKIGZvcm0gXHNhbXB7XCZcdmFye3JlZn07fSB3aGVyZSBcdmFye3JlZn0gaXMgYW4gZ2VuZXJhbCBlbnRpdHkKLXJlZmVyZW5jZS4gIEl0IGxvb2tzIGZvciBcdmFye3JlZn0gaW4gdGhlIGluc3RhbmNlIChvciBjbGFzcykKLXZhcmlhYmxlIFxtZW1iZXJ7ZW50aXR5ZGVmc30gd2hpY2ggc2hvdWxkIGJlIGEgbWFwcGluZyBmcm9tIGVudGl0eQotbmFtZXMgdG8gY29ycmVzcG9uZGluZyB0cmFuc2xhdGlvbnMuICBJZiBhIHRyYW5zbGF0aW9uIGlzIGZvdW5kLCBpdAorcmVmZXJlbmNlLiAgSXQgY29udmVydHMgXHZhcntyZWZ9IGJ5IHBhc3NpbmcgaXQgdG8KK1xtZXRob2R7Y29udmVydF9lbnRpdHlyZWYoKX0uICBJZiBhIHRyYW5zbGF0aW9uIGlzIHJldHVybmVkLCBpdAogY2FsbHMgdGhlIG1ldGhvZCBcbWV0aG9ke2hhbmRsZV9kYXRhKCl9IHdpdGggdGhlIHRyYW5zbGF0aW9uOwogb3RoZXJ3aXNlLCBpdCBjYWxscyB0aGUgbWV0aG9kIFxjb2Rle3Vua25vd25fZW50aXR5cmVmKFx2YXJ7cmVmfSl9LgogVGhlIGRlZmF1bHQgXG1lbWJlcntlbnRpdHlkZWZzfSBkZWZpbmVzIHRyYW5zbGF0aW9ucyBmb3IKIFxjb2Rle1wmYW1wO30sIFxjb2Rle1wmYXBvc30sIFxjb2Rle1wmZ3Q7fSwgXGNvZGV7XCZsdDt9LCBhbmQKIFxjb2Rle1wmcXVvdDt9LgorXHZlcnNpb25jaGFuZ2VkW1VzZSBcbWV0aG9ke2NvbnZlcnRfZW50aXR5cmVmKCl9IGluc3RlYWQgb2YgaGFyZC1jb2RpbmcKK3RoZSBjb252ZXJzaW9uXXsyLjV9CitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtjb252ZXJ0X2VudGl0eXJlZn17cmVmfQorQ29udmVydCBhIG5hbWVkIGVudGl0eSByZWZlcmVuY2UgdG8gYSBcY2xhc3N7c3RyfSB2YWx1ZSwgb3IKK1xjb2Rle05vbmV9LiAgVGhlIHJlc3VsdGluZyB2YWx1ZSB3aWxsIG5vdCBiZSBwYXJzZWQuICBcdmFye3JlZn0gd2lsbAorYmUgb25seSB0aGUgbmFtZSBvZiB0aGUgZW50aXR5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbG9va3MgZm9yCitcdmFye3JlZn0gaW4gdGhlIGluc3RhbmNlIChvciBjbGFzcykgdmFyaWFibGUgXG1lbWJlcntlbnRpdHlkZWZzfQord2hpY2ggc2hvdWxkIGJlIGEgbWFwcGluZyBmcm9tIGVudGl0eSBuYW1lcyB0byBjb3JyZXNwb25kaW5nCit0cmFuc2xhdGlvbnMuICBJZiBubyB0cmFuc2xhdGlvbiBpcyBhdmFpbGFibGUgZm9yIFx2YXJ7cmVmfSwgdGhpcworbWV0aG9kIHJldHVybnMgXGNvZGV7Tm9uZX0uICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIGRlZmF1bHQKK1xtZXRob2R7aGFuZGxlX2VudGl0eXJlZigpfSBpbXBsZW1lbnRhdGlvbiBhbmQgYnkgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorcGFyc2VyLgorXHZlcnNpb25hZGRlZHsyLjV9CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfXtoYW5kbGVfY29tbWVudH17Y29tbWVudH0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic2hlbHZlLnRleCBiL0RvYy9saWIvbGlic2hlbHZlLnRleAppbmRleCA4YmQyMDRlLi42Y2EzNTc2IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNoZWx2ZS50ZXgKKysrIGIvRG9jL2xpYi9saWJzaGVsdmUudGV4CkBAIC0xNDMsMTUgKzE0MywxNyBAQAogZGVsIGRba2V5XSAgICAgICMgZGVsZXRlIGRhdGEgc3RvcmVkIGF0IGtleSAocmFpc2VzIEtleUVycm9yCiAgICAgICAgICAgICAgICAgIyBpZiBubyBzdWNoIGtleSkKIGZsYWcgPSBkLmhhc19rZXkoa2V5KSAgICMgdHJ1ZSBpZiB0aGUga2V5IGV4aXN0cwotbGlzdCA9IGQua2V5cygpICMgYSBsaXN0IG9mIGFsbCBleGlzdGluZyBrZXlzIChzbG93ISkKK2tsaXN0ID0gZC5rZXlzKCkgIyBhIGxpc3Qgb2YgYWxsIGV4aXN0aW5nIGtleXMgKHNsb3chKQogCiAjIGFzIGQgd2FzIG9wZW5lZCBXSVRIT1VUIHdyaXRlYmFjaz1UcnVlLCBiZXdhcmU6CiBkWyd4eCddID0gcmFuZ2UoNCkgICMgdGhpcyB3b3JrcyBhcyBleHBlY3RlZCwgYnV0Li4uCiBkWyd4eCddLmFwcGVuZCg1KSAgICMgKnRoaXMgZG9lc24ndCEqIC0tIGRbJ3h4J10gaXMgU1RJTEwgcmFuZ2UoNCkhISEKKwogIyBoYXZpbmcgb3BlbmVkIGQgd2l0aG91dCB3cml0ZWJhY2s9VHJ1ZSwgeW91IG5lZWQgdG8gY29kZSBjYXJlZnVsbHk6CiB0ZW1wID0gZFsneHgnXSAgICAgICMgZXh0cmFjdHMgdGhlIGNvcHkKIHRlbXAuYXBwZW5kKDUpICAgICAgIyBtdXRhdGVzIHRoZSBjb3B5CiBkWyd4eCddID0gdGVtcCAgICAgICMgc3RvcmVzIHRoZSBjb3B5IHJpZ2h0IGJhY2ssIHRvIHBlcnNpc3QgaXQKKwogIyBvciwgZD1zaGVsdmUub3BlbihmaWxlbmFtZSx3cml0ZWJhY2s9VHJ1ZSkgd291bGQgbGV0IHlvdSBqdXN0IGNvZGUKICMgZFsneHgnXS5hcHBlbmQoNSkgYW5kIGhhdmUgaXQgd29yayBhcyBleHBlY3RlZCwgQlVUIGl0IHdvdWxkIGFsc28KICMgY29uc3VtZSBtb3JlIG1lbW9yeSBhbmQgbWFrZSB0aGUgZC5jbG9zZSgpIG9wZXJhdGlvbiBzbG93ZXIuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNpdGUudGV4IGIvRG9jL2xpYi9saWJzaXRlLnRleAppbmRleCA0M2I4ZGIyLi5jMDc5NzkwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnNpdGUudGV4CisrKyBiL0RvYy9saWIvbGlic2l0ZS50ZXgKQEAgLTE2LDEyICsxNiwxMyBAQAogSXQgc3RhcnRzIGJ5IGNvbnN0cnVjdGluZyB1cCB0byBmb3VyIGRpcmVjdG9yaWVzIGZyb20gYSBoZWFkIGFuZCBhCiB0YWlsIHBhcnQuICBGb3IgdGhlIGhlYWQgcGFydCwgaXQgdXNlcyBcY29kZXtzeXMucHJlZml4fSBhbmQKIFxjb2Rle3N5cy5leGVjX3ByZWZpeH07IGVtcHR5IGhlYWRzIGFyZSBza2lwcGVkLiAgRm9yCi10aGUgdGFpbCBwYXJ0LCBpdCB1c2VzIHRoZSBlbXB0eSBzdHJpbmcgKG9uIFdpbmRvd3MpIG9yCi1cZmlsZXtsaWIvcHl0aG9uXHNob3J0dmVyc2lvbi9zaXRlLXBhY2thZ2VzfSAob24gXFVOSVh7fSBhbmQgTWFjaW50b3NoKQotYW5kIHRoZW4gXGZpbGV7bGliL3NpdGUtcHl0aG9ufS4gIEZvciBlYWNoIG9mIHRoZSBkaXN0aW5jdAotaGVhZC10YWlsIGNvbWJpbmF0aW9ucywgaXQgc2VlcyBpZiBpdCByZWZlcnMgdG8gYW4gZXhpc3RpbmcgZGlyZWN0b3J5LAotYW5kIGlmIHNvLCBhZGRzIGl0IHRvIFxjb2Rle3N5cy5wYXRofSBhbmQgYWxzbyBpbnNwZWN0cyB0aGUgbmV3bHkgYWRkZWQgCi1wYXRoIGZvciBjb25maWd1cmF0aW9uIGZpbGVzLgordGhlIHRhaWwgcGFydCwgaXQgdXNlcyB0aGUgZW1wdHkgc3RyaW5nIGFuZCB0aGVuCitcZmlsZXtsaWIvc2l0ZS1wYWNrYWdlc30gKG9uIFdpbmRvd3MpIG9yCitcZmlsZXtsaWIvcHl0aG9uXHNob3J0dmVyc2lvbi9zaXRlLXBhY2thZ2VzfSBhbmQgdGhlbgorXGZpbGV7bGliL3NpdGUtcHl0aG9ufSAob24gXFVOSVh7fSBhbmQgTWFjaW50b3NoKS4gIEZvciBlYWNoIG9mIHRoZQorZGlzdGluY3QgaGVhZC10YWlsIGNvbWJpbmF0aW9ucywgaXQgc2VlcyBpZiBpdCByZWZlcnMgdG8gYW4gZXhpc3RpbmcKK2RpcmVjdG9yeSwgYW5kIGlmIHNvLCBhZGRzIGl0IHRvIFxjb2Rle3N5cy5wYXRofSBhbmQgYWxzbyBpbnNwZWN0cwordGhlIG5ld2x5IGFkZGVkIHBhdGggZm9yIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiBcaW5kZXhpaXtzaXRlLXB5dGhvbn17ZGlyZWN0b3J5fQogXGluZGV4aWl7c2l0ZS1wYWNrYWdlc317ZGlyZWN0b3J5fQogCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnNvY2tldC50ZXggYi9Eb2MvbGliL2xpYnNvY2tldC50ZXgKaW5kZXggODA2NjUyOC4uYWE3NWVjOSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzb2NrZXQudGV4CisrKyBiL0RvYy9saWIvbGlic29ja2V0LnRleApAQCAtNzExLDYgKzcxMSwxNyBAQAogcmVhZCB1bnRpbCBFT0YuIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzdHJpbmcgb2YgdGhlIGJ5dGVzIHJlYWQuCiBcZW5ke21ldGhvZGRlc2N9CiAKK1xiZWdpbnttZXRob2RkZXNjfXtzZXJ2ZXJ9e30KK1JldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgQVNOLjEgZGlzdGluZ3Vpc2hlZCBuYW1lIGlkZW50aWZ5aW5nIHRoZSAKK3NlcnZlcidzIGNlcnRpZmljYXRlLiAgKFNlZSBiZWxvdyBmb3IgYW4gZXhhbXBsZQorc2hvd2luZyB3aGF0IGRpc3Rpbmd1aXNoZWQgbmFtZXMgbG9vayBsaWtlLikKK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2lzc3Vlcn17fQorUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBBU04uMSBkaXN0aW5ndWlzaGVkIG5hbWUgaWRlbnRpZnlpbmcgdGhlCitpc3N1ZXIgb2YgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlLgorXGVuZHttZXRob2RkZXNjfQorCiBcc3Vic2VjdGlvbntFeGFtcGxlIFxsYWJlbHtzb2NrZXQtZXhhbXBsZX19CiAKIEhlcmUgYXJlIGZvdXIgbWluaW1hbCBleGFtcGxlIHByb2dyYW1zIHVzaW5nIHRoZSBUQ1AvSVAgcHJvdG9jb2w6XCBhCkBAIC04MzMsMyArODQ0LDQ0IEBACiBzLmNsb3NlKCkKIHByaW50ICdSZWNlaXZlZCcsIHJlcHIoZGF0YSkKIFxlbmR7dmVyYmF0aW19CisKK1RoaXMgZXhhbXBsZSBjb25uZWN0cyB0byBhbiBTU0wgc2VydmVyLCBwcmludHMgdGhlIAorc2VydmVyIGFuZCBpc3N1ZXIncyBkaXN0aW5ndWlzaGVkIG5hbWVzLCBzZW5kcyBzb21lIGJ5dGVzLAorYW5kIHJlYWRzIHBhcnQgb2YgdGhlIHJlc3BvbnNlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgc29ja2V0CisKK3MgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCitzLmNvbm5lY3QoKCd3d3cudmVyaXNpZ24uY29tJywgNDQzKSkKKworc3NsX3NvY2sgPSBzb2NrZXQuc3NsKHMpCisKK3ByaW50IHJlcHIoc3NsX3NvY2suc2VydmVyKCkpCitwcmludCByZXByKHNzbF9zb2NrLmlzc3VlcigpKQorCisjIFNldCBhIHNpbXBsZSBIVFRQIHJlcXVlc3QgLS0gdXNlIGh0dHBsaWIgaW4gYWN0dWFsIGNvZGUuCitzc2xfc29jay53cml0ZSgiIiJHRVQgLyBIVFRQLzEuMFxyCitIb3N0OiB3d3cudmVyaXNpZ24uY29tXHJcblxyXG4iIiIpCisKKyMgUmVhZCBhIGNodW5rIG9mIGRhdGEuICBXaWxsIG5vdCBuZWNlc3NhcmlseQorIyByZWFkIGFsbCB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2VydmVyLgorZGF0YSA9IHNzbF9zb2NrLnJlYWQoKQorCisjIE5vdGUgdGhhdCB5b3UgbmVlZCB0byBjbG9zZSB0aGUgdW5kZXJseWluZyBzb2NrZXQsIG5vdCB0aGUgU1NMIG9iamVjdC4KK2RlbCBzc2xfc29jaworcy5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCitBdCB0aGlzIHdyaXRpbmcsIHRoaXMgU1NMIGV4YW1wbGUgcHJpbnRzIHRoZSBmb2xsb3dpbmcgb3V0cHV0IChsaW5lCiticmVha3MgaW5zZXJ0ZWQgZm9yIHJlYWRhYmlsaXR5KToKKworXGJlZ2lue3ZlcmJhdGltfQorJy9DPVVTL1NUPUNhbGlmb3JuaWEvTD1Nb3VudGFpbiBWaWV3LworIE89VmVyaVNpZ24sIEluYy4vT1U9UHJvZHVjdGlvbiBTZXJ2aWNlcy8KKyBPVT1UZXJtcyBvZiB1c2UgYXQgd3d3LnZlcmlzaWduLmNvbS9ycGEgKGMpMDAvCisgQ049d3d3LnZlcmlzaWduLmNvbScKKycvTz1WZXJpU2lnbiBUcnVzdCBOZXR3b3JrL09VPVZlcmlTaWduLCBJbmMuLworIE9VPVZlcmlTaWduIEludGVybmF0aW9uYWwgU2VydmVyIENBIC0gQ2xhc3MgMy8KKyBPVT13d3cudmVyaXNpZ24uY29tL0NQUyBJbmNvcnAuYnkgUmVmLiBMSUFCSUxJVFkgTFRELihjKTk3IFZlcmlTaWduJworXGVuZHt2ZXJiYXRpbX0KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic29ja3N2ci50ZXggYi9Eb2MvbGliL2xpYnNvY2tzdnIudGV4CmluZGV4IGIyMWU4MDQuLmM3YjI4ZWEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic29ja3N2ci50ZXgKKysrIGIvRG9jL2xpYi9saWJzb2Nrc3ZyLnRleApAQCAtNzQsOSArNzQsOSBAQAogXGVuZHt2ZXJiYXRpbX0KIAogTm90ZSB0aGF0IFxjbGFzc3tVbml4RGF0YWdyYW1TZXJ2ZXJ9IGRlcml2ZXMgZnJvbSBcY2xhc3N7VURQU2VydmVyfSwgbm90Ci1mcm9tIFxjbGFzc3tVbml4U3RyZWFtU2VydmVyfSAtLSB0aGUgb25seSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gSVAgYW5kIGEKLVVuaXggc3RyZWFtIHNlcnZlciBpcyB0aGUgYWRkcmVzcyBmYW1pbHksIHdoaWNoIGlzIHNpbXBseSByZXBlYXRlZCBpbiBib3RoCi11bml4IHNlcnZlciBjbGFzc2VzLgorZnJvbSBcY2xhc3N7VW5peFN0cmVhbVNlcnZlcn0gLS0tIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiBhbiBJUCBhbmQgYQorXFVOSVh7fSBzdHJlYW0gc2VydmVyIGlzIHRoZSBhZGRyZXNzIGZhbWlseSwgd2hpY2ggaXMgc2ltcGx5IHJlcGVhdGVkIGluIGJvdGgKK1xVTklYe30gc2VydmVyIGNsYXNzZXMuCiAKIEZvcmtpbmcgYW5kIHRocmVhZGluZyB2ZXJzaW9ucyBvZiBlYWNoIHR5cGUgb2Ygc2VydmVyIGNhbiBiZSBjcmVhdGVkIHVzaW5nCiB0aGUgXGNsYXNze0ZvcmtpbmdNaXhJbn0gYW5kIFxjbGFzc3tUaHJlYWRpbmdNaXhJbn0gbWl4LWluIGNsYXNzZXMuICBGb3IKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXggYi9Eb2MvbGliL2xpYnNxbGl0ZTMudGV4CmluZGV4IGRiMTVjMDAuLmQ4N2UwNjQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3FsaXRlMy50ZXgKKysrIGIvRG9jL2xpYi9saWJzcWxpdGUzLnRleApAQCAtMTk1LDYgKzE5NSwxNCBAQAogICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5fQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXt9ZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3N7ZmxhZ30KK0J5IGRlZmF1bHQgeW91IHdpbGwgbm90IGdldCBhbnkgdHJhY2ViYWNrcyBpbiB1c2VyLWRlZmluZWQgZnVuY3Rpb25zLAorYWdncmVnYXRlcywgY29udmVydGVycywgYXV0aG9yaXplciBjYWxsYmFja3MgZXRjLiBJZiB5b3Ugd2FudCB0byBkZWJ1ZyB0aGVtLAoreW91IGNhbiBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBcdmFye2ZsYWd9IGFzIFRydWUuIEFmdGVyd2FyZHMsIHlvdSB3aWxsIGdldAordHJhY2ViYWNrcyBmcm9tIGNhbGxiYWNrcyBvbiBcY29kZXtzeXMuc3RkZXJyfS4gVXNlIFxjb25zdGFudHtGYWxzZX0gdG8gZGlzYWJsZQordGhlIGZlYXR1cmUgYWdhaW4uCitcZW5ke2Z1bmNkZXNjfQorCiBcc3Vic2VjdGlvbntDb25uZWN0aW9uIE9iamVjdHMgXGxhYmVse3NxbGl0ZTMtQ29ubmVjdGlvbi1PYmplY3RzfX0KIAogQSBcY2xhc3N7Q29ubmVjdGlvbn0gaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlcyBhbmQgbWV0aG9kczoKQEAgLTIzNyw4ICsyNDUsNyBAQAogY2FsbGVkIGFzIFNRTCBmdW5jdGlvbi4KIAogVGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYW55IG9mIHRoZSB0eXBlcyBzdXBwb3J0ZWQgYnkgU1FMaXRlOiB1bmljb2RlLCBzdHIsCi1pbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuICBFeGNlcHRpb25zIGluIHRoZSBmdW5jdGlvbiBhcmUgaWdub3JlZCBhbmQKLXRoZXkgYXJlIGhhbmRsZWQgYXMgaWYgdGhlIGZ1bmN0aW9uIHJldHVybmVkIE5vbmUuCitpbnQsIGxvbmcsIGZsb2F0LCBidWZmZXIgYW5kIE5vbmUuCiAKIEV4YW1wbGU6CiAKQEAgLTI1NCw3ICsyNjEsNyBAQAogd2lsbCByZXR1cm4gdGhlIGZpbmFsIHJlc3VsdCBvZiB0aGUgYWdncmVnYXRlLgogCiBUaGUgXGNvZGV7ZmluYWxpemV9IG1ldGhvZCBjYW4gcmV0dXJuIGFueSBvZiB0aGUgdHlwZXMgc3VwcG9ydGVkIGJ5IFNRTGl0ZToKLXVuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLiBBbnkgZXhjZXB0aW9ucyBhcmUgaWdub3JlZC4KK3VuaWNvZGUsIHN0ciwgaW50LCBsb25nLCBmbG9hdCwgYnVmZmVyIGFuZCBOb25lLgogCiBFeGFtcGxlOgogCkBAIC0yODMsNiArMjkwLDM0IEBACiBcZW5ke3ZlcmJhdGltfQogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY317aW50ZXJydXB0fXt9CisKK1lvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHRocmVhZCB0byBhYm9ydCBhbnkgcXVlcmllcyB0aGF0CittaWdodCBiZSBleGVjdXRpbmcgb24gdGhlIGNvbm5lY3Rpb24uIFRoZSBxdWVyeSB3aWxsIHRoZW4gYWJvcnQgYW5kIHRoZSBjYWxsZXIKK3dpbGwgZ2V0IGFuIGV4Y2VwdGlvbi4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9hdXRob3JpemVyfXthdXRob3JpemVyX2NhbGxiYWNrfQorCitUaGlzIHJvdXRpbmUgcmVnaXN0ZXJzIGEgY2FsbGJhY2suIFRoZSBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBlYWNoIGF0dGVtcHQgdG8KK2FjY2VzcyBhIGNvbHVtbiBvZiBhIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gVGhlIGNhbGxiYWNrIHNob3VsZCByZXR1cm4KK1xjb25zdGFudHtTUUxJVEVfT0t9IGlmIGFjY2VzcyBpcyBhbGxvd2VkLCBcY29uc3RhbnR7U1FMSVRFX0RFTll9IGlmIHRoZSBlbnRpcmUKK1NRTCBzdGF0ZW1lbnQgc2hvdWxkIGJlIGFib3J0ZWQgd2l0aCBhbiBlcnJvciBhbmQgXGNvbnN0YW50e1NRTElURV9JR05PUkV9IGlmCit0aGUgY29sdW1uIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgTlVMTCB2YWx1ZS4gVGhlc2UgY29uc3RhbnRzIGFyZSBhdmFpbGFibGUgaW4KK3RoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZS4KKworVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjayBzaWduaWZpZXMgd2hhdCBraW5kIG9mIG9wZXJhdGlvbiBpcyB0byBiZQorYXV0aG9yaXplZC4gVGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgd2lsbCBiZSBhcmd1bWVudHMgb3IgXGNvbnN0YW50e05vbmV9CitkZXBlbmRpbmcgb24gdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGUgNHRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBkYXRhYmFzZQorKCJtYWluIiwgInRlbXAiLCBldGMuKSBpZiBhcHBsaWNhYmxlLiBUaGUgNXRoIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZQoraW5uZXItbW9zdCB0cmlnZ2VyIG9yIHZpZXcgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGFjY2VzcyBhdHRlbXB0IG9yCitcY29uc3RhbnR7Tm9uZX0gaWYgdGhpcyBhY2Nlc3MgYXR0ZW1wdCBpcyBkaXJlY3RseSBmcm9tIGlucHV0IFNRTCBjb2RlLgorCitQbGVhc2UgY29uc3VsdCB0aGUgU1FMaXRlIGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpcnN0Cithcmd1bWVudCBhbmQgdGhlIG1lYW5pbmcgb2YgdGhlIHNlY29uZCBhbmQgdGhpcmQgYXJndW1lbnQgZGVwZW5kaW5nIG9uIHRoZQorZmlyc3Qgb25lLiBBbGwgbmVjZXNzYXJ5IGNvbnN0YW50cyBhcmUgYXZhaWxhYmxlIGluIHRoZSBcbW9kdWxle3NxbGl0ZTN9Cittb2R1bGUuCitcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfXtyb3dfZmFjdG9yeX0KICAgWW91IGNhbiBjaGFuZ2UgdGhpcyBhdHRyaWJ1dGUgdG8gYSBjYWxsYWJsZSB0aGF0IGFjY2VwdHMgdGhlIGN1cnNvciBhbmQKQEAgLTQ3NywxMCArNTEyLDEwIEBACiBcY2xhc3N7b2JqZWN0fSBhcyBvbmUgb2YgaXRzIGJhc2VzLgogXGVuZHtub3RpY2V9CiAKLVRoZSBcbW9kdWxle3NxbGl0ZTN9IG1vZHVsZSBoYXMgdHdvIGRlZmF1bHQgYWRhcHRlcnMgZm9yIFB5dGhvbidzIGJ1aWx0aW4KLVxjbGFzc3tkYXRldGltZS5kYXRlfSBhbmQgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSB0eXBlcy4gTm93IGxldCdzIHN1cHBvc2Ugd2UKLXdhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sIGJ1dAotYXMgVW5peCB0aW1lc3RhbXAuCitUaGUgXG1vZHVsZXtzcWxpdGUzfSBtb2R1bGUgaGFzIHR3byBkZWZhdWx0IGFkYXB0ZXJzIGZvciBQeXRob24ncyBidWlsdC1pbgorXGNsYXNze2RhdGV0aW1lLmRhdGV9IGFuZCBcY2xhc3N7ZGF0ZXRpbWUuZGF0ZXRpbWV9IHR5cGVzLiAgTm93IGxldCdzIHN1cHBvc2UKK3dlIHdhbnQgdG8gc3RvcmUgXGNsYXNze2RhdGV0aW1lLmRhdGV0aW1lfSBvYmplY3RzIG5vdCBpbiBJU08gcmVwcmVzZW50YXRpb24sCitidXQgYXMgYSBcVU5JWHt9IHRpbWVzdGFtcC4KIAogICAgIFx2ZXJiYXRpbWlucHV0e3NxbGl0ZTMvYWRhcHRlcl9kYXRldGltZS5weX0KIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJzdGR0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleAppbmRleCBmNDQzNjBiLi45NWIwNmY4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYnN0ZHR5cGVzLnRleApAQCAtMSw0ICsxLDQgQEAKLVxzZWN0aW9ue0J1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc319CitcY2hhcHRlcntCdWlsdC1pbiBUeXBlcyBcbGFiZWx7dHlwZXN9fQogCiBUaGUgZm9sbG93aW5nIHNlY3Rpb25zIGRlc2NyaWJlIHRoZSBzdGFuZGFyZCB0eXBlcyB0aGF0IGFyZSBidWlsdCBpbnRvCiB0aGUgaW50ZXJwcmV0ZXIuCkBAIC03LDE0ICs3LDE0IEBACiB0aGUgYnVpbHQtaW4gdHlwZXMgYXMgdGhlIGJhc2lzIGZvciBvYmplY3Qtb3JpZW50ZWQgaW5oZXJpdGFuY2UuCiBUaGlzIGxpbWl0YXRpb24gZG9lcyBub3QgZXhpc3QgYW55IGxvbmdlci59CiAKLVRoZSBwcmluY2lwYWwgYnVpbHQtaW4gdHlwZXMgYXJlIG51bWVyaWNzLCBzZXF1ZW5jZXMsIG1hcHBpbmdzLCBmaWxlcworVGhlIHByaW5jaXBhbCBidWlsdC1pbiB0eXBlcyBhcmUgbnVtZXJpY3MsIHNlcXVlbmNlcywgbWFwcGluZ3MsIGZpbGVzLAogY2xhc3NlcywgaW5zdGFuY2VzIGFuZCBleGNlcHRpb25zLgogXGluZGV4aWl7YnVpbHQtaW59e3R5cGVzfQogCiBTb21lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBzZXZlcmFsIG9iamVjdCB0eXBlczsgaW4gcGFydGljdWxhciwKIHByYWN0aWNhbGx5IGFsbCBvYmplY3RzIGNhbiBiZSBjb21wYXJlZCwgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwKLWFuZCBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgKHdpdGggdGhlIFxjb2Rle2BcdGV4dHJte1xsZG90c31gfSBub3RhdGlvbiwKLXRoZSBlcXVpdmFsZW50IFxmdW5jdGlvbntyZXByKCl9IGZ1bmN0aW9uLCBvciB0aGUgc2xpZ2h0bHkgZGlmZmVyZW50CithbmQgY29udmVydGVkIHRvIGEgc3RyaW5nICh3aXRoCit0aGUgXGZ1bmN0aW9ue3JlcHIoKX0gZnVuY3Rpb24gb3IgdGhlIHNsaWdodGx5IGRpZmZlcmVudAogXGZ1bmN0aW9ue3N0cigpfSBmdW5jdGlvbikuICBUaGUgbGF0dGVyCiBmdW5jdGlvbiBpcyBpbXBsaWNpdGx5IHVzZWQgd2hlbiBhbiBvYmplY3QgaXMgd3JpdHRlbiBieSB0aGUKIFxrZXl3b3Jke3ByaW50fVxzdGluZGV4e3ByaW50fSBzdGF0ZW1lbnQuCkBAIC0yNCw3ICsyNCw3IEBACiBcY2l0ZXRpdGxlWy4uL3R1dC90dXQuaHRtbF17UHl0aG9uIFR1dG9yaWFsfS4pCiAKIAotXHN1YnNlY3Rpb257VHJ1dGggVmFsdWUgVGVzdGluZ1xsYWJlbHt0cnV0aH19Citcc2VjdGlvbntUcnV0aCBWYWx1ZSBUZXN0aW5nXGxhYmVse3RydXRofX0KIAogQW55IG9iamVjdCBjYW4gYmUgdGVzdGVkIGZvciB0cnV0aCB2YWx1ZSwgZm9yIHVzZSBpbiBhbiBca2V5d29yZHtpZn0gb3IKIFxrZXl3b3Jke3doaWxlfSBjb25kaXRpb24gb3IgYXMgb3BlcmFuZCBvZiB0aGUgQm9vbGVhbiBvcGVyYXRpb25zIGJlbG93LgpAQCAtNzEsNyArNzEsNyBAQAogXGluZGV4e0ZhbHNlfQogXGluZGV4e1RydWV9CiAKLVxzdWJzZWN0aW9ue0Jvb2xlYW4gT3BlcmF0aW9ucyAtLS0KK1xzZWN0aW9ue0Jvb2xlYW4gT3BlcmF0aW9ucyAtLS0KIAkgICAgXGtleXdvcmR7YW5kfSwgXGtleXdvcmR7b3J9LCBca2V5d29yZHtub3R9CiAJICAgIFxsYWJlbHtib29sZWFufX0KIApAQCAtMTA3LDcgKzEwNyw3IEBACiBcZW5ke2Rlc2NyaXB0aW9ufQogCiAKLVxzdWJzZWN0aW9ue0NvbXBhcmlzb25zIFxsYWJlbHtjb21wYXJpc29uc319Citcc2VjdGlvbntDb21wYXJpc29ucyBcbGFiZWx7Y29tcGFyaXNvbnN9fQogCiBDb21wYXJpc29uIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBieSBhbGwgb2JqZWN0cy4gIFRoZXkgYWxsIGhhdmUgdGhlCiBzYW1lIHByaW9yaXR5ICh3aGljaCBpcyBoaWdoZXIgdGhhbiB0aGF0IG9mIHRoZSBCb29sZWFuIG9wZXJhdGlvbnMpLgpAQCAtMTc0LDcgKzE3NCw3IEBACiBvbmx5IGJ5IHNlcXVlbmNlIHR5cGVzIChiZWxvdykuCiAKIAotXHN1YnNlY3Rpb257TnVtZXJpYyBUeXBlcyAtLS0KK1xzZWN0aW9ue051bWVyaWMgVHlwZXMgLS0tCiAJICAgIFxjbGFzc3tpbnR9LCBcY2xhc3N7ZmxvYXR9LCBcY2xhc3N7bG9uZ30sIFxjbGFzc3tjb21wbGV4fQogCSAgICBcbGFiZWx7dHlwZXNudW1lcmljfX0KIApAQCAtMzA3LDcgKzMwNyw3IEBACiBcZW5ke2Rlc2NyaXB0aW9ufQogJSBYWFhKSCBleGNlcHRpb25zOiBvdmVyZmxvdyAod2hlbj8gd2hhdCBvcGVyYXRpb25zPykgemVyb2RpdmlzaW9uCiAKLVxzdWJzdWJzZWN0aW9ue0JpdC1zdHJpbmcgT3BlcmF0aW9ucyBvbiBJbnRlZ2VyIFR5cGVzIFxsYWJlbHtiaXRzdHJpbmctb3BzfX0KK1xzdWJzZWN0aW9ue0JpdC1zdHJpbmcgT3BlcmF0aW9ucyBvbiBJbnRlZ2VyIFR5cGVzIFxsYWJlbHtiaXRzdHJpbmctb3BzfX0KIFxub2RlbmFtZXtCaXQtc3RyaW5nIE9wZXJhdGlvbnN9CiAKIFBsYWluIGFuZCBsb25nIGludGVnZXIgdHlwZXMgc3VwcG9ydCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdGhhdCBtYWtlCkBAIC0zNTAsNyArMzUwLDcgQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIAotXHN1YnNlY3Rpb257SXRlcmF0b3IgVHlwZXMgXGxhYmVse3R5cGVpdGVyfX0KK1xzZWN0aW9ue0l0ZXJhdG9yIFR5cGVzIFxsYWJlbHt0eXBlaXRlcn19CiAKIFx2ZXJzaW9uYWRkZWR7Mi4yfQogXGluZGV4e2l0ZXJhdG9yIHByb3RvY29sfQpAQCAtNDE0LDcgKzQxNCw3IEBACiBzdXBwbHlpbmcgdGhlIFxtZXRob2R7X19pdGVyX18oKX0gYW5kIFxtZXRob2R7bmV4dCgpfSBtZXRob2RzLgogCiAKLVxzdWJzZWN0aW9ue1NlcXVlbmNlIFR5cGVzIC0tLQorXHNlY3Rpb257U2VxdWVuY2UgVHlwZXMgLS0tCiAJICAgIFxjbGFzc3tzdHJ9LCBcY2xhc3N7dW5pY29kZX0sIFxjbGFzc3tsaXN0fSwKIAkgICAgXGNsYXNze3R1cGxlfSwgXGNsYXNze2J1ZmZlcn0sIFxjbGFzc3t4cmFuZ2V9CiAJICAgIFxsYWJlbHt0eXBlc3NlcX19CkBAIC01NjYsNyArNTY2LDggQEAKIFxlbmR7ZGVzY3JpcHRpb259CiAKIAotXHN1YnN1YnNlY3Rpb257U3RyaW5nIE1ldGhvZHMgXGxhYmVse3N0cmluZy1tZXRob2RzfX0KK1xzdWJzZWN0aW9ue1N0cmluZyBNZXRob2RzIFxsYWJlbHtzdHJpbmctbWV0aG9kc319CitcaW5kZXhpaXtzdHJpbmd9e21ldGhvZHN9CiAKIFRoZXNlIGFyZSB0aGUgc3RyaW5nIG1ldGhvZHMgd2hpY2ggYm90aCA4LWJpdCBzdHJpbmdzIGFuZCBVbmljb2RlCiBvYmplY3RzIHN1cHBvcnQ6CkBAIC02MTgsOCArNjE5LDExIEBACiAKIFxiZWdpbnttZXRob2RkZXNjfVtzdHJpbmdde2VuZHN3aXRofXtzdWZmaXhcb3B0aW9uYWx7LCBzdGFydFxvcHRpb25hbHssIGVuZH19fQogUmV0dXJuIFxjb2Rle1RydWV9IGlmIHRoZSBzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgXHZhcntzdWZmaXh9LAotb3RoZXJ3aXNlIHJldHVybiBcY29kZXtGYWxzZX0uICBXaXRoIG9wdGlvbmFsIFx2YXJ7c3RhcnR9LCB0ZXN0IGJlZ2lubmluZyBhdAorb3RoZXJ3aXNlIHJldHVybiBcY29kZXtGYWxzZX0uICBcdmFye3N1ZmZpeH0gY2FuIGFsc28gYmUgYSB0dXBsZSBvZgorc3VmZml4ZXMgdG8gbG9vayBmb3IuICBXaXRoIG9wdGlvbmFsIFx2YXJ7c3RhcnR9LCB0ZXN0IGJlZ2lubmluZyBhdAogdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgXHZhcntlbmR9LCBzdG9wIGNvbXBhcmluZyBhdCB0aGF0IHBvc2l0aW9uLgorCitcdmVyc2lvbmNoYW5nZWRbQWNjZXB0IHR1cGxlcyBhcyBcdmFye3N1ZmZpeH1dezIuNX0KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W3N0cmluZ117ZXhwYW5kdGFic317XG9wdGlvbmFse3RhYnNpemV9fQpAQCAtODI5LDkgKzgzMywxMiBAQAogXGJlZ2lue21ldGhvZGRlc2N9W3N0cmluZ117c3RhcnRzd2l0aH17cHJlZml4XG9wdGlvbmFseywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0XG9wdGlvbmFseywgZW5kfX19CiBSZXR1cm4gXGNvZGV7VHJ1ZX0gaWYgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBcdmFye3ByZWZpeH0sIG90aGVyd2lzZQotcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdAorcmV0dXJuIFxjb2Rle0ZhbHNlfS4gIFx2YXJ7cHJlZml4fSBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mCitzdWZmaXhlcyB0byBsb29rIGZvci4gIFdpdGggb3B0aW9uYWwgXHZhcntzdGFydH0sIHRlc3Qgc3RyaW5nIGJlZ2lubmluZyBhdAogdGhhdCBwb3NpdGlvbi4gIFdpdGggb3B0aW9uYWwgXHZhcntlbmR9LCBzdG9wIGNvbXBhcmluZyBzdHJpbmcgYXQgdGhhdAogcG9zaXRpb24uCisKK1x2ZXJzaW9uY2hhbmdlZFtBY2NlcHQgdHVwbGVzIGFzIFx2YXJ7cHJlZml4fV17Mi41fQogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bc3RyaW5nXXtzdHJpcH17XG9wdGlvbmFse2NoYXJzfX0KQEAgLTg5NCw3ICs5MDEsNyBAQAogXGVuZHttZXRob2RkZXNjfQogCiAKLVxzdWJzdWJzZWN0aW9ue1N0cmluZyBGb3JtYXR0aW5nIE9wZXJhdGlvbnMgXGxhYmVse3R5cGVzc2VxLXN0cmluZ3N9fQorXHN1YnNlY3Rpb257U3RyaW5nIEZvcm1hdHRpbmcgT3BlcmF0aW9ucyBcbGFiZWx7dHlwZXNzZXEtc3RyaW5nc319CiAKIFxpbmRleHtmb3JtYXR0aW5nLCBzdHJpbmcgKFwle30pfQogXGluZGV4e2ludGVycG9sYXRpb24sIHN0cmluZyAoXCV7fSl9CkBAIC0xMDY1LDcgKzEwNzIsNyBAQAogXHJlZm1vZHVsZXtyZX0uXHJlZnN0bW9kaW5kZXh7cmV9CiAKIAotXHN1YnN1YnNlY3Rpb257WFJhbmdlIFR5cGUgXGxhYmVse3R5cGVzc2VxLXhyYW5nZX19Citcc3Vic2VjdGlvbntYUmFuZ2UgVHlwZSBcbGFiZWx7dHlwZXNzZXEteHJhbmdlfX0KIAogVGhlIFxjbGFzc3t4cmFuZ2V9XG9iaW5kZXh7eHJhbmdlfSB0eXBlIGlzIGFuIGltbXV0YWJsZSBzZXF1ZW5jZSB3aGljaAogaXMgY29tbW9ubHkgdXNlZCBmb3IgbG9vcGluZy4gIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIFxjbGFzc3t4cmFuZ2V9CkBAIC0xMDc3LDcgKzEwODQsNyBAQAogaXRlcmF0aW9uLCBhbmQgdGhlIFxmdW5jdGlvbntsZW4oKX0gZnVuY3Rpb24uCiAKIAotXHN1YnN1YnNlY3Rpb257TXV0YWJsZSBTZXF1ZW5jZSBUeXBlcyBcbGFiZWx7dHlwZXNzZXEtbXV0YWJsZX19Citcc3Vic2VjdGlvbntNdXRhYmxlIFNlcXVlbmNlIFR5cGVzIFxsYWJlbHt0eXBlc3NlcS1tdXRhYmxlfX0KIAogTGlzdCBvYmplY3RzIHN1cHBvcnQgYWRkaXRpb25hbCBvcGVyYXRpb25zIHRoYXQgYWxsb3cgaW4tcGxhY2UKIG1vZGlmaWNhdGlvbiBvZiB0aGUgb2JqZWN0LgpAQCAtMTA5NCw3ICsxMTAxLDggQEAKICAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9XSA9IFx2YXJ7eH19CiAJe2l0ZW0gXHZhcntpfSBvZiBcdmFye3N9IGlzIHJlcGxhY2VkIGJ5IFx2YXJ7eH19e30KICAgXGxpbmVpaWl7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gXHZhcnt0fX0KLSAgCXtzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IGlzIHJlcGxhY2VkIGJ5IFx2YXJ7dH19e30KKyAgCXtzbGljZSBvZiBcdmFye3N9IGZyb20gXHZhcntpfSB0byBcdmFye2p9IAorICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBpdGVyYWJsZSBcdmFye3R9fXt9CiAgIFxsaW5laWlpe2RlbCBcdmFye3N9W1x2YXJ7aX06XHZhcntqfV19CiAJe3NhbWUgYXMgXGNvZGV7XHZhcntzfVtcdmFye2l9Olx2YXJ7an1dID0gW119fXt9CiAgIFxsaW5laWlpe1x2YXJ7c31bXHZhcntpfTpcdmFye2p9Olx2YXJ7a31dID0gXHZhcnt0fX0KQEAgLTEyMDgsNyArMTIxNiw3IEBACiAgIHRoYXQgdGhlIGxpc3QgaGFzIGJlZW4gbXV0YXRlZCBkdXJpbmcgYSBzb3J0LgogXGVuZHtkZXNjcmlwdGlvbn0KIAotXHN1YnNlY3Rpb257U2V0IFR5cGVzIC0tLQorXHNlY3Rpb257U2V0IFR5cGVzIC0tLQogCSAgICBcY2xhc3N7c2V0fSwgXGNsYXNze2Zyb3plbnNldH0KIAkgICAgXGxhYmVse3R5cGVzLXNldH19CiBcb2JpbmRleHtzZXR9CkBAIC0xMzQ3LDcgKzEzNTUsNyBAQAogXGVuZHtzZWVhbHNvfQogICAgICAKIAotXHN1YnNlY3Rpb257TWFwcGluZyBUeXBlcyAtLS0gXGNsYXNze2RpY3R9IFxsYWJlbHt0eXBlc21hcHBpbmd9fQorXHNlY3Rpb257TWFwcGluZyBUeXBlcyAtLS0gXGNsYXNze2RpY3R9IFxsYWJlbHt0eXBlc21hcHBpbmd9fQogXG9iaW5kZXh7bWFwcGluZ30KIFxvYmluZGV4e2RpY3Rpb25hcnl9CiAKQEAgLTE1MTAsNyArMTUxOCw3IEBACiAKIFxlbmR7ZGVzY3JpcHRpb259CiAKLVxzdWJzZWN0aW9ue0ZpbGUgT2JqZWN0cworXHNlY3Rpb257RmlsZSBPYmplY3RzCiAgICAgICAgICAgICBcbGFiZWx7Ymx0aW4tZmlsZS1vYmplY3RzfX0KIAogRmlsZSBvYmplY3RzXG9iaW5kZXh7ZmlsZX0gYXJlIGltcGxlbWVudGVkIHVzaW5nIEMncyBcY29kZXtzdGRpb30KQEAgLTE3ODMsNyArMTc5MSw3IEBACiBcZW5ke21lbWJlcmRlc2N9CiAKIAotXHN1YnNlY3Rpb257Q29udGV4dCBNYW5hZ2VyIFR5cGVzIFxsYWJlbHt0eXBlY29udGV4dG1hbmFnZXJ9fQorXHNlY3Rpb257Q29udGV4dCBNYW5hZ2VyIFR5cGVzIFxsYWJlbHt0eXBlY29udGV4dG1hbmFnZXJ9fQogCiBcdmVyc2lvbmFkZGVkezIuNX0KIFxpbmRleHtjb250ZXh0IG1hbmFnZXJ9CkBAIC0xODY0LDEzICsxODcyLDEzIEBACiBpcyBuZWdsaWdpYmxlLgogCiAKLVxzdWJzZWN0aW9ue090aGVyIEJ1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc290aGVyfX0KK1xzZWN0aW9ue090aGVyIEJ1aWx0LWluIFR5cGVzIFxsYWJlbHt0eXBlc290aGVyfX0KIAogVGhlIGludGVycHJldGVyIHN1cHBvcnRzIHNldmVyYWwgb3RoZXIga2luZHMgb2Ygb2JqZWN0cy4KIE1vc3Qgb2YgdGhlc2Ugc3VwcG9ydCBvbmx5IG9uZSBvciB0d28gb3BlcmF0aW9ucy4KIAogCi1cc3Vic3Vic2VjdGlvbntNb2R1bGVzIFxsYWJlbHt0eXBlc21vZHVsZXN9fQorXHN1YnNlY3Rpb257TW9kdWxlcyBcbGFiZWx7dHlwZXNtb2R1bGVzfX0KIAogVGhlIG9ubHkgc3BlY2lhbCBvcGVyYXRpb24gb24gYSBtb2R1bGUgaXMgYXR0cmlidXRlIGFjY2VzczoKIFxjb2Rle1x2YXJ7bX0uXHZhcntuYW1lfX0sIHdoZXJlIFx2YXJ7bX0gaXMgYSBtb2R1bGUgYW5kIFx2YXJ7bmFtZX0KQEAgLTE4OTYsMTQgKzE5MDQsMTQgQEAKICcvdXNyL2xvY2FsL2xpYi9weXRob25cc2hvcnR2ZXJzaW9uL29zLnB5Yyc+fS4KIAogCi1cc3Vic3Vic2VjdGlvbntDbGFzc2VzIGFuZCBDbGFzcyBJbnN0YW5jZXMgXGxhYmVse3R5cGVzb2JqZWN0c319Citcc3Vic2VjdGlvbntDbGFzc2VzIGFuZCBDbGFzcyBJbnN0YW5jZXMgXGxhYmVse3R5cGVzb2JqZWN0c319CiBcbm9kZW5hbWV7Q2xhc3NlcyBhbmQgSW5zdGFuY2VzfQogCiBTZWUgY2hhcHRlcnMgMyBhbmQgNyBvZiB0aGUgXGNpdGV0aXRsZVsuLi9yZWYvcmVmLmh0bWxde1B5dGhvbgogUmVmZXJlbmNlIE1hbnVhbH0gZm9yIHRoZXNlLgogCiAKLVxzdWJzdWJzZWN0aW9ue0Z1bmN0aW9ucyBcbGFiZWx7dHlwZXNmdW5jdGlvbnN9fQorXHN1YnNlY3Rpb257RnVuY3Rpb25zIFxsYWJlbHt0eXBlc2Z1bmN0aW9uc319CiAKIEZ1bmN0aW9uIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgZnVuY3Rpb24gZGVmaW5pdGlvbnMuICBUaGUgb25seQogb3BlcmF0aW9uIG9uIGEgZnVuY3Rpb24gb2JqZWN0IGlzIHRvIGNhbGwgaXQ6CkBAIC0xOTE3LDcgKzE5MjUsNyBAQAogU2VlIHRoZSBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9IGZvciBtb3JlCiBpbmZvcm1hdGlvbi4KIAotXHN1YnN1YnNlY3Rpb257TWV0aG9kcyBcbGFiZWx7dHlwZXNtZXRob2RzfX0KK1xzdWJzZWN0aW9ue01ldGhvZHMgXGxhYmVse3R5cGVzbWV0aG9kc319CiBcb2JpbmRleHttZXRob2R9CiAKIE1ldGhvZHMgYXJlIGZ1bmN0aW9ucyB0aGF0IGFyZSBjYWxsZWQgdXNpbmcgdGhlIGF0dHJpYnV0ZSBub3RhdGlvbi4KQEAgLTE5NjIsNyArMTk3MCw3IEBACiBpbmZvcm1hdGlvbi4KIAogCi1cc3Vic3Vic2VjdGlvbntDb2RlIE9iamVjdHMgXGxhYmVse2JsdGluLWNvZGUtb2JqZWN0c319Citcc3Vic2VjdGlvbntDb2RlIE9iamVjdHMgXGxhYmVse2JsdGluLWNvZGUtb2JqZWN0c319CiBcb2JpbmRleHtjb2RlfQogCiBDb2RlIG9iamVjdHMgYXJlIHVzZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHRvIHJlcHJlc2VudApAQCAtMTk4NSw3ICsxOTkzLDcgQEAKIGluZm9ybWF0aW9uLgogCiAKLVxzdWJzdWJzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7Ymx0aW4tdHlwZS1vYmplY3RzfX0KK1xzdWJzZWN0aW9ue1R5cGUgT2JqZWN0cyBcbGFiZWx7Ymx0aW4tdHlwZS1vYmplY3RzfX0KIAogVHlwZSBvYmplY3RzIHJlcHJlc2VudCB0aGUgdmFyaW91cyBvYmplY3QgdHlwZXMuICBBbiBvYmplY3QncyB0eXBlIGlzCiBhY2Nlc3NlZCBieSB0aGUgYnVpbHQtaW4gZnVuY3Rpb24gXGZ1bmN0aW9ue3R5cGUoKX0uICBUaGVyZSBhcmUgbm8gc3BlY2lhbApAQCAtMTk5Nyw3ICsyMDA1LDcgQEAKIFR5cGVzIGFyZSB3cml0dGVuIGxpa2UgdGhpczogXGNvZGV7PHR5cGUgJ2ludCc+fS4KIAogCi1cc3Vic3Vic2VjdGlvbntUaGUgTnVsbCBPYmplY3QgXGxhYmVse2JsdGluLW51bGwtb2JqZWN0fX0KK1xzdWJzZWN0aW9ue1RoZSBOdWxsIE9iamVjdCBcbGFiZWx7Ymx0aW4tbnVsbC1vYmplY3R9fQogCiBUaGlzIG9iamVjdCBpcyByZXR1cm5lZCBieSBmdW5jdGlvbnMgdGhhdCBkb24ndCBleHBsaWNpdGx5IHJldHVybiBhCiB2YWx1ZS4gIEl0IHN1cHBvcnRzIG5vIHNwZWNpYWwgb3BlcmF0aW9ucy4gIFRoZXJlIGlzIGV4YWN0bHkgb25lIG51bGwKQEAgLTIwMDYsNyArMjAxNCw3IEBACiBJdCBpcyB3cml0dGVuIGFzIFxjb2Rle05vbmV9LgogCiAKLVxzdWJzdWJzZWN0aW9ue1RoZSBFbGxpcHNpcyBPYmplY3QgXGxhYmVse2JsdGluLWVsbGlwc2lzLW9iamVjdH19Citcc3Vic2VjdGlvbntUaGUgRWxsaXBzaXMgT2JqZWN0IFxsYWJlbHtibHRpbi1lbGxpcHNpcy1vYmplY3R9fQogCiBUaGlzIG9iamVjdCBpcyB1c2VkIGJ5IGV4dGVuZGVkIHNsaWNlIG5vdGF0aW9uIChzZWUgdGhlCiBcY2l0ZXRpdGxlWy4uL3JlZi9yZWYuaHRtbF17UHl0aG9uIFJlZmVyZW5jZSBNYW51YWx9KS4gIEl0IHN1cHBvcnRzIG5vCkBAIC0yMDE1LDcgKzIwMjMsNyBAQAogCiBJdCBpcyB3cml0dGVuIGFzIFxjb2Rle0VsbGlwc2lzfS4KIAotXHN1YnN1YnNlY3Rpb257Qm9vbGVhbiBWYWx1ZXN9Citcc3Vic2VjdGlvbntCb29sZWFuIFZhbHVlc30KIAogQm9vbGVhbiB2YWx1ZXMgYXJlIHRoZSB0d28gY29uc3RhbnQgb2JqZWN0cyBcY29kZXtGYWxzZX0gYW5kCiBcY29kZXtUcnVlfS4gIFRoZXkgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRydXRoIHZhbHVlcyAoYWx0aG91Z2ggb3RoZXIKQEAgLTIwMzIsMTQgKzIwNDAsMTQgQEAKIFxpbmRleGlpe0Jvb2xlYW59e3ZhbHVlc30KIAogCi1cc3Vic3Vic2VjdGlvbntJbnRlcm5hbCBPYmplY3RzIFxsYWJlbHt0eXBlc2ludGVybmFsfX0KK1xzdWJzZWN0aW9ue0ludGVybmFsIE9iamVjdHMgXGxhYmVse3R5cGVzaW50ZXJuYWx9fQogCiBTZWUgdGhlIFxjaXRldGl0bGVbLi4vcmVmL3JlZi5odG1sXXtQeXRob24gUmVmZXJlbmNlIE1hbnVhbH0gZm9yIHRoaXMKIGluZm9ybWF0aW9uLiAgSXQgZGVzY3JpYmVzIHN0YWNrIGZyYW1lIG9iamVjdHMsIHRyYWNlYmFjayBvYmplY3RzLCBhbmQKIHNsaWNlIG9iamVjdHMuCiAKIAotXHN1YnNlY3Rpb257U3BlY2lhbCBBdHRyaWJ1dGVzIFxsYWJlbHtzcGVjaWFsYXR0cnN9fQorXHNlY3Rpb257U3BlY2lhbCBBdHRyaWJ1dGVzIFxsYWJlbHtzcGVjaWFsYXR0cnN9fQogCiBUaGUgaW1wbGVtZW50YXRpb24gYWRkcyBhIGZldyBzcGVjaWFsIHJlYWQtb25seSBhdHRyaWJ1dGVzIHRvIHNldmVyYWwKIG9iamVjdCB0eXBlcywgd2hlcmUgdGhleSBhcmUgcmVsZXZhbnQuICBTb21lIG9mIHRoZXNlIGFyZSBub3QgcmVwb3J0ZWQKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3RyaW5naW8udGV4IGIvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKaW5kZXggMzk5MmU0My4uMjQzMTI1MSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKKysrIGIvRG9jL2xpYi9saWJzdHJpbmdpby50ZXgKQEAgLTM3LDYgKzM3LDI0IEBACiBGcmVlIHRoZSBtZW1vcnkgYnVmZmVyLgogXGVuZHttZXRob2RkZXNjfQogCitFeGFtcGxlIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgU3RyaW5nSU8KKworb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorb3V0cHV0LndyaXRlKCdGaXJzdCBsaW5lLlxuJykKK3ByaW50ID4+b3V0cHV0LCAnU2Vjb25kIGxpbmUuJworCisjIFJldHJpZXZlIGZpbGUgY29udGVudHMgLS0gdGhpcyB3aWxsIGJlCisjICdGaXJzdCBsaW5lLlxuU2Vjb25kIGxpbmUuXG4nCitjb250ZW50cyA9IG91dHB1dC5nZXR2YWx1ZSgpCisKKyMgQ2xvc2Ugb2JqZWN0IGFuZCBkaXNjYXJkIG1lbW9yeSBidWZmZXIgLS0gCisjIC5nZXR2YWx1ZSgpIHdpbGwgbm93IHJhaXNlIGFuIGV4Y2VwdGlvbi4KK291dHB1dC5jbG9zZSgpCitcZW5ke3ZlcmJhdGltfQorCiAKIFxzZWN0aW9ue1xtb2R1bGV7Y1N0cmluZ0lPfSAtLS0KICAgICAgICAgIEZhc3RlciB2ZXJzaW9uIG9mIFxtb2R1bGV7U3RyaW5nSU99fQpAQCAtODIsMyArMTAwLDIyIEBACiAKIFRoZXJlIGlzIGEgQyBBUEkgdG8gdGhlIG1vZHVsZSBhcyB3ZWxsOyByZWZlciB0byB0aGUgbW9kdWxlIHNvdXJjZSBmb3IgCiBtb3JlIGluZm9ybWF0aW9uLgorCitFeGFtcGxlIHVzYWdlOgorCitcYmVnaW57dmVyYmF0aW19CitpbXBvcnQgY1N0cmluZ0lPCisKK291dHB1dCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCitvdXRwdXQud3JpdGUoJ0ZpcnN0IGxpbmUuXG4nKQorcHJpbnQgPj5vdXRwdXQsICdTZWNvbmQgbGluZS4nCisKKyMgUmV0cmlldmUgZmlsZSBjb250ZW50cyAtLSB0aGlzIHdpbGwgYmUKKyMgJ0ZpcnN0IGxpbmUuXG5TZWNvbmQgbGluZS5cbicKK2NvbnRlbnRzID0gb3V0cHV0LmdldHZhbHVlKCkKKworIyBDbG9zZSBvYmplY3QgYW5kIGRpc2NhcmQgbWVtb3J5IGJ1ZmZlciAtLSAKKyMgLmdldHZhbHVlKCkgd2lsbCBub3cgcmFpc2UgYW4gZXhjZXB0aW9uLgorb3V0cHV0LmNsb3NlKCkKK1xlbmR7dmVyYmF0aW19CisKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXggYi9Eb2MvbGliL2xpYnN1YnByb2Nlc3MudGV4CmluZGV4IGJkZTkyZWIuLjAzMDcyZjcgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlic3VicHJvY2Vzcy50ZXgKKysrIGIvRG9jL2xpYi9saWJzdWJwcm9jZXNzLnRleApAQCAtMTA3LDcgKzEwNyw3IEBACiAKIElmIFx2YXJ7dW5pdmVyc2FsX25ld2xpbmVzfSBpcyBcY29uc3RhbnR7VHJ1ZX0sIHRoZSBmaWxlIG9iamVjdHMgc3Rkb3V0CiBhbmQgc3RkZXJyIGFyZSBvcGVuZWQgYXMgdGV4dCBmaWxlcywgYnV0IGxpbmVzIG1heSBiZSB0ZXJtaW5hdGVkIGJ5Ci1hbnkgb2YgXGNvZGV7J1xlIG4nfSwgdGhlIFVuaXggZW5kLW9mLWxpbmUgY29udmVudGlvbiwgXGNvZGV7J1xlIHInfSwKK2FueSBvZiBcY29kZXsnXGUgbid9LCB0aGUgXFVOSVh7fSBlbmQtb2YtbGluZSBjb252ZW50aW9uLCBcY29kZXsnXGUgcid9LAogdGhlIE1hY2ludG9zaCBjb252ZW50aW9uIG9yIFxjb2RleydcZSByXGUgbid9LCB0aGUgV2luZG93cyBjb252ZW50aW9uLgogQWxsIG9mIHRoZXNlIGV4dGVybmFsIHJlcHJlc2VudGF0aW9ucyBhcmUgc2VlbiBhcyBcY29kZXsnXGUgbid9IGJ5IHRoZQogUHl0aG9uIHByb2dyYW0uICBcbm90ZXtUaGlzIGZlYXR1cmUgaXMgb25seSBhdmFpbGFibGUgaWYgUHl0aG9uIGlzIGJ1aWx0CkBAIC0xNDAsNyArMTQwLDcgQEAKIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gSWYgdGhlIGV4aXQKIGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZSBcZXhjZXB0aW9ue0NhbGxlZFByb2Nlc3NFcnJvci59CiBUaGUgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3J9IG9iamVjdCB3aWxsIGhhdmUgdGhlIHJldHVybiBjb2RlIGluIHRoZQotXG1lbWJlcntlcnJub30gYXR0cmlidXRlLgorXG1lbWJlcntyZXR1cm5jb2RlfSBhdHRyaWJ1dGUuCiAKIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgogCkBAIC0xNjQsOSArMTY0LDggQEAKIEEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSB3aWxsIGJlIHJhaXNlZCBpZiBcY2xhc3N7UG9wZW59IGlzIGNhbGxlZAogd2l0aCBpbnZhbGlkIGFyZ3VtZW50cy4KIAotY2hlY2tfY2FsbCgpIHdpbGwgcmFpc2UgXGV4Y2VwdGlvbntDYWxsZWRQcm9jZXNzRXJyb3J9LCB3aGljaCBpcyBhCi1zdWJjbGFzcyBvZiBcZXhjZXB0aW9ue09TRXJyb3J9LCBpZiB0aGUgY2FsbGVkIHByb2Nlc3MgcmV0dXJucyBhCi1ub24temVybyByZXR1cm4gY29kZS4KK2NoZWNrX2NhbGwoKSB3aWxsIHJhaXNlIFxleGNlcHRpb257Q2FsbGVkUHJvY2Vzc0Vycm9yfSwgaWYgdGhlIGNhbGxlZAorcHJvY2VzcyByZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCiAKIAogXHN1YnN1YnNlY3Rpb257U2VjdXJpdHl9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnN5cy50ZXggYi9Eb2MvbGliL2xpYnN5cy50ZXgKaW5kZXggNmI1Yjc1NS4uNzAyNDI3YSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJzeXMudGV4CisrKyBiL0RvYy9saWIvbGlic3lzLnRleApAQCAtMjEsNyArMjEsNyBAQAogCiBcYmVnaW57ZGF0YWRlc2N9e2J5dGVvcmRlcn0KICAgQW4gaW5kaWNhdG9yIG9mIHRoZSBuYXRpdmUgYnl0ZSBvcmRlci4gIFRoaXMgd2lsbCBoYXZlIHRoZSB2YWx1ZQotICBcY29kZXsnYmlnJ30gb24gYmlnLWVuZGlhbiAobW9zdC1zaWduaWdpY2FudCBieXRlIGZpcnN0KSBwbGF0Zm9ybXMsCisgIFxjb2RleydiaWcnfSBvbiBiaWctZW5kaWFuIChtb3N0LXNpZ25pZmljYW50IGJ5dGUgZmlyc3QpIHBsYXRmb3JtcywKICAgYW5kIFxjb2RleydsaXR0bGUnfSBvbiBsaXR0bGUtZW5kaWFuIChsZWFzdC1zaWduaWZpY2FudCBieXRlIGZpcnN0KQogICBwbGF0Zm9ybXMuCiAgIFx2ZXJzaW9uYWRkZWR7Mi4wfQpAQCAtNDEsNyArNDEsNyBAQAogICBcY29kZXtJbmNsdWRlL3BhdGNobGV2ZWwuaH0gaWYgdGhlIGJyYW5jaCBpcyBhIHRhZy4gT3RoZXJ3aXNlLAogICBpdCBpcyBcY29kZXtOb25lfS4KICAgXHZlcnNpb25hZGRlZHsyLjV9Ci1cZW5ke2RhdGFkZXNjfSAgCitcZW5ke2RhdGFkZXNjfQogCiBcYmVnaW57ZGF0YWRlc2N9e2J1aWx0aW5fbW9kdWxlX25hbWVzfQogICBBIHR1cGxlIG9mIHN0cmluZ3MgZ2l2aW5nIHRoZSBuYW1lcyBvZiBhbGwgbW9kdWxlcyB0aGF0IGFyZSBjb21waWxlZApAQCAtNTUsNiArNTUsMjMgQEAKICAgaW50ZXJwcmV0ZXIuCiBcZW5ke2RhdGFkZXNjfQogCitcYmVnaW57ZnVuY2Rlc2N9e19jdXJyZW50X2ZyYW1lc317fQorICBSZXR1cm4gYSBkaWN0aW9uYXJ5IG1hcHBpbmcgZWFjaCB0aHJlYWQncyBpZGVudGlmaWVyIHRvIHRoZSB0b3Btb3N0IHN0YWNrCisgIGZyYW1lIGN1cnJlbnRseSBhY3RpdmUgaW4gdGhhdCB0aHJlYWQgYXQgdGhlIHRpbWUgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZC4KKyAgTm90ZSB0aGF0IGZ1bmN0aW9ucyBpbiB0aGUgXHJlZm1vZHVsZXt0cmFjZWJhY2t9IG1vZHVsZSBjYW4gYnVpbGQgdGhlCisgIGNhbGwgc3RhY2sgZ2l2ZW4gc3VjaCBhIGZyYW1lLgorCisgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBkZWFkbG9jazogIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QKKyAgcmVxdWlyZSB0aGUgZGVhZGxvY2tlZCB0aHJlYWRzJyBjb29wZXJhdGlvbiwgYW5kIHN1Y2ggdGhyZWFkcycgY2FsbCBzdGFja3MKKyAgYXJlIGZyb3plbiBmb3IgYXMgbG9uZyBhcyB0aGV5IHJlbWFpbiBkZWFkbG9ja2VkLiAgVGhlIGZyYW1lIHJldHVybmVkCisgIGZvciBhIG5vbi1kZWFkbG9ja2VkIHRocmVhZCBtYXkgYmVhciBubyByZWxhdGlvbnNoaXAgdG8gdGhhdCB0aHJlYWQncworICBjdXJyZW50IGFjdGl2aXR5IGJ5IHRoZSB0aW1lIGNhbGxpbmcgY29kZSBleGFtaW5lcyB0aGUgZnJhbWUuCisKKyAgVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgdXNlZCBmb3IgaW50ZXJuYWwgYW5kIHNwZWNpYWxpemVkIHB1cnBvc2VzCisgIG9ubHkuCisgIFx2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKwogXGJlZ2lue2RhdGFkZXNjfXtkbGxoYW5kbGV9CiAgIEludGVnZXIgc3BlY2lmeWluZyB0aGUgaGFuZGxlIG9mIHRoZSBQeXRob24gRExMLgogICBBdmFpbGFiaWxpdHk6IFdpbmRvd3MuCkBAIC0xNDIsNyArMTU5LDcgQEAKICAgZnVuY3Rpb24sIFxmdW5jdGlvbntleGNfaW5mbygpfSB3aWxsIHJldHVybiB0aHJlZSBcY29kZXtOb25lfSB2YWx1ZXMgdW50aWwKICAgYW5vdGhlciBleGNlcHRpb24gaXMgcmFpc2VkIGluIHRoZSBjdXJyZW50IHRocmVhZCBvciB0aGUgZXhlY3V0aW9uIHN0YWNrCiAgIHJldHVybnMgdG8gYSBmcmFtZSB3aGVyZSBhbm90aGVyIGV4Y2VwdGlvbiBpcyBiZWluZyBoYW5kbGVkLgotICAKKwogICBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIGluIG9ubHkgYSBmZXcgb2JzY3VyZSBzaXR1YXRpb25zLiAgVGhlc2UKICAgaW5jbHVkZSBsb2dnaW5nIGFuZCBlcnJvciBoYW5kbGluZyBzeXN0ZW1zIHRoYXQgcmVwb3J0IGluZm9ybWF0aW9uIG9uIHRoZQogICBsYXN0IG9yIGN1cnJlbnQgZXhjZXB0aW9uLiAgVGhpcyBmdW5jdGlvbiBjYW4gYWxzbyBiZSB1c2VkIHRvIHRyeSB0byBmcmVlCkBAIC0yNDEsMTQgKzI1OCwxNCBAQAogXGJlZ2lue2l0ZW1pemV9CiBcaXRlbSBPbiBXaW5kb3dzIDl4LCB0aGUgZW5jb2RpbmcgaXMgYGBtYmNzJycuCiBcaXRlbSBPbiBNYWMgT1MgWCwgdGhlIGVuY29kaW5nIGlzIGBgdXRmLTgnJy4KLVxpdGVtIE9uIFVuaXgsIHRoZSBlbmNvZGluZyBpcyB0aGUgdXNlcidzIHByZWZlcmVuY2UgCi0gICAgICBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBubF9sYW5naW5mbyhDT0RFU0VUKSwgb3IgTm9uZSBpZgotICAgICAgdGhlIG5sX2xhbmdpbmZvKENPREVTRVQpIGZhaWxlZC4KK1xpdGVtIE9uIFxVTklYLCB0aGUgZW5jb2RpbmcgaXMgdGhlIHVzZXIncyBwcmVmZXJlbmNlCisgICAgICBhY2NvcmRpbmcgdG8gdGhlIHJlc3VsdCBvZiBubF9sYW5naW5mbyhDT0RFU0VUKSwgb3IgXGNvbnN0YW50e05vbmV9CisgICAgICBpZiB0aGUgXGNvZGV7bmxfbGFuZ2luZm8oQ09ERVNFVCl9IGZhaWxlZC4KIFxpdGVtIE9uIFdpbmRvd3MgTlQrLCBmaWxlIG5hbWVzIGFyZSBVbmljb2RlIG5hdGl2ZWx5LCBzbyBubyBjb252ZXJzaW9uCi0gICAgICBpcyBwZXJmb3JtZWQuIFxjb2Rle2dldGZpbGVzeXN0ZW1lbmNvZGluZ30gc3RpbGwgcmV0dXJucyBgYG1iY3MnJywKLSAgICAgIGFzIHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCB1c2Ugd2hlbiB0aGV5Ci0gICAgICBleHBsaWNpdGx5IHdhbnQgdG8gY29udmVydCBVbmljb2RlIHN0cmluZ3MgdG8gYnl0ZSBzdHJpbmdzIHRoYXQKLSAgICAgIGFyZSBlcXVpdmFsZW50IHdoZW4gdXNlZCBhcyBmaWxlIG5hbWVzLgorICAgICAgaXMgcGVyZm9ybWVkLiBcZnVuY3Rpb257Z2V0ZmlsZXN5c3RlbWVuY29kaW5nKCl9IHN0aWxsIHJldHVybnMKKyAgICAgIFxjb2RleydtYmNzJ30sIGFzIHRoaXMgaXMgdGhlIGVuY29kaW5nIHRoYXQgYXBwbGljYXRpb25zIHNob3VsZCB1c2UKKyAgICAgIHdoZW4gdGhleSBleHBsaWNpdGx5IHdhbnQgdG8gY29udmVydCBVbmljb2RlIHN0cmluZ3MgdG8gYnl0ZSBzdHJpbmdzCisgICAgICB0aGF0IGFyZSBlcXVpdmFsZW50IHdoZW4gdXNlZCBhcyBmaWxlIG5hbWVzLgogXGVuZHtpdGVtaXplfQogICBcdmVyc2lvbmFkZGVkezIuM30KIFxlbmR7ZnVuY2Rlc2N9CkBAIC0yNzksOCArMjk2LDggQEAKIFxlbmR7ZnVuY2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317Z2V0d2luZG93c3ZlcnNpb259e30KLSAgUmV0dXJuIGEgdHVwbGUgY29udGFpbmluZyBmaXZlIGNvbXBvbmVudHMsIGRlc2NyaWJpbmcgdGhlIFdpbmRvd3MgCi0gIHZlcnNpb24gY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgZWxlbWVudHMgYXJlIFx2YXJ7bWFqb3J9LCBcdmFye21pbm9yfSwgCisgIFJldHVybiBhIHR1cGxlIGNvbnRhaW5pbmcgZml2ZSBjb21wb25lbnRzLCBkZXNjcmliaW5nIHRoZSBXaW5kb3dzCisgIHZlcnNpb24gY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgZWxlbWVudHMgYXJlIFx2YXJ7bWFqb3J9LCBcdmFye21pbm9yfSwKICAgXHZhcntidWlsZH0sIFx2YXJ7cGxhdGZvcm19LCBhbmQgXHZhcnt0ZXh0fS4gIFx2YXJ7dGV4dH0gY29udGFpbnMKICAgYSBzdHJpbmcgd2hpbGUgYWxsIG90aGVyIHZhbHVlcyBhcmUgaW50ZWdlcnMuCiAKQEAgLTQ5MSw3ICs1MDgsNyBAQAogICBiZSByZWdpc3RlcmVkIHVzaW5nIFxmdW5jdGlvbntzZXR0cmFjZSgpfSBmb3IgZWFjaCB0aHJlYWQgYmVpbmcKICAgZGVidWdnZWQuICBcbm90ZXtUaGUgXGZ1bmN0aW9ue3NldHRyYWNlKCl9IGZ1bmN0aW9uIGlzIGludGVuZGVkIG9ubHkKICAgZm9yIGltcGxlbWVudGluZyBkZWJ1Z2dlcnMsIHByb2ZpbGVycywgY292ZXJhZ2UgdG9vbHMgYW5kIHRoZSBsaWtlLgotICBJdHMgYmVoYXZpb3IgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0sIHJhdGhlciB0aGFuIAorICBJdHMgYmVoYXZpb3IgaXMgcGFydCBvZiB0aGUgaW1wbGVtZW50YXRpb24gcGxhdGZvcm0sIHJhdGhlciB0aGFuCiAgIHBhcnQgb2YgdGhlIGxhbmd1YWdlIGRlZmluaXRpb24sIGFuZCB0aHVzIG1heSBub3QgYmUgYXZhaWxhYmxlIGluCiAgIGFsbCBQeXRob24gaW1wbGVtZW50YXRpb25zLn0KIFxlbmR7ZnVuY2Rlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnRleHR3cmFwLnRleCBiL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CmluZGV4IDlmYjA4MTYuLjM4ZjliMDMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CisrKyBiL0RvYy9saWIvbGlidGV4dHdyYXAudGV4CkBAIC00NywxMiArNDcsMTcgQEAKIGxlZnQgb2YgdGhlIHRleHQuCiAKIFxiZWdpbntmdW5jZGVzY317ZGVkZW50fXt0ZXh0fSAKLVJlbW92ZSBhbnkgd2hpdGVzcGFjZSB0aGF0IGNhbiBiZSB1bmlmb3JtbHkgcmVtb3ZlZCBmcm9tIHRoZSBsZWZ0Ci1vZiBldmVyeSBsaW5lIGluIFx2YXJ7dGV4dH0uCitSZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIFx2YXJ7dGV4dH0uCiAKLVRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbWFrZSB0cmlwbGUtcXVvdGVkIHN0cmluZ3MgbGluZSB1cCB3aXRoCi10aGUgbGVmdCBlZGdlIG9mIHNjcmVlbi93aGF0ZXZlciwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyBpdCBpbiB0aGUKLXNvdXJjZSBjb2RlIGluIGluZGVudGVkIGZvcm0uIAorVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBsaW5lIHVwIHdpdGggdGhlIGxlZnQKK2VkZ2Ugb2YgdGhlIGRpc3BsYXksIHdoaWxlIHN0aWxsIHByZXNlbnRpbmcgdGhlbSBpbiB0aGUgc291cmNlIGNvZGUKK2luIGluZGVudGVkIGZvcm0uCisKK05vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleSBhcmUKK25vdCBlcXVhbDogdGhlIGxpbmVzIFxjb2RleyIge30gaGVsbG8ifSBhbmQgXGNvZGV7Ilx0ZXh0YmFja3NsYXNoe310aGVsbG8ifQorYXJlIGNvbnNpZGVyZWQgdG8gaGF2ZSBubyBjb21tb24gbGVhZGluZyB3aGl0ZXNwYWNlLiAgKFRoaXMgYmVoYXZpb3VyIGlzCituZXcgaW4gUHl0aG9uIDIuNTsgb2xkZXIgdmVyc2lvbnMgb2YgdGhpcyBtb2R1bGUgaW5jb3JyZWN0bHkgZXhwYW5kZWQKK3RhYnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS4pCiAKIEZvciBleGFtcGxlOgogXGJlZ2lue3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aHJlYWQudGV4IGIvRG9jL2xpYi9saWJ0aHJlYWQudGV4CmluZGV4IDk1NzNhYjMuLmQwMDdlZWMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGhyZWFkLnRleAorKysgYi9Eb2MvbGliL2xpYnRocmVhZC50ZXgKQEAgLTc0LDYgKzc0LDI2IEBACiBhbm90aGVyIHRocmVhZCBpcyBjcmVhdGVkLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzdGFja19zaXplfXtcb3B0aW9uYWx7c2l6ZX19CitSZXR1cm4gdGhlIHRocmVhZCBzdGFjayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGhyZWFkcy4gIFRoZQorb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHN0YWNrIHNpemUgdG8gYmUgdXNlZCBmb3IKK3N1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvcgorY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmtCKS4KK0lmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBcZXhjZXB0aW9ue1RocmVhZEVycm9yfQoraXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzdGFjayBzaXplIGlzIGludmFsaWQsIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQoraXMgcmFpc2VkIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrQiBpcyBjdXJyZW50bHkgdGhlIG1pbmltdW0KK3N1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZSBzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUKK2ludGVycHJldGVyIGl0c2VsZi4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBtYXkgaGF2ZSBwYXJ0aWN1bGFyCityZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvciB0aGUgc3RhY2sgc2l6ZSwgc3VjaCBhcyByZXF1aXJpbmcgYSBtaW5pbXVtCitzdGFjayBzaXplID4gMzJrQiBvciByZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbQorbWVtb3J5IHBhZ2Ugc2l6ZSAtIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvcgorbW9yZSBpbmZvcm1hdGlvbiAoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvcgordGhlIHN0YWNrIHNpemUgaXMgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlCitzcGVjaWZpYyBpbmZvcm1hdGlvbikuCitBdmFpbGFiaWxpdHk6IFdpbmRvd3MsIHN5c3RlbXMgd2l0aCBcUE9TSVh7fSB0aHJlYWRzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiAKIExvY2sgb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4IGIvRG9jL2xpYi9saWJ0aHJlYWRpbmcudGV4CmluZGV4IDhmYjMxMzcuLjAzMzQ3NTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGhyZWFkaW5nLnRleAorKysgYi9Eb2MvbGliL2xpYnRocmVhZGluZy50ZXgKQEAgLTEyNSw2ICsxMjUsMjYgQEAKIFx2ZXJzaW9uYWRkZWR7Mi4zfQogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzdGFja19zaXplfXtcb3B0aW9uYWx7c2l6ZX19CitSZXR1cm4gdGhlIHRocmVhZCBzdGFjayBzaXplIHVzZWQgd2hlbiBjcmVhdGluZyBuZXcgdGhyZWFkcy4gIFRoZQorb3B0aW9uYWwgXHZhcntzaXplfSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIHN0YWNrIHNpemUgdG8gYmUgdXNlZCBmb3IKK3N1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvcgorY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmtCKS4KK0lmIGNoYW5naW5nIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSBpcyB1bnN1cHBvcnRlZCwgYSBcZXhjZXB0aW9ue1RocmVhZEVycm9yfQoraXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzdGFjayBzaXplIGlzIGludmFsaWQsIGEgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfQoraXMgcmFpc2VkIGFuZCB0aGUgc3RhY2sgc2l6ZSBpcyB1bm1vZGlmaWVkLiAgMzJrQiBpcyBjdXJyZW50bHkgdGhlIG1pbmltdW0KK3N1cHBvcnRlZCBzdGFjayBzaXplIHZhbHVlIHRvIGd1YXJhbnRlZSBzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUKK2ludGVycHJldGVyIGl0c2VsZi4gIE5vdGUgdGhhdCBzb21lIHBsYXRmb3JtcyBtYXkgaGF2ZSBwYXJ0aWN1bGFyCityZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvciB0aGUgc3RhY2sgc2l6ZSwgc3VjaCBhcyByZXF1aXJpbmcgYSBtaW5pbXVtCitzdGFjayBzaXplID4gMzJrQiBvciByZXF1aXJpbmcgYWxsb2NhdGlvbiBpbiBtdWx0aXBsZXMgb2YgdGhlIHN5c3RlbQorbWVtb3J5IHBhZ2Ugc2l6ZSAtIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIHJlZmVycmVkIHRvIGZvcgorbW9yZSBpbmZvcm1hdGlvbiAoNGtCIHBhZ2VzIGFyZSBjb21tb247IHVzaW5nIG11bHRpcGxlcyBvZiA0MDk2IGZvcgordGhlIHN0YWNrIHNpemUgaXMgdGhlIHN1Z2dlc3RlZCBhcHByb2FjaCBpbiB0aGUgYWJzZW5jZSBvZiBtb3JlCitzcGVjaWZpYyBpbmZvcm1hdGlvbikuCitBdmFpbGFiaWxpdHk6IFdpbmRvd3MsIHN5c3RlbXMgd2l0aCBcUE9TSVh7fSB0aHJlYWRzLgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiBEZXRhaWxlZCBpbnRlcmZhY2VzIGZvciB0aGUgb2JqZWN0cyBhcmUgZG9jdW1lbnRlZCBiZWxvdy4gIAogCiBUaGUgZGVzaWduIG9mIHRoaXMgbW9kdWxlIGlzIGxvb3NlbHkgYmFzZWQgb24gSmF2YSdzIHRocmVhZGluZyBtb2RlbC4KZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidGltZS50ZXggYi9Eb2MvbGliL2xpYnRpbWUudGV4CmluZGV4IGIzOWI2NTAuLmY0MDgzOGEgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidGltZS50ZXgKKysrIGIvRG9jL2xpYi9saWJ0aW1lLnRleApAQCAtMjI2LDYgKzIyNiw4IEBACiBcdmVyc2lvbmNoYW5nZWRbQWxsb3dlZCBcdmFye3R9IHRvIGJlIG9taXR0ZWRdezIuMX0KIFx2ZXJzaW9uY2hhbmdlZFtcZXhjZXB0aW9ue1ZhbHVlRXJyb3J9IHJhaXNlZCBpZiBhIGZpZWxkIGluIFx2YXJ7dH0gaXMKIG91dCBvZiByYW5nZV17Mi40fQorXHZlcnNpb25jaGFuZ2VkWzAgaXMgbm93IGEgbGVnYWwgYXJndW1lbnQgZm9yIGFueSBwb3NpdGlvbiBpbiB0aGUgdGltZSB0dXBsZTsKK2lmIGl0IGlzIG5vcm1hbGx5IGlsbGVnYWwgdGhlIHZhbHVlIGlzIGZvcmNlZCB0byBhIGNvcnJlY3Qgb25lLl17Mi41fQogCiAKIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBjYW4gYmUgZW1iZWRkZWQgaW4gdGhlIFx2YXJ7Zm9ybWF0fSBzdHJpbmcuCkBAIC00MjUsNyArNDI3LDcgQEAKICcxNjowODoxMiAwNS8wOC8wMyBBRVNUJwogXGVuZHt2ZXJiYXRpbX0KIAotT24gbWFueSBVbml4IHN5c3RlbXMgKGluY2x1ZGluZyAqQlNELCBMaW51eCwgU29sYXJpcywgYW5kIERhcndpbiksIGl0CitPbiBtYW55IFxVTklYe30gc3lzdGVtcyAoaW5jbHVkaW5nICpCU0QsIExpbnV4LCBTb2xhcmlzLCBhbmQgRGFyd2luKSwgaXQKIGlzIG1vcmUgY29udmVuaWVudCB0byB1c2UgdGhlIHN5c3RlbSdzIHpvbmVpbmZvIChcbWFucGFnZXt0emZpbGV9ezV9KSAKIGRhdGFiYXNlIHRvIHNwZWNpZnkgdGhlIHRpbWV6b25lIHJ1bGVzLiBUbyBkbyB0aGlzLCBzZXQgdGhlIAogXGVudnZhcntUWn0gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIHBhdGggb2YgdGhlIHJlcXVpcmVkIHRpbWV6b25lIApkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0dXJ0bGUudGV4IGIvRG9jL2xpYi9saWJ0dXJ0bGUudGV4CmluZGV4IDYzOGJjMDcuLjYxNjFjZDkgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidHVydGxlLnRleAorKysgYi9Eb2MvbGliL2xpYnR1cnRsZS50ZXgKQEAgLTI3LDYgKzI3LDQ1IEBACiBTZXQgYW5nbGUgbWVhc3VyZW1lbnQgdW5pdHMgdG8gcmFkaWFucy4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317c2V0dXB9eyoqa3dhcmdzfQorU2V0cyB0aGUgc2l6ZSBhbmQgcG9zaXRpb24gb2YgdGhlIG1haW4gd2luZG93LiAgS2V5d29yZHMgYXJlOgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIFxjb2Rle3dpZHRofTogZWl0aGVyIGEgc2l6ZSBpbiBwaXhlbHMgb3IgYSBmcmFjdGlvbiBvZiB0aGUgc2NyZWVuLgorICAgVGhlIGRlZmF1bHQgaXMgNTBcJSBvZiB0aGUgc2NyZWVuLgorICBcaXRlbSBcY29kZXtoZWlnaHR9OiBlaXRoZXIgYSBzaXplIGluIHBpeGVscyBvciBhIGZyYWN0aW9uIG9mIHRoZSBzY3JlZW4uCisgICBUaGUgZGVmYXVsdCBpcyA1MFwlIG9mIHRoZSBzY3JlZW4uCisgIFxpdGVtIFxjb2Rle3N0YXJ0eH06IHN0YXJ0aW5nIHBvc2l0aW9uIGluIHBpeGVscyBmcm9tIHRoZSBsZWZ0IGVkZ2UKKyAgICAgIG9mIHRoZSBzY3JlZW4uIFxjb2Rle05vbmV9IGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCAKKyAgICAgIGNlbnRlcnMgdGhlIHdpbmRvdyBob3Jpem9udGFsbHkgb24gc2NyZWVuLgorICBcaXRlbSBcY29kZXtzdGFydHl9OiBzdGFydGluZyBwb3NpdGlvbiBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIGVkZ2UKKyAgICAgIG9mIHRoZSBzY3JlZW4uIFxjb2Rle05vbmV9IGlzIHRoZSBkZWZhdWx0IHZhbHVlIGFuZCAKKyAgICAgIGNlbnRlcnMgdGhlIHdpbmRvdyB2ZXJ0aWNhbGx5IG9uIHNjcmVlbi4KK1xlbmR7aXRlbWl6ZX0KKworICAgRXhhbXBsZXM6CisKK1xiZWdpbnt2ZXJiYXRpbX0KKyMgVXNlcyBkZWZhdWx0IGdlb21ldHJ5OiA1MCUgeCA1MCUgb2Ygc2NyZWVuLCBjZW50ZXJlZC4KK3NldHVwKCkgIAorCisjIFNldHMgd2luZG93IHRvIDIwMHgyMDAgcGl4ZWxzLCBpbiB1cHBlciBsZWZ0IG9mIHNjcmVlbgorc2V0dXAgKHdpZHRoPTIwMCwgaGVpZ2h0PTIwMCwgc3RhcnR4PTAsIHN0YXJ0eT0wKQorCisjIFNldHMgd2luZG93IHRvIDc1JSBvZiBzY3JlZW4gYnkgNTAlIG9mIHNjcmVlbiwgYW5kIGNlbnRlcnMgaXQuCitzZXR1cCh3aWR0aD0uNzUsIGhlaWdodD0wLjUsIHN0YXJ0eD1Ob25lLCBzdGFydHk9Tm9uZSkKK1xlbmR7dmVyYmF0aW19CisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317dGl0bGV9e3RpdGxlX3N0cn0KK1NldCB0aGUgd2luZG93J3MgdGl0bGUgdG8gXHZhcnt0aXRsZX0uCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e2RvbmV9e30KK0VudGVycyB0aGUgVGsgbWFpbiBsb29wLiAgVGhlIHdpbmRvdyB3aWxsIGNvbnRpbnVlIHRvIAorYmUgZGlzcGxheWVkIHVudGlsIHRoZSB1c2VyIGNsb3NlcyBpdCBvciB0aGUgcHJvY2VzcyBpcyBraWxsZWQuCitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e3Jlc2V0fXt9CiBDbGVhciB0aGUgc2NyZWVuLCByZS1jZW50ZXIgdGhlIHBlbiwgYW5kIHNldCB2YXJpYWJsZXMgdG8gdGhlIGRlZmF1bHQKIHZhbHVlcy4KQEAgLTQyLDYgKzgxLDE5IEBACiBsaW5lLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtzcGVlZH17c3BlZWR9CitTZXQgdGhlIHNwZWVkIG9mIHRoZSB0dXJ0bGUuIFZhbGlkIHZhbHVlcyBmb3IgdGhlIHBhcmFtZXRlcgorXHZhcntzcGVlZH0gYXJlIFxjb2RleydmYXN0ZXN0J30gKG5vIGRlbGF5KSwgXGNvZGV7J2Zhc3QnfSwKKyhkZWxheSA1bXMpLCBcY29kZXsnbm9ybWFsJ30gKGRlbGF5IDEwbXMpLCBcY29kZXsnc2xvdyd9CisoZGVsYXkgMTVtcyksIGFuZCBcY29kZXsnc2xvd2VzdCd9IChkZWxheSAyMG1zKS4KK1x2ZXJzaW9uYWRkZWR7Mi41fQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXtkZWxheX17ZGVsYXl9CitTZXQgdGhlIHNwZWVkIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcntkZWxheX0sIHdoaWNoIGlzIGdpdmVuCitpbiBtcy4gXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2Z1bmNkZXNjfQorCiBcYmVnaW57ZnVuY2Rlc2N9e2ZvcndhcmR9e2Rpc3RhbmNlfQogR28gZm9yd2FyZCBcdmFye2Rpc3RhbmNlfSBzdGVwcy4KIFxlbmR7ZnVuY2Rlc2N9CkBAIC05NCw2ICsxNDYsMTggQEAKIGFuZCBjYWxsIFxjb2Rle2ZpbGwoMCl9IHdoZW4geW91IGZpbmlzaCB0byBkcmF3IHRoZSBwYXRoLgogXGVuZHtmdW5jZGVzY30KIAorXGJlZ2lue2Z1bmNkZXNjfXtiZWdpblxfZmlsbH17fQorU3dpdGNoIHR1cnRsZSBpbnRvIGZpbGxpbmcgbW9kZTsgCitNdXN0IGV2ZW50dWFsbHkgYmUgZm9sbG93ZWQgYnkgYSBjb3JyZXNwb25kaW5nIGVuZF9maWxsKCkgY2FsbC4KK090aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317ZW5kXF9maWxsfXt9CitFbmQgZmlsbGluZyBtb2RlLCBhbmQgZmlsbCB0aGUgc2hhcGU7IGVxdWl2YWxlbnQgdG8gXGNvZGV7ZmlsbCgwKX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKIFxiZWdpbntmdW5jZGVzY317Y2lyY2xlfXtyYWRpdXNcb3B0aW9uYWx7LCBleHRlbnR9fQogRHJhdyBhIGNpcmNsZSB3aXRoIHJhZGl1cyBcdmFye3JhZGl1c30gd2hvc2UgY2VudGVyLXBvaW50IGlzCiBcdmFye3JhZGl1c30gdW5pdHMgbGVmdCBvZiB0aGUgdHVydGxlLgpAQCAtMTEzLDYgKzE3Nyw0OSBAQAogc3BlY2lmaWVkIGVpdGhlciBhcyB0d28gc2VwYXJhdGUgYXJndW1lbnRzIG9yIGFzIGEgMi10dXBsZS4KIFxlbmR7ZnVuY2Rlc2N9CiAKK1xiZWdpbntmdW5jZGVzY317dG93YXJkc317eCwgeX0KK1JldHVybiB0aGUgYW5nbGUgb2YgdGhlIGxpbmUgZnJvbSB0aGUgdHVydGxlJ3MgcG9zaXRpb24KK3RvIHRoZSBwb2ludCBcdmFye3h9LCBcdmFye3l9LiBUaGUgY28tb3JkaW5hdGVzIG1heSBiZQorc3BlY2lmaWVkIGVpdGhlciBhcyB0d28gc2VwYXJhdGUgYXJndW1lbnRzLCBhcyBhIDItdHVwbGUsCitvciBhcyBhbm90aGVyIHBlbiBvYmplY3QuCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317aGVhZGluZ317fQorUmV0dXJuIHRoZSBjdXJyZW50IG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUuCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0aGVhZGluZ317YW5nbGV9CitTZXQgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcnthbmdsZX0uCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317cG9zaXRpb259e30KK1JldHVybiB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgdHVydGxlIGFzIGFuIFxjb2Rleyh4LHkpfSBwYWlyLgorXHZlcnNpb25hZGRlZHsyLjN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3NldHh9e3h9CitTZXQgdGhlIHggY29vcmRpbmF0ZSBvZiB0aGUgdHVydGxlIHRvIFx2YXJ7eH0uCitcdmVyc2lvbmFkZGVkezIuM30KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0eX17eX0KK1NldCB0aGUgeSBjb29yZGluYXRlIG9mIHRoZSB0dXJ0bGUgdG8gXHZhcnt5fS4KK1x2ZXJzaW9uYWRkZWR7Mi4zfQorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXt3aW5kb3dcX3dpZHRofXt9CitSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBjYW52YXMgd2luZG93LgorXHZlcnNpb25hZGRlZHsyLjN9CitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3dpbmRvd1xfaGVpZ2h0fXt9CitSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgY2FudmFzIHdpbmRvdy4KK1x2ZXJzaW9uYWRkZWR7Mi4zfQorXGVuZHtmdW5jZGVzY30KKwogVGhpcyBtb2R1bGUgYWxzbyBkb2VzIFxjb2Rle2Zyb20gbWF0aCBpbXBvcnQgKn0sIHNvIHNlZSB0aGUKIGRvY3VtZW50YXRpb24gZm9yIHRoZSBccmVmbW9kdWxle21hdGh9IG1vZHVsZSBmb3IgYWRkaXRpb25hbCBjb25zdGFudHMKIGFuZCBmdW5jdGlvbnMgdXNlZnVsIGZvciB0dXJ0bGUgZ3JhcGhpY3MuCkBAIC0xMzQsMTkgKzI0MSwyNSBAQAogcGVuLiBUaGUgY29uc3RydWN0b3IgYXV0b21hdGljYWxseSBjcmVhdGVzIGEgY2FudmFzIGRvIGJlIGRyYXduIG9uLgogXGVuZHtjbGFzc2Rlc2N9CiAKK1xiZWdpbntjbGFzc2Rlc2N9e1R1cnRsZX17fQorRGVmaW5lIGEgcGVuLiBUaGlzIGlzIGVzc2VudGlhbGx5IGEgc3lub255bSBmb3IgXGNvZGV7UGVuKCl9OworXGNsYXNze1R1cnRsZX0gaXMgYW4gZW1wdHkgc3ViY2xhc3Mgb2YgXGNsYXNze1Blbn0uCitcZW5ke2NsYXNzZGVzY30KKwogXGJlZ2lue2NsYXNzZGVzY317UmF3UGVufXtjYW52YXN9CiBEZWZpbmUgYSBwZW4gd2hpY2ggZHJhd3Mgb24gYSBjYW52YXMgXHZhcntjYW52YXN9LiBUaGlzIGlzIHVzZWZ1bCBpZiAKIHlvdSB3YW50IHRvIHVzZSB0aGUgbW9kdWxlIHRvIGNyZWF0ZSBncmFwaGljcyBpbiBhIGBgcmVhbCcnIHByb2dyYW0uCiBcZW5ke2NsYXNzZGVzY30KIAotXHN1YnNlY3Rpb257UGVuIGFuZCBSYXdQZW4gT2JqZWN0cyBcbGFiZWx7cGVuLXJhd3Blbi1vYmplY3RzfX0KK1xzdWJzZWN0aW9ue1R1cnRsZSwgUGVuIGFuZCBSYXdQZW4gT2JqZWN0cyBcbGFiZWx7cGVuLXJhd3Blbi1vYmplY3RzfX0KIAotXGNsYXNze1Blbn0gYW5kIFxjbGFzc3tSYXdQZW59IG9iamVjdHMgaGF2ZSBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMKLWRlc2NyaWJlZCBhYm92ZSwgZXhjZXB0IGZvciBcZnVuY3Rpb257ZGVtbygpfSBhcyBtZXRob2RzLCB3aGljaAotbWFuaXB1bGF0ZSB0aGUgZ2l2ZW4gcGVuLgorTW9zdCBvZiB0aGUgZ2xvYmFsIGZ1bmN0aW9ucyBhdmFpbGFibGUgaW4gdGhlIG1vZHVsZSBhcmUgYWxzbworYXZhaWxhYmxlIGFzIG1ldGhvZHMgb2YgdGhlIFxjbGFzc3tUdXJ0bGV9LCBcY2xhc3N7UGVufSBhbmQKK1xjbGFzc3tSYXdQZW59IGNsYXNzZXMsIGFmZmVjdGluZyBvbmx5IHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gcGVuLgogCiBUaGUgb25seSBtZXRob2Qgd2hpY2ggaXMgbW9yZSBwb3dlcmZ1bCBhcyBhIG1ldGhvZCBpcwotXGZ1bmN0aW9ue2RlZ3JlZXMoKX0uCitcZnVuY3Rpb257ZGVncmVlcygpfSwgd2hpY2ggdGFrZXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgbGV0dGluZyAKK3lvdSBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgdW5pdHMgY29ycmVzcG9uZGluZyB0byBhIGZ1bGwgY2lyY2xlOgogCiBcYmVnaW57bWV0aG9kZGVzY317ZGVncmVlc317XG9wdGlvbmFse2Z1bGxjaXJjbGV9fQogXHZhcntmdWxsY2lyY2xlfSBpcyBieSBkZWZhdWx0IDM2MC4gVGhpcyBjYW4gY2F1c2UgdGhlIHBlbiB0byBoYXZlIGFueQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ0eXBlcy50ZXggYi9Eb2MvbGliL2xpYnR5cGVzLnRleAppbmRleCBmOGY1NTdkLi5jODBhODdhIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnR5cGVzLnRleAorKysgYi9Eb2MvbGliL2xpYnR5cGVzLnRleApAQCAtMTc2LDYgKzE3NiwzMCBAQAogXGZ1bmN0aW9ue2J1ZmZlcigpfVxiaWZ1bmNpbmRleHtidWZmZXJ9IGZ1bmN0aW9uLgogXGVuZHtkYXRhZGVzY30KIAorXGJlZ2lue2RhdGFkZXNjfXtEaWN0UHJveHlUeXBlfQorVGhlIHR5cGUgb2YgZGljdCBwcm94aWVzLCBzdWNoIGFzIFxjb2Rle1R5cGVUeXBlLl9fZGljdF9ffS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317Tm90SW1wbGVtZW50ZWRUeXBlfQorVGhlIHR5cGUgb2YgXGNvZGV7Tm90SW1wbGVtZW50ZWR9CitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e0dldFNldERlc2NyaXB0b3JUeXBlfQorVGhlIHR5cGUgb2Ygb2JqZWN0cyBkZWZpbmVkIGluIGV4dGVuc2lvbiBtb2R1bGVzIHdpdGggXGNvZGV7UHlHZXRTZXREZWZ9LCBzdWNoCithcyBcY29kZXtGcmFtZVR5cGUuZl9sb2NhbHN9IG9yIFxjb2Rle2FycmF5LmFycmF5LnR5cGVjb2RlfS4gIFRoaXMgY29uc3RhbnQgaXMKK25vdCBkZWZpbmVkIGluIGltcGxlbWVudGF0aW9ucyBvZiBQeXRob24gdGhhdCBkbyBub3QgaGF2ZSBzdWNoIGV4dGVuc2lvbgordHlwZXMsIHNvIGZvciBwb3J0YWJsZSBjb2RlIHVzZSBcY29kZXtoYXNhdHRyKHR5cGVzLCAnR2V0U2V0RGVzY3JpcHRvclR5cGUnKX0uCitcdmVyc2lvbmFkZGVkezIuNX0KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TWVtYmVyRGVzY3JpcHRvclR5cGV9CitUaGUgdHlwZSBvZiBvYmplY3RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBcY29kZXtQeU1lbWJlckRlZn0sIHN1Y2gKK2FzIFxjb2RlIHtkYXRldGltZS50aW1lZGVsdGEuZGF5c30uICBUaGlzIGNvbnN0YW50IGlzIG5vdCBkZWZpbmVkIGluCitpbXBsZW1lbnRhdGlvbnMgb2YgUHl0aG9uIHRoYXQgZG8gbm90IGhhdmUgc3VjaCBleHRlbnNpb24gdHlwZXMsIHNvIGZvcgorcG9ydGFibGUgY29kZSB1c2UgXGNvZGV7aGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyl9LgorXHZlcnNpb25hZGRlZHsyLjV9CitcZW5ke2RhdGFkZXNjfQorCiBcYmVnaW57ZGF0YWRlc2N9e1N0cmluZ1R5cGVzfQogQSBzZXF1ZW5jZSBjb250YWluaW5nIFxjb2Rle1N0cmluZ1R5cGV9IGFuZCBcY29kZXtVbmljb2RlVHlwZX0gdXNlZCB0bwogZmFjaWxpdGF0ZSBlYXNpZXIgY2hlY2tpbmcgZm9yIGFueSBzdHJpbmcgb2JqZWN0LiAgVXNpbmcgdGhpcyBpcyBtb3JlCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuZG9jLnRleCBiL0RvYy9saWIvbGlidW5kb2MudGV4CmluZGV4IGRmNzgxNTIuLmU3ZDM4OGYgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5kb2MudGV4CisrKyBiL0RvYy9saWIvbGlidW5kb2MudGV4CkBAIC00OSw3ICs0OSw3IEBACiAKIFxpdGVtW1xtb2R1bGV7YnNkZGIxODV9XQogLS0tIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG1vZHVsZSBmb3Igc3lzdGVtcyB3aGljaCBzdGlsbCB1c2UgdGhlIEJlcmtlbGV5Ci0gICAgREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBVbml4LWJhc2VkCisgICAgREIgMS44NSBtb2R1bGUuICBJdCBpcyBub3JtYWxseSBvbmx5IGF2YWlsYWJsZSBvbiBjZXJ0YWluIEJTRCBcVU5JWC1iYXNlZAogICAgIHN5c3RlbXMuICBJdCBzaG91bGQgbmV2ZXIgYmUgdXNlZCBkaXJlY3RseS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidW5pY29kZWRhdGEudGV4IGIvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKaW5kZXggZGNiZGE3Ny4uNDM1NDY2YSAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKKysrIGIvRG9jL2xpYi9saWJ1bmljb2RlZGF0YS50ZXgKQEAgLTE0LDExICsxNCwxMSBAQAogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBVbmljb2RlIENoYXJhY3RlciBEYXRhYmFzZSB3aGljaAogZGVmaW5lcyBjaGFyYWN0ZXIgcHJvcGVydGllcyBmb3IgYWxsIFVuaWNvZGUgY2hhcmFjdGVycy4gVGhlIGRhdGEgaW4KIHRoaXMgZGF0YWJhc2UgaXMgYmFzZWQgb24gdGhlIFxmaWxle1VuaWNvZGVEYXRhLnR4dH0gZmlsZSB2ZXJzaW9uCi00LjEuMCB3aGljaCBpcyBwdWJsaWNhbGx5IGF2YWlsYWJsZSBmcm9tIFx1cmx7ZnRwOi8vZnRwLnVuaWNvZGUub3JnL30uCis0LjEuMCB3aGljaCBpcyBwdWJsaWNseSBhdmFpbGFibGUgZnJvbSBcdXJse2Z0cDovL2Z0cC51bmljb2RlLm9yZy99LgogCiBUaGUgbW9kdWxlIHVzZXMgdGhlIHNhbWUgbmFtZXMgYW5kIHN5bWJvbHMgYXMgZGVmaW5lZCBieSB0aGUKIFVuaWNvZGVEYXRhIEZpbGUgRm9ybWF0IDQuMS4wIChzZWUKLVx1cmx7aHR0cDovL3d3dy51bmljb2RlLm9yZy9QdWJsaWMvNC4xLVVwZGF0ZS9Vbmljb2RlRGF0YS00LjEuMC5odG1sfSkuICBJdAorXHVybHtodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy80LjEuMC91Y2QvVUNELmh0bWx9KS4gIEl0CiBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgogCiBcYmVnaW57ZnVuY2Rlc2N9e2xvb2t1cH17bmFtZX0KQEAgLTEwOCw3ICsxMDgsNyBAQAogTm9ybWFsIGZvcm0gQyAoTkZDKSBmaXJzdCBhcHBsaWVzIGEgY2Fub25pY2FsIGRlY29tcG9zaXRpb24sIHRoZW4KIGNvbXBvc2VzIHByZS1jb21iaW5lZCBjaGFyYWN0ZXJzIGFnYWluLgogCi1JbiBhZGRpdGlvbiB0byB0aGVzZSB0d28gZm9ybXMsIHRoZXJlIHR3byBhZGRpdGlvbmFsIG5vcm1hbCBmb3JtcworSW4gYWRkaXRpb24gdG8gdGhlc2UgdHdvIGZvcm1zLCB0aGVyZSBhcmUgdHdvIGFkZGl0aW9uYWwgbm9ybWFsIGZvcm1zCiBiYXNlZCBvbiBjb21wYXRpYmlsaXR5IGVxdWl2YWxlbmNlLiBJbiBVbmljb2RlLCBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlCiBzdXBwb3J0ZWQgd2hpY2ggbm9ybWFsbHkgd291bGQgYmUgdW5pZmllZCB3aXRoIG90aGVyIGNoYXJhY3RlcnMuIEZvcgogZXhhbXBsZSwgVSsyMTYwIChST01BTiBOVU1FUkFMIE9ORSkgaXMgcmVhbGx5IHRoZSBzYW1lIHRoaW5nIGFzIFUrMDA0OQpAQCAtMTM5LDMgKzEzOSwyMiBAQAogCiBcdmVyc2lvbmFkZGVkezIuNX0KIFxlbmR7ZGF0YWRlc2N9CisKK0V4YW1wbGVzOgorCitcYmVnaW57dmVyYmF0aW19Cis+Pj4gdW5pY29kZWRhdGEubG9va3VwKCdMRUZUIENVUkxZIEJSQUNLRVQnKQordSd7JworPj4+IHVuaWNvZGVkYXRhLm5hbWUodScvJykKKydTT0xJRFVTJworPj4+IHVuaWNvZGVkYXRhLmRlY2ltYWwodSc5JykKKzkKKz4+PiB1bmljb2RlZGF0YS5kZWNpbWFsKHUnYScpCitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluID8KK1ZhbHVlRXJyb3I6IG5vdCBhIGRlY2ltYWwKKz4+PiB1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKSAgIyAnTCdldHRlciwgJ3UncHBlcmNhc2UKKydMdScgICAKKz4+PiB1bmljb2RlZGF0YS5iaWRpcmVjdGlvbmFsKHUnXHUwNjYwJykgIyAnQSdyYWJpYywgJ04ndW1iZXIKKydBTicKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVuaXR0ZXN0LnRleCBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CmluZGV4IDUxYjMyMWUuLmY0MDQ5M2QgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CisrKyBiL0RvYy9saWIvbGlidW5pdHRlc3QudGV4CkBAIC0xMCwxOSArMTAsMTkgQEAKIAogXHZlcnNpb25hZGRlZHsyLjF9CiAKLVRoZSBQeXRob24gdW5pdCB0ZXN0aW5nIGZyYW1ld29yaywgb2Z0ZW4gcmVmZXJyZWQgdG8gYXMgYGBQeVVuaXQsJycgaXMKK1RoZSBQeXRob24gdW5pdCB0ZXN0aW5nIGZyYW1ld29yaywgc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIGBgUHlVbml0LCcnIGlzCiBhIFB5dGhvbiBsYW5ndWFnZSB2ZXJzaW9uIG9mIEpVbml0LCBieSBLZW50IEJlY2sgYW5kIEVyaWNoIEdhbW1hLgogSlVuaXQgaXMsIGluIHR1cm4sIGEgSmF2YSB2ZXJzaW9uIG9mIEtlbnQncyBTbWFsbHRhbGsgdGVzdGluZwogZnJhbWV3b3JrLiAgRWFjaCBpcyB0aGUgZGUgZmFjdG8gc3RhbmRhcmQgdW5pdCB0ZXN0aW5nIGZyYW1ld29yayBmb3IKIGl0cyByZXNwZWN0aXZlIGxhbmd1YWdlLgogCi1QeVVuaXQgc3VwcG9ydHMgdGVzdCBhdXRvbWF0aW9uLCBzaGFyaW5nIG9mIHNldHVwIGFuZCBzaHV0ZG93biBjb2RlCi1mb3IgdGVzdHMsIGFnZ3JlZ2F0aW9uIG9mIHRlc3RzIGludG8gY29sbGVjdGlvbnMsIGFuZCBpbmRlcGVuZGVuY2Ugb2YKK1xtb2R1bGV7dW5pdHRlc3R9IHN1cHBvcnRzIHRlc3QgYXV0b21hdGlvbiwgc2hhcmluZyBvZiBzZXR1cCBhbmQgc2h1dGRvd24KK2NvZGUgZm9yIHRlc3RzLCBhZ2dyZWdhdGlvbiBvZiB0ZXN0cyBpbnRvIGNvbGxlY3Rpb25zLCBhbmQgaW5kZXBlbmRlbmNlIG9mCiB0aGUgdGVzdHMgZnJvbSB0aGUgcmVwb3J0aW5nIGZyYW1ld29yay4gIFRoZSBcbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUKIHByb3ZpZGVzIGNsYXNzZXMgdGhhdCBtYWtlIGl0IGVhc3kgdG8gc3VwcG9ydCB0aGVzZSBxdWFsaXRpZXMgZm9yIGEKIHNldCBvZiB0ZXN0cy4KIAotVG8gYWNoaWV2ZSB0aGlzLCBQeVVuaXQgc3VwcG9ydHMgc29tZSBpbXBvcnRhbnQgY29uY2VwdHM6CitUbyBhY2hpZXZlIHRoaXMsIFxtb2R1bGV7dW5pdHRlc3R9IHN1cHBvcnRzIHNvbWUgaW1wb3J0YW50IGNvbmNlcHRzOgogCiBcYmVnaW57ZGVmaW5pdGlvbnN9CiBcdGVybXt0ZXN0IGZpeHR1cmV9CkBAIC0zMywxMCArMzMsOSBAQAogCiBcdGVybXt0ZXN0IGNhc2V9CiBBIFxkZm57dGVzdCBjYXNlfSBpcyB0aGUgc21hbGxlc3QgdW5pdCBvZiB0ZXN0aW5nLiAgSXQgY2hlY2tzIGZvciBhCi1zcGVjaWZpYyByZXNwb25zZSB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIGlucHV0cy4gIFB5VW5pdCBwcm92aWRlcyBhCi1iYXNlIGNsYXNzLCBcY2xhc3N7VGVzdENhc2V9LCB3aGljaCBtYXkgYmUgdXNlZCB0byBjcmVhdGUgbmV3IHRlc3QKLWNhc2VzLiBZb3UgbWF5IHByb3ZpZGUgeW91ciBvd24gaW1wbGVtZW50YXRpb24gdGhhdCBkb2VzIG5vdCBzdWJjbGFzcwotZnJvbSBcY2xhc3N7VGVzdENhc2V9LCBvZiBjb3Vyc2UuCitzcGVjaWZpYyByZXNwb25zZSB0byBhIHBhcnRpY3VsYXIgc2V0IG9mIGlucHV0cy4gIFxtb2R1bGV7dW5pdHRlc3R9Citwcm92aWRlcyBhIGJhc2UgY2xhc3MsIFxjbGFzc3tUZXN0Q2FzZX0sIHdoaWNoIG1heSBiZSB1c2VkIHRvIGNyZWF0ZQorbmV3IHRlc3QgY2FzZXMuCiAKIFx0ZXJte3Rlc3Qgc3VpdGV9CiBBIFxkZm57dGVzdCBzdWl0ZX0gaXMgYSBjb2xsZWN0aW9uIG9mIHRlc3QgY2FzZXMsIHRlc3Qgc3VpdGVzLCBvcgpAQCAtNTQsOCArNTMsOCBAQAogVGhlIHRlc3QgY2FzZSBhbmQgdGVzdCBmaXh0dXJlIGNvbmNlcHRzIGFyZSBzdXBwb3J0ZWQgdGhyb3VnaCB0aGUKIFxjbGFzc3tUZXN0Q2FzZX0gYW5kIFxjbGFzc3tGdW5jdGlvblRlc3RDYXNlfSBjbGFzc2VzOyB0aGUgZm9ybWVyCiBzaG91bGQgYmUgdXNlZCB3aGVuIGNyZWF0aW5nIG5ldyB0ZXN0cywgYW5kIHRoZSBsYXR0ZXIgY2FuIGJlIHVzZWQgd2hlbgotaW50ZWdyYXRpbmcgZXhpc3RpbmcgdGVzdCBjb2RlIHdpdGggYSBQeVVuaXQtZHJpdmVuIGZyYW1ld29yay4gIFdoZW4KLWJ1aWxkaW5nIHRlc3QgZml4dHVyZXMgdXNpbmcgXGNsYXNze1Rlc3RDYXNlfSwgdGhlIFxtZXRob2R7c2V0VXAoKX0KK2ludGVncmF0aW5nIGV4aXN0aW5nIHRlc3QgY29kZSB3aXRoIGEgXG1vZHVsZXt1bml0dGVzdH0tZHJpdmVuIGZyYW1ld29yay4KK1doZW4gYnVpbGRpbmcgdGVzdCBmaXh0dXJlcyB1c2luZyBcY2xhc3N7VGVzdENhc2V9LCB0aGUgXG1ldGhvZHtzZXRVcCgpfQogYW5kIFxtZXRob2R7dGVhckRvd24oKX0gbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGRlbiB0byBwcm92aWRlCiBpbml0aWFsaXphdGlvbiBhbmQgY2xlYW51cCBmb3IgdGhlIGZpeHR1cmUuICBXaXRoCiBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0sIGV4aXN0aW5nIGZ1bmN0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHRoZQpAQCAtNzQsMTkgKzczLDE3IEBACiBBIHRlc3QgcnVubmVyIGlzIGFuIG9iamVjdCB0aGF0IHByb3ZpZGVzIGEgc2luZ2xlIG1ldGhvZCwKIFxtZXRob2R7cnVuKCl9LCB3aGljaCBhY2NlcHRzIGEgXGNsYXNze1Rlc3RDYXNlfSBvciBcY2xhc3N7VGVzdFN1aXRlfQogb2JqZWN0IGFzIGEgcGFyYW1ldGVyLCBhbmQgcmV0dXJucyBhIHJlc3VsdCBvYmplY3QuICBUaGUgY2xhc3MKLVxjbGFzc3tUZXN0UmVzdWx0fSBpcyBwcm92aWRlZCBmb3IgdXNlIGFzIHRoZSByZXN1bHQgb2JqZWN0LiAgUHlVbml0Ci1wcm92aWRlIHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGFzIGFuIGV4YW1wbGUgdGVzdCBydW5uZXIgd2hpY2gKLXJlcG9ydHMgdGVzdCByZXN1bHRzIG9uIHRoZSBzdGFuZGFyZCBlcnJvciBzdHJlYW0gYnkgZGVmYXVsdC4KLUFsdGVybmF0ZSBydW5uZXJzIGNhbiBiZSBpbXBsZW1lbnRlZCBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIChzdWNoIGFzCi1ncmFwaGljYWwgZW52aXJvbm1lbnRzKSB3aXRob3V0IGFueSBuZWVkIHRvIGRlcml2ZSBmcm9tIGEgc3BlY2lmaWMKLWNsYXNzLgorXGNsYXNze1Rlc3RSZXN1bHR9IGlzIHByb3ZpZGVkIGZvciB1c2UgYXMgdGhlIHJlc3VsdCBvYmplY3QuCitcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyB0aGUgXGNsYXNze1RleHRUZXN0UnVubmVyfSBhcyBhbiBleGFtcGxlCit0ZXN0IHJ1bm5lciB3aGljaCByZXBvcnRzIHRlc3QgcmVzdWx0cyBvbiB0aGUgc3RhbmRhcmQgZXJyb3Igc3RyZWFtIGJ5CitkZWZhdWx0LiAgQWx0ZXJuYXRlIHJ1bm5lcnMgY2FuIGJlIGltcGxlbWVudGVkIGZvciBvdGhlciBlbnZpcm9ubWVudHMKKyhzdWNoIGFzIGdyYXBoaWNhbCBlbnZpcm9ubWVudHMpIHdpdGhvdXQgYW55IG5lZWQgdG8gZGVyaXZlIGZyb20gYQorc3BlY2lmaWMgY2xhc3MuCiAKIAogXGJlZ2lue3NlZWFsc299CiAgIFxzZWVtb2R1bGV7ZG9jdGVzdH17QW5vdGhlciB0ZXN0LXN1cHBvcnQgbW9kdWxlIHdpdGggYSB2ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGZsYXZvci59Ci0gIFxzZWV0aXRsZVtodHRwOi8vcHl1bml0LnNvdXJjZWZvcmdlLm5ldC9de1B5VW5pdCBXZWIgU2l0ZX17VGhlCi0gICAgICAgICAgICBzb3VyY2UgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gUHlVbml0Ln0KICAgXHNlZXRpdGxlW2h0dHA6Ly93d3cuWFByb2dyYW1taW5nLmNvbS90ZXN0ZnJhbS5odG1de1NpbXBsZSBTbWFsbHRhbGsKICAgICAgICAgICAgIFRlc3Rpbmc6IFdpdGggUGF0dGVybnN9e0tlbnQgQmVjaydzIG9yaWdpbmFsIHBhcGVyIG9uCiAgICAgICAgICAgICB0ZXN0aW5nIGZyYW1ld29ya3MgdXNpbmcgdGhlIHBhdHRlcm4gc2hhcmVkIGJ5CkBAIC0xNjYsNyArMTYzLDcgQEAKIHdpdGg6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLXN1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRlc3RTZXF1ZW5jZUZ1bmN0aW9ucykKK3N1aXRlID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShUZXN0U2VxdWVuY2VGdW5jdGlvbnMpCiB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcih2ZXJib3NpdHk9MikucnVuKHN1aXRlKQogXGVuZHt2ZXJiYXRpbX0KIApAQCAtMTk0LDggKzE5MSw4IEBACiAKIFRoZSBiYXNpYyBidWlsZGluZyBibG9ja3Mgb2YgdW5pdCB0ZXN0aW5nIGFyZSBcZGZue3Rlc3QgY2FzZXN9IC0tLQogc2luZ2xlIHNjZW5hcmlvcyB0aGF0IG11c3QgYmUgc2V0IHVwIGFuZCBjaGVja2VkIGZvciBjb3JyZWN0bmVzcy4gIEluCi1QeVVuaXQsIHRlc3QgY2FzZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGluc3RhbmNlcyBvZiB0aGUKLVxjbGFzc3tUZXN0Q2FzZX0gY2xhc3MgaW4gdGhlIFxyZWZtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZS4gVG8gbWFrZQorXG1vZHVsZXt1bml0dGVzdH0sIHRlc3QgY2FzZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGluc3RhbmNlcyBvZgorXG1vZHVsZXt1bml0dGVzdH0ncyBcY2xhc3N7VGVzdENhc2V9IGNsYXNzLiBUbyBtYWtlCiB5b3VyIG93biB0ZXN0IGNhc2VzIHlvdSBtdXN0IHdyaXRlIHN1YmNsYXNzZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSwgb3IKIHVzZSBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0uCiAKQEAgLTIwNyw3ICsyMDQsNyBAQAogc2VsZiBjb250YWluZWQsIHN1Y2ggdGhhdCBpdCBjYW4gYmUgcnVuIGVpdGhlciBpbiBpc29sYXRpb24gb3IgaW4KIGFyYml0cmFyeSBjb21iaW5hdGlvbiB3aXRoIGFueSBudW1iZXIgb2Ygb3RoZXIgdGVzdCBjYXNlcy4KIAotVGhlIHNpbXBsZXN0IHRlc3QgY2FzZSBzdWJjbGFzcyB3aWxsIHNpbXBseSBvdmVycmlkZSB0aGUKK1RoZSBzaW1wbGVzdCBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzIHdpbGwgc2ltcGx5IG92ZXJyaWRlIHRoZQogXG1ldGhvZHtydW5UZXN0KCl9IG1ldGhvZCBpbiBvcmRlciB0byBwZXJmb3JtIHNwZWNpZmljIHRlc3RpbmcgY29kZToKIAogXGJlZ2lue3ZlcmJhdGltfQpAQCAtMjIxLDEyICsyMTgsMTMgQEAKIAogTm90ZSB0aGF0IGluIG9yZGVyIHRvIHRlc3Qgc29tZXRoaW5nLCB3ZSB1c2UgdGhlIG9uZSBvZiB0aGUKIFxtZXRob2R7YXNzZXJ0KigpfSBvciBcbWV0aG9ke2ZhaWwqKCl9IG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlCi1cY2xhc3N7VGVzdENhc2V9IGJhc2UgY2xhc3MuICBJZiB0aGUgdGVzdCBmYWlscyB3aGVuIHRoZSB0ZXN0IGNhc2UKLXJ1bnMsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHJhaXNlZCwgYW5kIHRoZSB0ZXN0aW5nIGZyYW1ld29yayB3aWxsCi1pZGVudGlmeSB0aGUgdGVzdCBjYXNlIGFzIGEgXGRmbntmYWlsdXJlfS4gIE90aGVyIGV4Y2VwdGlvbnMgdGhhdCBkbwotbm90IGFyaXNlIGZyb20gY2hlY2tzIG1hZGUgdGhyb3VnaCB0aGUgXG1ldGhvZHthc3NlcnQqKCl9IGFuZAotXG1ldGhvZHtmYWlsKigpfSBtZXRob2RzIGFyZSBpZGVudGlmaWVkIGJ5IHRoZSB0ZXN0aW5nIGZyYW1ld29yayBhcwotXGRmbntlcnJvcnN9LgorXGNsYXNze1Rlc3RDYXNlfSBiYXNlIGNsYXNzLiAgSWYgdGhlIHRlc3QgZmFpbHMsIGFuIGV4Y2VwdGlvbiB3aWxsIGJlCityYWlzZWQsIGFuZCBcbW9kdWxle3VuaXR0ZXN0fSB3aWxsIGlkZW50aWZ5IHRoZSB0ZXN0IGNhc2UgYXMgYQorXGRmbntmYWlsdXJlfS4gIEFueSBvdGhlciBleGNlcHRpb25zIHdpbGwgYmUgdHJlYXRlZCBhcyBcZGZue2Vycm9yc30uCitUaGlzIGhlbHBzIHlvdSBpZGVudGlmeSB3aGVyZSB0aGUgcHJvYmxlbSBpczogXGRmbntmYWlsdXJlc30gYXJlIGNhdXNlZCBieQoraW5jb3JyZWN0IHJlc3VsdHMgLSBhIDUgd2hlcmUgeW91IGV4cGVjdGVkIGEgNi4gXGRmbntFcnJvcnN9IGFyZSBjYXVzZWQgYnkKK2luY29ycmVjdCBjb2RlIC0gZS5nLiwgYSBcZXhjZXB0aW9ue1R5cGVFcnJvcn0gY2F1c2VkIGJ5IGFuIGluY29ycmVjdAorZnVuY3Rpb24gY2FsbC4KIAogVGhlIHdheSB0byBydW4gYSB0ZXN0IGNhc2Ugd2lsbCBiZSBkZXNjcmliZWQgbGF0ZXIuICBGb3Igbm93LCBub3RlCiB0aGF0IHRvIGNvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBzdWNoIGEgdGVzdCBjYXNlLCB3ZSBjYWxsIGl0cwpAQCAtMjM3LDcgKzIzNSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBOb3csIHN1Y2ggdGVzdCBjYXNlcyBjYW4gYmUgbnVtZXJvdXMsIGFuZCB0aGVpciBzZXQtdXAgY2FuIGJlCi1yZXBldGl0aXZlLiAgSW4gdGhlIGFib3ZlIGNhc2UsIGNvbnN0cnVjdGluZyBhIGBgV2lkZ2V0JycgaW4gZWFjaCBvZgorcmVwZXRpdGl2ZS4gIEluIHRoZSBhYm92ZSBjYXNlLCBjb25zdHJ1Y3RpbmcgYSBcY2xhc3N7V2lkZ2V0fSBpbiBlYWNoIG9mCiAxMDAgV2lkZ2V0IHRlc3QgY2FzZSBzdWJjbGFzc2VzIHdvdWxkIG1lYW4gdW5zaWdodGx5IGR1cGxpY2F0aW9uLgogCiBMdWNraWx5LCB3ZSBjYW4gZmFjdG9yIG91dCBzdWNoIHNldC11cCBjb2RlIGJ5IGltcGxlbWVudGluZyBhIG1ldGhvZApAQCAtMjgzLDcgKzI4MSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBJZiBcbWV0aG9ke3NldFVwKCl9IHN1Y2NlZWRlZCwgdGhlIFxtZXRob2R7dGVhckRvd24oKX0gbWV0aG9kIHdpbGwgYmUKLXJ1biByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IFxtZXRob2R7cnVuVGVzdCgpfSBzdWNjZWVkZWQuCitydW4gd2hldGhlciBcbWV0aG9ke3J1blRlc3QoKX0gc3VjY2VlZGVkIG9yIG5vdC4KIAogU3VjaCBhIHdvcmtpbmcgZW52aXJvbm1lbnQgZm9yIHRoZSB0ZXN0aW5nIGNvZGUgaXMgY2FsbGVkIGEKIFxkZm57Zml4dHVyZX0uCkBAIC0yOTIsOCArMjkwLDggQEAKIHdlIHdvdWxkIGVuZCB1cCBzdWJjbGFzc2luZyBcY2xhc3N7U2ltcGxlV2lkZ2V0VGVzdENhc2V9IGludG8gbWFueQogc21hbGwgb25lLW1ldGhvZCBjbGFzc2VzIHN1Y2ggYXMKIFxjbGFzc3tEZWZhdWx0V2lkZ2V0U2l6ZVRlc3RDYXNlfS4gIFRoaXMgaXMgdGltZS1jb25zdW1pbmcgYW5kCi1kaXNjb3VyYWdpbmcsIHNvIGluIHRoZSBzYW1lIHZlaW4gYXMgSlVuaXQsIFB5VW5pdCBwcm92aWRlcyBhIHNpbXBsZXIKLW1lY2hhbmlzbToKK2Rpc2NvdXJhZ2luZywgc28gaW4gdGhlIHNhbWUgdmVpbiBhcyBKVW5pdCwgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMKK2Egc2ltcGxlciBtZWNoYW5pc206CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIGltcG9ydCB1bml0dGVzdApAQCAtMzI5LDkgKzMyNyw5IEBACiBcZW5ke3ZlcmJhdGltfQogCiBUZXN0IGNhc2UgaW5zdGFuY2VzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGFjY29yZGluZyB0byB0aGUgZmVhdHVyZXMKLXRoZXkgdGVzdC4gIFB5VW5pdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgdGhpczogdGhlIFxjbGFzc3t0ZXN0Ci1zdWl0ZX0sIHJlcHJlc2VudGVkIGJ5IHRoZSBjbGFzcyBcY2xhc3N7VGVzdFN1aXRlfSBpbiB0aGUKLVxyZWZtb2R1bGV7dW5pdHRlc3R9IG1vZHVsZToKK3RoZXkgdGVzdC4gIFxtb2R1bGV7dW5pdHRlc3R9IHByb3ZpZGVzIGEgbWVjaGFuaXNtIGZvciB0aGlzOiB0aGUKK1xkZm57dGVzdCBzdWl0ZX0sIHJlcHJlc2VudGVkIGJ5IFxtb2R1bGV7dW5pdHRlc3R9J3MgXGNsYXNze1Rlc3RTdWl0ZX0KK2NsYXNzOgogCiBcYmVnaW57dmVyYmF0aW19CiB3aWRnZXRUZXN0U3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQpAQCAtMzU0LDI4ICszNTIsMzAgQEAKIG9yIGV2ZW46CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWNsYXNzIFdpZGdldFRlc3RTdWl0ZSh1bml0dGVzdC5UZXN0U3VpdGUpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgdW5pdHRlc3QuVGVzdFN1aXRlLl9faW5pdF9fKHNlbGYsbWFwKFdpZGdldFRlc3RDYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidGVzdERlZmF1bHRTaXplIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RSZXNpemUiKSkpCi1cZW5ke3ZlcmJhdGltfQorZGVmIHN1aXRlKCk6CisgICAgdGVzdHMgPSBbInRlc3REZWZhdWx0U2l6ZSIsICJ0ZXN0UmVzaXplIl0KIAotKFRoZSBsYXR0ZXIgaXMgYWRtaXR0ZWRseSBub3QgZm9yIHRoZSBmYWludC1oZWFydGVkISkKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKG1hcChXaWRnZXRUZXN0Q2FzZSwgdGVzdHMpKQorXGVuZHt2ZXJiYXRpbX0KIAogU2luY2UgaXQgaXMgYSBjb21tb24gcGF0dGVybiB0byBjcmVhdGUgYSBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzCi13aXRoIG1hbnkgc2ltaWxhcmx5IG5hbWVkIHRlc3QgZnVuY3Rpb25zLCB0aGVyZSBpcyBhIGNvbnZlbmllbmNlCi1mdW5jdGlvbiBjYWxsZWQgXGZ1bmN0aW9ue21ha2VTdWl0ZSgpfSB0aGF0IGNvbnN0cnVjdHMgYSB0ZXN0IHN1aXRlCi10aGF0IGNvbXByaXNlcyBhbGwgb2YgdGhlIHRlc3QgY2FzZXMgaW4gYSB0ZXN0IGNhc2UgY2xhc3M6Cit3aXRoIG1hbnkgc2ltaWxhcmx5IG5hbWVkIHRlc3QgZnVuY3Rpb25zLCBcbW9kdWxle3VuaXR0ZXN0fSBwcm92aWRlcyBhCitcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgdGhhdCBjYW4gYmUgdXNlZCB0byBhdXRvbWF0ZSB0aGUgcHJvY2VzcyBvZgorY3JlYXRpbmcgYSB0ZXN0IHN1aXRlIGFuZCBwb3B1bGF0aW5nIGl0IHdpdGggaW5kaXZpZHVhbCB0ZXN0cy4KK0ZvciBleGFtcGxlLAogCiBcYmVnaW57dmVyYmF0aW19Ci1zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShXaWRnZXRUZXN0Q2FzZSkKK3N1aXRlID0gdW5pdHRlc3QuVGVzdExvYWRlcigpLmxvYWRUZXN0c0Zyb21UZXN0Q2FzZShXaWRnZXRUZXN0Q2FzZSkKIFxlbmR7dmVyYmF0aW19CiAKLU5vdGUgdGhhdCB3aGVuIHVzaW5nIHRoZSBcZnVuY3Rpb257bWFrZVN1aXRlKCl9IGZ1bmN0aW9uLCB0aGUgb3JkZXIgaW4KLXdoaWNoIHRoZSB2YXJpb3VzIHRlc3QgY2FzZXMgd2lsbCBiZSBydW4gYnkgdGhlIHRlc3Qgc3VpdGUgaXMgdGhlCi1vcmRlciBkZXRlcm1pbmVkIGJ5IHNvcnRpbmcgdGhlIHRlc3QgZnVuY3Rpb24gbmFtZXMgdXNpbmcgdGhlCi1cZnVuY3Rpb257Y21wKCl9IGJ1aWx0LWluIGZ1bmN0aW9uLgord2lsbCBjcmVhdGUgYSB0ZXN0IHN1aXRlIHRoYXQgd2lsbCBydW4KK1xjb2Rle1dpZGdldFRlc3RDYXNlLnRlc3REZWZhdWx0U2l6ZSgpfSBhbmQgXGNvZGV7V2lkZ2V0VGVzdENhc2UudGVzdFJlc2l6ZX0uCitcY2xhc3N7VGVzdExvYWRlcn0gdXNlcyB0aGUgXGNvZGV7J3Rlc3QnfSBtZXRob2QgbmFtZSBwcmVmaXggdG8gaWRlbnRpZnkKK3Rlc3QgbWV0aG9kcyBhdXRvbWF0aWNhbGx5LgorCitOb3RlIHRoYXQgdGhlIG9yZGVyIGluIHdoaWNoIHRoZSB2YXJpb3VzIHRlc3QgY2FzZXMgd2lsbCBiZSBydW4gaXMKK2RldGVybWluZWQgYnkgc29ydGluZyB0aGUgdGVzdCBmdW5jdGlvbiBuYW1lcyB3aXRoIHRoZSBidWlsdC1pbgorXGZ1bmN0aW9ue2NtcCgpfSBmdW5jdGlvbi4KIAogT2Z0ZW4gaXQgaXMgZGVzaXJhYmxlIHRvIGdyb3VwIHN1aXRlcyBvZiB0ZXN0IGNhc2VzIHRvZ2V0aGVyLCBzbyBhcyB0bwogcnVuIHRlc3RzIGZvciB0aGUgd2hvbGUgc3lzdGVtIGF0IG9uY2UuICBUaGlzIGlzIGVhc3ksIHNpbmNlCkBAIC0zODUsMTMgKzM4NSwxMyBAQAogXGJlZ2lue3ZlcmJhdGltfQogc3VpdGUxID0gbW9kdWxlMS5UaGVUZXN0U3VpdGUoKQogc3VpdGUyID0gbW9kdWxlMi5UaGVUZXN0U3VpdGUoKQotYWxsdGVzdHMgPSB1bml0dGVzdC5UZXN0U3VpdGUoKHN1aXRlMSwgc3VpdGUyKSkKK2FsbHRlc3RzID0gdW5pdHRlc3QuVGVzdFN1aXRlKFtzdWl0ZTEsIHN1aXRlMl0pCiBcZW5ke3ZlcmJhdGltfQogCiBZb3UgY2FuIHBsYWNlIHRoZSBkZWZpbml0aW9ucyBvZiB0ZXN0IGNhc2VzIGFuZCB0ZXN0IHN1aXRlcyBpbiB0aGUKIHNhbWUgbW9kdWxlcyBhcyB0aGUgY29kZSB0aGV5IGFyZSB0byB0ZXN0IChzdWNoIGFzIFxmaWxle3dpZGdldC5weX0pLAogYnV0IHRoZXJlIGFyZSBzZXZlcmFsIGFkdmFudGFnZXMgdG8gcGxhY2luZyB0aGUgdGVzdCBjb2RlIGluIGEKLXNlcGFyYXRlIG1vZHVsZSwgc3VjaCBhcyBcZmlsZXt3aWRnZXR0ZXN0cy5weX06CitzZXBhcmF0ZSBtb2R1bGUsIHN1Y2ggYXMgXGZpbGV7dGVzdF93aWRnZXQucHl9OgogCiBcYmVnaW57aXRlbWl6ZX0KICAgXGl0ZW0gVGhlIHRlc3QgbW9kdWxlIGNhbiBiZSBydW4gc3RhbmRhbG9uZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCkBAIC00MTIsMTMgKzQxMiwxMiBAQAogICAgICAgICAgICAgXGxhYmVse2xlZ2FjeS11bml0LXRlc3RzfX0KIAogU29tZSB1c2VycyB3aWxsIGZpbmQgdGhhdCB0aGV5IGhhdmUgZXhpc3RpbmcgdGVzdCBjb2RlIHRoYXQgdGhleSB3b3VsZAotbGlrZSB0byBydW4gZnJvbSBQeVVuaXQsIHdpdGhvdXQgY29udmVydGluZyBldmVyeSBvbGQgdGVzdCBmdW5jdGlvbiB0bwotYSBcY2xhc3N7VGVzdENhc2V9IHN1YmNsYXNzLgorbGlrZSB0byBydW4gZnJvbSBcbW9kdWxle3VuaXR0ZXN0fSwgd2l0aG91dCBjb252ZXJ0aW5nIGV2ZXJ5IG9sZCB0ZXN0CitmdW5jdGlvbiB0byBhIFxjbGFzc3tUZXN0Q2FzZX0gc3ViY2xhc3MuCiAKLUZvciB0aGlzIHJlYXNvbiwgUHlVbml0IHByb3ZpZGVzIGEgXGNsYXNze0Z1bmN0aW9uVGVzdENhc2V9IGNsYXNzLgotVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7VGVzdENhc2V9IGNhbiBiZSB1c2VkIHRvIHdyYXAgYW4gZXhpc3RpbmcgdGVzdAotZnVuY3Rpb24uICBTZXQtdXAgYW5kIHRlYXItZG93biBmdW5jdGlvbnMgY2FuIGFsc28gb3B0aW9uYWxseSBiZQotd3JhcHBlZC4KK0ZvciB0aGlzIHJlYXNvbiwgXG1vZHVsZXt1bml0dGVzdH0gcHJvdmlkZXMgYSBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0KK2NsYXNzLiAgVGhpcyBzdWJjbGFzcyBvZiBcY2xhc3N7VGVzdENhc2V9IGNhbiBiZSB1c2VkIHRvIHdyYXAgYW4gZXhpc3RpbmcKK3Rlc3QgZnVuY3Rpb24uICBTZXQtdXAgYW5kIHRlYXItZG93biBmdW5jdGlvbnMgY2FuIGFsc28gYmUgcHJvdmlkZWQuCiAKIEdpdmVuIHRoZSBmb2xsb3dpbmcgdGVzdCBmdW5jdGlvbjoKIApAQCAtNDM2LDcgKzQzNSw4IEBACiBcZW5ke3ZlcmJhdGltfQogCiBJZiB0aGVyZSBhcmUgYWRkaXRpb25hbCBzZXQtdXAgYW5kIHRlYXItZG93biBtZXRob2RzIHRoYXQgc2hvdWxkIGJlCi1jYWxsZWQgYXMgcGFydCBvZiB0aGUgdGVzdCBjYXNlJ3Mgb3BlcmF0aW9uLCB0aGV5IGNhbiBhbHNvIGJlIHByb3ZpZGVkOgorY2FsbGVkIGFzIHBhcnQgb2YgdGhlIHRlc3QgY2FzZSdzIG9wZXJhdGlvbiwgdGhleSBjYW4gYWxzbyBiZSBwcm92aWRlZAorbGlrZSBzbzoKIAogXGJlZ2lue3ZlcmJhdGltfQogdGVzdGNhc2UgPSB1bml0dGVzdC5GdW5jdGlvblRlc3RDYXNlKHRlc3RTb21ldGhpbmcsCkBAIC00NDQsOSArNDQ0LDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhckRvd249ZGVsZXRlU29tZXRoaW5nREIpCiBcZW5ke3ZlcmJhdGltfQogCi1cbm90ZXtQeVVuaXQgc3VwcG9ydHMgdGhlIHVzZSBvZiBcZXhjZXB0aW9ue0Fzc2VydGlvbkVycm9yfQotYXMgYW4gaW5kaWNhdG9yIG9mIHRlc3QgZmFpbHVyZSwgYnV0IGRvZXMgbm90IHJlY29tbWVuZCBpdC4gIEZ1dHVyZQotdmVyc2lvbnMgbWF5IHRyZWF0IFxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9IGRpZmZlcmVudGx5Ln0KK1RvIG1ha2UgbWlncmF0aW5nIGV4aXN0aW5nIHRlc3Qgc3VpdGVzIGVhc2llciwgXG1vZHVsZXt1bml0dGVzdH0KK3N1cHBvcnRzIHRlc3RzIHJhaXNpbmcgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0gdG8gaW5kaWNhdGUgdGVzdCBmYWlsdXJlLgorSG93ZXZlciwgaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIHRoZSBleHBsaWNpdAorXG1ldGhvZHtUZXN0Q2FzZS5mYWlsKigpfSBhbmQgXG1ldGhvZHtUZXN0Q2FzZS5hc3NlcnQqKCl9IG1ldGhvZHMgaW5zdGVhZCwKK2FzIGZ1dHVyZSB2ZXJzaW9ucyBvZiBcbW9kdWxle3VuaXR0ZXN0fSBtYXkgdHJlYXQgXGV4Y2VwdGlvbntBc3NlcnRpb25FcnJvcn0KK2RpZmZlcmVudGx5LgorCitcbm90ZXtFdmVuIHRob3VnaCBcY2xhc3N7RnVuY3Rpb25UZXN0Q2FzZX0gY2FuIGJlIHVzZWQgdG8gcXVpY2tseSBjb252ZXJ0CithbiBleGlzdGluZyB0ZXN0IGJhc2Ugb3ZlciB0byBhIFxtb2R1bGV7dW5pdHRlc3R9LWJhc2VkIHN5c3RlbSwgdGhpcworYXBwcm9hY2ggaXMgbm90IHJlY29tbWVuZGVkLiAgVGFraW5nIHRoZSB0aW1lIHRvIHNldCB1cCBwcm9wZXIKK1xjbGFzc3tUZXN0Q2FzZX0gc3ViY2xhc3NlcyB3aWxsIG1ha2UgZnV0dXJlIHRlc3QgcmVmYWN0b3JpbmdzIGluZmluaXRlbHkKK2Vhc2llci59CisKIAogCiBcc3Vic2VjdGlvbntDbGFzc2VzIGFuZCBmdW5jdGlvbnMKQEAgLTQ1NCwxMSArNDY0LDEyIEBACiAKIFxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RDYXNlfXt9CiAgIEluc3RhbmNlcyBvZiB0aGUgXGNsYXNze1Rlc3RDYXNlfSBjbGFzcyByZXByZXNlbnQgdGhlIHNtYWxsZXN0Ci0gIHRlc3RhYmxlIHVuaXRzIGluIGEgc2V0IG9mIHRlc3RzLiAgVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkCi0gIGFzIGEgYmFzZSBjbGFzcywgd2l0aCBzcGVjaWZpYyB0ZXN0cyBiZWluZyBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZQotICBzdWJjbGFzc2VzLiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgbmVlZGVkIGJ5IHRoZSB0ZXN0Ci0gIHJ1bm5lciB0byBhbGxvdyBpdCB0byBkcml2ZSB0aGUgdGVzdCwgYW5kIG1ldGhvZHMgdGhhdCB0aGUgdGVzdCBjb2RlCi0gIGNhbiB1c2UgdG8gY2hlY2sgZm9yIGFuZCByZXBvcnQgdmFyaW91cyBraW5kcyBvZiBmYWlsdXJlcy4KKyAgdGVzdGFibGUgdW5pdHMgaW4gdGhlIFxtb2R1bGV7dW5pdHRlc3R9IHVuaXZlcnNlLiAgVGhpcyBjbGFzcyBpcworICBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcywgd2l0aCBzcGVjaWZpYyB0ZXN0cyBiZWluZworICBpbXBsZW1lbnRlZCBieSBjb25jcmV0ZSBzdWJjbGFzc2VzLiAgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZQorICBpbnRlcmZhY2UgbmVlZGVkIGJ5IHRoZSB0ZXN0IHJ1bm5lciB0byBhbGxvdyBpdCB0byBkcml2ZSB0aGUKKyAgdGVzdCwgYW5kIG1ldGhvZHMgdGhhdCB0aGUgdGVzdCBjb2RlIGNhbiB1c2UgdG8gY2hlY2sgZm9yIGFuZAorICByZXBvcnQgdmFyaW91cyBraW5kcyBvZiBmYWlsdXJlLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e0Z1bmN0aW9uVGVzdENhc2V9e3Rlc3RGdW5jXG9wdGlvbmFseywKQEAgLTQ3NCwzMyArNDg1LDMzIEBACiBcYmVnaW57Y2xhc3NkZXNjfXtUZXN0U3VpdGV9e1xvcHRpb25hbHt0ZXN0c319CiAgIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhZ2dyZWdhdGlvbiBvZiBpbmRpdmlkdWFsIHRlc3RzIGNhc2VzIGFuZAogICB0ZXN0IHN1aXRlcy4gIFRoZSBjbGFzcyBwcmVzZW50cyB0aGUgaW50ZXJmYWNlIG5lZWRlZCBieSB0aGUgdGVzdAotICBydW5uZXIgdG8gYWxsb3cgaXQgdG8gYmUgcnVuIGFzIGFueSBvdGhlciB0ZXN0IGNhc2UsIGJ1dCBhbGwgdGhlCi0gIGNvbnRhaW5lZCB0ZXN0cyBhbmQgdGVzdCBzdWl0ZXMgYXJlIGV4ZWN1dGVkLiAgQWRkaXRpb25hbCBtZXRob2RzCi0gIGFyZSBwcm92aWRlZCB0byBhZGQgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZSBhZ2dyZWdhdGlvbi4gIElmCi0gIFx2YXJ7dGVzdHN9IGlzIGdpdmVuLCBpdCBtdXN0IGJlIGEgc2VxdWVuY2Ugb2YgaW5kaXZpZHVhbCB0ZXN0cyB0aGF0Ci0gIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHN1aXRlLgorICBydW5uZXIgdG8gYWxsb3cgaXQgdG8gYmUgcnVuIGFzIGFueSBvdGhlciB0ZXN0IGNhc2UuICBSdW5uaW5nIGEKKyAgXGNsYXNze1Rlc3RTdWl0ZX0gaW5zdGFuY2UgaXMgdGhlIHNhbWUgYXMgaXRlcmF0aW5nIG92ZXIgdGhlIHN1aXRlLAorICBydW5uaW5nIGVhY2ggdGVzdCBpbmRpdmlkdWFsbHkuCisgIAorICBJZiBcdmFye3Rlc3RzfSBpcyBnaXZlbiwgaXQgbXVzdCBiZSBhbiBpdGVyYWJsZSBvZiBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgb3IKKyAgb3RoZXIgdGVzdCBzdWl0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYnVpbGQgdGhlIHN1aXRlIGluaXRpYWxseS4KKyAgQWRkaXRpb25hbCBtZXRob2RzIGFyZSBwcm92aWRlZCB0byBhZGQgdGVzdCBjYXNlcyBhbmQgc3VpdGVzIHRvIHRoZQorICBjb2xsZWN0aW9uIGxhdGVyIG9uLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntjbGFzc2Rlc2N9e1Rlc3RMb2FkZXJ9e30KICAgVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgbG9hZGluZyB0ZXN0cyBhY2NvcmRpbmcgdG8gdmFyaW91cwogICBjcml0ZXJpYSBhbmQgcmV0dXJuaW5nIHRoZW0gd3JhcHBlZCBpbiBhIFxjbGFzc3tUZXN0U3VpdGV9LgogICBJdCBjYW4gbG9hZCBhbGwgdGVzdHMgd2l0aGluIGEgZ2l2ZW4gbW9kdWxlIG9yIFxjbGFzc3tUZXN0Q2FzZX0KLSAgY2xhc3MuICBXaGVuIGxvYWRpbmcgZnJvbSBhIG1vZHVsZSwgaXQgY29uc2lkZXJzIGFsbAotICBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3Nlcy4gIEZvciBlYWNoIHN1Y2ggY2xhc3MsIGl0IGNyZWF0ZXMKLSAgYW4gaW5zdGFuY2UgZm9yIGVhY2ggbWV0aG9kIHdpdGggYSBuYW1lIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcKLSAgXHNhbXB7dGVzdH0uCisgIHN1YmNsYXNzLgogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntkYXRhZGVzY317ZGVmYXVsdFRlc3RMb2FkZXJ9Ci0gIEluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3Mgd2hpY2ggY2FuIGJlIHNoYXJlZC4gIElmIG5vCisgIEluc3RhbmNlIG9mIHRoZSBcY2xhc3N7VGVzdExvYWRlcn0gY2xhc3MgaW50ZW5kZWQgdG8gYmUgc2hhcmVkLiAgSWYgbm8KICAgY3VzdG9taXphdGlvbiBvZiB0aGUgXGNsYXNze1Rlc3RMb2FkZXJ9IGlzIG5lZWRlZCwgdGhpcyBpbnN0YW5jZSBjYW4KLSAgYWx3YXlzIGJlIHVzZWQgaW5zdGVhZCBvZiBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLgorICBiZSB1c2VkIGluc3RlYWQgb2YgcmVwZWF0ZWRseSBjcmVhdGluZyBuZXcgaW5zdGFuY2VzLgogXGVuZHtkYXRhZGVzY30KIAogXGJlZ2lue2NsYXNzZGVzY317VGV4dFRlc3RSdW5uZXJ9e1xvcHRpb25hbHtzdHJlYW1cb3B0aW9uYWx7LAogICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb25zXG9wdGlvbmFseywgdmVyYm9zaXR5fX19fQogICBBIGJhc2ljIHRlc3QgcnVubmVyIGltcGxlbWVudGF0aW9uIHdoaWNoIHByaW50cyByZXN1bHRzIG9uIHN0YW5kYXJkCi0gIG91dHB1dC4gIEl0IGhhcyBhIGZldyBjb25maWd1cmFibGUgcGFyYW1ldGVycywgYnV0IGlzIGVzc2VudGlhbGx5CisgIGVycm9yLiAgSXQgaGFzIGEgZmV3IGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzLCBidXQgaXMgZXNzZW50aWFsbHkKICAgdmVyeSBzaW1wbGUuICBHcmFwaGljYWwgYXBwbGljYXRpb25zIHdoaWNoIHJ1biB0ZXN0IHN1aXRlcyBzaG91bGQKICAgcHJvdmlkZSBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zLgogXGVuZHtjbGFzc2Rlc2N9CkBAIC01MTAsNyArNTIxLDggQEAKICAgICAgICAgICAgICAgICAgdGVzdFJ1bm5lclxvcHRpb25hbHssIHRlc3RSdW5uZXJ9fX19fX0KICAgQSBjb21tYW5kLWxpbmUgcHJvZ3JhbSB0aGF0IHJ1bnMgYSBzZXQgb2YgdGVzdHM7IHRoaXMgaXMgcHJpbWFyaWx5CiAgIGZvciBtYWtpbmcgdGVzdCBtb2R1bGVzIGNvbnZlbmllbnRseSBleGVjdXRhYmxlLiAgVGhlIHNpbXBsZXN0IHVzZQotICBmb3IgdGhpcyBmdW5jdGlvbiBpczoKKyAgZm9yIHRoaXMgZnVuY3Rpb24gaXMgdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nIGxpbmUgYXQgdGhlIGVuZCBvZiBhCisgIHRlc3Qgc2NyaXB0OgogCiBcYmVnaW57dmVyYmF0aW19CiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpAQCAtNTE4LDEwICs1MzAsMTEgQEAKIFxlbmR7dmVyYmF0aW19CiBcZW5ke2Z1bmNkZXNjfQogCi1JbiBzb21lIGNhc2VzLCB0aGUgZXhpc3RpbmcgdGVzdHMgbWF5IGhhdmUgYmUgd3JpdHRlbiB1c2luZyB0aGUKK0luIHNvbWUgY2FzZXMsIHRoZSBleGlzdGluZyB0ZXN0cyBtYXkgaGF2ZSBiZWVuIHdyaXR0ZW4gdXNpbmcgdGhlCiBccmVmbW9kdWxle2RvY3Rlc3R9IG1vZHVsZS4gIElmIHNvLCB0aGF0IG1vZHVsZSBwcm92aWRlcyBhIAogXGNsYXNze0RvY1Rlc3RTdWl0ZX0gY2xhc3MgdGhhdCBjYW4gYXV0b21hdGljYWxseSBidWlsZAotXGNsYXNze3VuaXR0ZXN0LlRlc3RTdWl0ZX0gaW5zdGFuY2VzIGZyb20gdGhlIGV4aXN0aW5nIHRlc3QgY29kZS4KK1xjbGFzc3t1bml0dGVzdC5UZXN0U3VpdGV9IGluc3RhbmNlcyBmcm9tIHRoZSBleGlzdGluZworXG1vZHVsZXtkb2N0ZXN0fS1iYXNlZCB0ZXN0cy4KIFx2ZXJzaW9uYWRkZWR7Mi4zfQogCiAKQEAgLTUzOCw3ICs1NTEsNyBAQAogY2hlY2sgY29uZGl0aW9ucyBhbmQgcmVwb3J0IGZhaWx1cmVzLCBhbmQgc29tZSBpbnF1aXJ5IG1ldGhvZHMKIGFsbG93aW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZXN0IGl0c2VsZiB0byBiZSBnYXRoZXJlZC4KIAotTWV0aG9kcyBpbiB0aGUgZmlyc3QgZ3JvdXAgYXJlOgorTWV0aG9kcyBpbiB0aGUgZmlyc3QgZ3JvdXAgKHJ1bm5pbmcgdGhlIHRlc3QpIGFyZToKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtzZXRVcH17fQogICBNZXRob2QgY2FsbGVkIHRvIHByZXBhcmUgdGhlIHRlc3QgZml4dHVyZS4gIFRoaXMgaXMgY2FsbGVkCkBAIC01NjIsOCArNTc1LDEwIEBACiAgIFJ1biB0aGUgdGVzdCwgY29sbGVjdGluZyB0aGUgcmVzdWx0IGludG8gdGhlIHRlc3QgcmVzdWx0IG9iamVjdAogICBwYXNzZWQgYXMgXHZhcntyZXN1bHR9LiAgSWYgXHZhcntyZXN1bHR9IGlzIG9taXR0ZWQgb3IgXGNvbnN0YW50e05vbmV9LAogICBhIHRlbXBvcmFyeSByZXN1bHQgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIHVzZWQsIGJ1dCBpcyBub3QgbWFkZQotICBhdmFpbGFibGUgdG8gdGhlIGNhbGxlci4gIFRoaXMgaXMgZXF1aXZhbGVudCB0byBzaW1wbHkgY2FsbGluZyB0aGUKLSAgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZS4KKyAgYXZhaWxhYmxlIHRvIHRoZSBjYWxsZXIuCisgIAorICBUaGUgc2FtZSBlZmZlY3QgbWF5IGJlIGhhZCBieSBzaW1wbHkgY2FsbGluZyB0aGUgXGNsYXNze1Rlc3RDYXNlfQorICBpbnN0YW5jZS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtkZWJ1Z317fQpAQCAtNjY0LDEwICs2NzksOCBAQAogaW5mb3JtYXRpb24gb24gdGhlIHRlc3Q6CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17Y291bnRUZXN0Q2FzZXN9e30KLSAgUmV0dXJuIHRoZSBudW1iZXIgb2YgdGVzdHMgcmVwcmVzZW50ZWQgYnkgdGhlIHRoaXMgdGVzdCBvYmplY3QuICBGb3IKLSAgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMsIHRoaXMgd2lsbCBhbHdheXMgYmUgXGNvZGV7MX0sIGJ1dCB0aGlzCi0gIG1ldGhvZCBpcyBhbHNvIGltcGxlbWVudGVkIGJ5IHRoZSBcY2xhc3N7VGVzdFN1aXRlfSBjbGFzcywgd2hpY2ggY2FuCi0gIHJldHVybiBsYXJnZXIgdmFsdWVzLgorICBSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGlzIHRlc3Qgb2JqZWN0LiAgRm9yCisgIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIFxjb2RlezF9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdENhc2Vde2RlZmF1bHRUZXN0UmVzdWx0fXt9CkBAIC02NzgsNyArNjkxLDcgQEAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0Q2FzZV17aWR9e30KICAgUmV0dXJuIGEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBzcGVjaWZpYyB0ZXN0IGNhc2UuICBUaGlzIGlzIHVzdWFsbHkKICAgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgdGVzdCBtZXRob2QsIGluY2x1ZGluZyB0aGUgbW9kdWxlIGFuZCBjbGFzcwotICBuYW1lcy4KKyAgbmFtZS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RDYXNlXXtzaG9ydERlc2NyaXB0aW9ufXt9CkBAIC02OTQsMjEgKzcwNywyMyBAQAogCiBcY2xhc3N7VGVzdFN1aXRlfSBvYmplY3RzIGJlaGF2ZSBtdWNoIGxpa2UgXGNsYXNze1Rlc3RDYXNlfSBvYmplY3RzLAogZXhjZXB0IHRoZXkgZG8gbm90IGFjdHVhbGx5IGltcGxlbWVudCBhIHRlc3QuICBJbnN0ZWFkLCB0aGV5IGFyZSB1c2VkCi10byBhZ2dyZWdhdGUgdGVzdHMgaW50byBncm91cHMgdGhhdCBzaG91bGQgYmUgcnVuIHRvZ2V0aGVyLiAgU29tZQotYWRkaXRpb25hbCBtZXRob2RzIGFyZSBhdmFpbGFibGUgdG8gYWRkIHRlc3RzIHRvIFxjbGFzc3tUZXN0U3VpdGV9Cit0byBhZ2dyZWdhdGUgdGVzdHMgaW50byBncm91cHMgb2YgdGVzdHMgdGhhdCBzaG91bGQgYmUgcnVuIHRvZ2V0aGVyLgorU29tZSBhZGRpdGlvbmFsIG1ldGhvZHMgYXJlIGF2YWlsYWJsZSB0byBhZGQgdGVzdHMgdG8gXGNsYXNze1Rlc3RTdWl0ZX0KIGluc3RhbmNlczoKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17YWRkVGVzdH17dGVzdH0KLSAgQWRkIGEgXGNsYXNze1Rlc3RDYXNlfSBvciBcY2xhc3N7VGVzdFN1aXRlfSB0byB0aGUgc2V0IG9mIHRlc3RzIHRoYXQKLSAgbWFrZSB1cCB0aGUgc3VpdGUuCisgIEFkZCBhIFxjbGFzc3tUZXN0Q2FzZX0gb3IgXGNsYXNze1Rlc3RTdWl0ZX0gdG8gdGhlIHN1aXRlLgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXthZGRUZXN0c317dGVzdHN9Ci0gIEFkZCBhbGwgdGhlIHRlc3RzIGZyb20gYSBzZXF1ZW5jZSBvZiBcY2xhc3N7VGVzdENhc2V9IGFuZAorICBBZGQgYWxsIHRoZSB0ZXN0cyBmcm9tIGFuIGl0ZXJhYmxlIG9mIFxjbGFzc3tUZXN0Q2FzZX0gYW5kCiAgIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlcyB0byB0aGlzIHRlc3Qgc3VpdGUuCisgIAorICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gaXRlcmF0aW5nIG92ZXIgXHZhcnt0ZXN0c30sIGNhbGxpbmcKKyAgXG1ldGhvZHthZGRUZXN0KCl9IGZvciBlYWNoIGVsZW1lbnQuCiBcZW5ke21ldGhvZGRlc2N9CiAKLVRoZSBcbWV0aG9ke3J1bigpfSBtZXRob2QgaXMgYWxzbyBzbGlnaHRseSBkaWZmZXJlbnQ6CitcY2xhc3N7VGVzdFN1aXRlfSBzaGFyZXMgdGhlIGZvbGxvd2luZyBtZXRob2RzIHdpdGggXGNsYXNze1Rlc3RDYXNlfToKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RTdWl0ZV17cnVufXtyZXN1bHR9CiAgIFJ1biB0aGUgdGVzdHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3VpdGUsIGNvbGxlY3RpbmcgdGhlIHJlc3VsdCBpbnRvCkBAIC03MTcsNiArNzMyLDE3IEBACiAgIHJlc3VsdCBvYmplY3QgdG8gYmUgcGFzc2VkIGluLgogXGVuZHttZXRob2RkZXNjfQogCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXtkZWJ1Z317fQorICBSdW4gdGhlIHRlc3RzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN1aXRlIHdpdGhvdXQgY29sbGVjdGluZyB0aGUgcmVzdWx0LgorICBUaGlzIGFsbG93cyBleGNlcHRpb25zIHJhaXNlZCBieSB0aGUgdGVzdCB0byBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjYWxsZXIKKyAgYW5kIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgcnVubmluZyB0ZXN0cyB1bmRlciBhIGRlYnVnZ2VyLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFN1aXRlXXtjb3VudFRlc3RDYXNlc317fQorICBSZXR1cm4gdGhlIG51bWJlciBvZiB0ZXN0cyByZXByZXNlbnRlZCBieSB0aGlzIHRlc3Qgb2JqZWN0LCBpbmNsdWRpbmcKKyAgYWxsIGluZGl2aWR1YWwgdGVzdHMgYW5kIHN1Yi1zdWl0ZXMuCitcZW5ke21ldGhvZGRlc2N9CisKIEluIHRoZSB0eXBpY2FsIHVzYWdlIG9mIGEgXGNsYXNze1Rlc3RTdWl0ZX0gb2JqZWN0LCB0aGUgXG1ldGhvZHtydW4oKX0KIG1ldGhvZCBpcyBpbnZva2VkIGJ5IGEgXGNsYXNze1Rlc3RSdW5uZXJ9IHJhdGhlciB0aGFuIGJ5IHRoZSBlbmQtdXNlcgogdGVzdCBoYXJuZXNzLgpAQCAtNzI3LDcgKzc1Myw3IEBACiAKIEEgXGNsYXNze1Rlc3RSZXN1bHR9IG9iamVjdCBzdG9yZXMgdGhlIHJlc3VsdHMgb2YgYSBzZXQgb2YgdGVzdHMuICBUaGUKIFxjbGFzc3tUZXN0Q2FzZX0gYW5kIFxjbGFzc3tUZXN0U3VpdGV9IGNsYXNzZXMgZW5zdXJlIHRoYXQgcmVzdWx0cyBhcmUKLXByb3Blcmx5IHN0b3JlZDsgdGVzdCBhdXRob3JzIGRvIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IHJlY29yZGluZyB0aGUKK3Byb3Blcmx5IHJlY29yZGVkOyB0ZXN0IGF1dGhvcnMgZG8gbm90IG5lZWQgdG8gd29ycnkgYWJvdXQgcmVjb3JkaW5nIHRoZQogb3V0Y29tZSBvZiB0ZXN0cy4KIAogVGVzdGluZyBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBccmVmbW9kdWxle3VuaXR0ZXN0fSBtYXkgd2FudApAQCAtNzQ1LDI4ICs3NzEsNDEgQEAKIGJlIG9mIGludGVyZXN0IHdoZW4gaW5zcGVjdGluZyB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGEgc2V0IG9mIHRlc3RzOgogCiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdFJlc3VsdF17ZXJyb3JzfQotICBBIGxpc3QgY29udGFpbmluZyBwYWlycyBvZiBcY2xhc3N7VGVzdENhc2V9IGluc3RhbmNlcyBhbmQgdGhlCi0gIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGZvciB0ZXN0cyB3aGljaCByYWlzZWQgYW4gZXhjZXB0aW9uIGJ1dCBkaWQgbm90Ci0gIHNpZ25hbCBhIHRlc3QgZmFpbHVyZS4KKyAgQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMgYW5kCisgIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoaWNoIHJhaXNlZCBhbgorICB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KICAgXHZlcnNpb25jaGFuZ2VkW0NvbnRhaW5zIGZvcm1hdHRlZCB0cmFjZWJhY2tzIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgIFxmdW5jdGlvbntzeXMuZXhjX2luZm8oKX0gcmVzdWx0c117Mi4yfQogXGVuZHttZW1iZXJkZXNjfQogCiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdFJlc3VsdF17ZmFpbHVyZXN9Ci0gIEEgbGlzdCBjb250YWluaW5nIHBhaXJzIG9mIFxjbGFzc3tUZXN0Q2FzZX0gaW5zdGFuY2VzIGFuZCB0aGUKLSAgZm9ybWF0dGVkIHRyYWNlYmFja3MgZm9yIHRlc3RzIHdoaWNoIHNpZ25hbGxlZCBhIGZhaWx1cmUgaW4gdGhlIGNvZGUKLSAgdW5kZXIgdGVzdC4KKyAgQSBsaXN0IGNvbnRhaW5pbmcgMi10dXBsZXMgb2YgXGNsYXNze1Rlc3RDYXNlfSBpbnN0YW5jZXMgYW5kCisgIGZvcm1hdHRlZCB0cmFjZWJhY2tzLiBFYWNoIHR1cGxlIHJlcHJlc2VudHMgYSB0ZXN0IHdoZXJlIGEgZmFpbHVyZQorICB3YXMgZXhwbGljaXRseSBzaWduYWxsZWQgdXNpbmcgdGhlIFxtZXRob2R7VGVzdENhc2UuZmFpbCooKX0gb3IKKyAgXG1ldGhvZHtUZXN0Q2FzZS5hc3NlcnQqKCl9IG1ldGhvZHMuCiAgIFx2ZXJzaW9uY2hhbmdlZFtDb250YWlucyBmb3JtYXR0ZWQgdHJhY2ViYWNrcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9IHJlc3VsdHNdezIuMn0KIFxlbmR7bWVtYmVyZGVzY30KIAogXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RSZXN1bHRde3Rlc3RzUnVufQotICBUaGUgbnVtYmVyIG9mIHRlc3RzIHdoaWNoIGhhdmUgYmVlbiBzdGFydGVkLgorICBUaGUgdG90YWwgbnVtYmVyIG9mIHRlc3RzIHJ1biBzbyBmYXIuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0UmVzdWx0XXt3YXNTdWNjZXNzZnVsfXt9Ci0gIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGVzdHMgcnVuIHNvIGZhciBoYXZlIHBhc3NlZCwgb3RoZXJ3aXNlIHJldHVybnMKLSAgZmFsc2UuCisgIFJldHVybnMgXGNvbnN0YW50e1RydWV9IGlmIGFsbCB0ZXN0cyBydW4gc28gZmFyIGhhdmUgcGFzc2VkLAorICBvdGhlcndpc2UgcmV0dXJucyBcY29uc3RhbnR7RmFsc2V9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17c3RvcH17fQorICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXQgb2YgdGVzdHMgYmVpbmcgcnVuCisgIHNob3VsZCBiZSBhYm9ydGVkIGJ5IHNldHRpbmcgdGhlIFxjbGFzc3tUZXN0UmVzdWx0fSdzIFxjb2Rle3Nob3VsZFN0b3B9CisgIGF0dHJpYnV0ZSB0byBcY29uc3RhbnR7VHJ1ZX0uICBcY2xhc3N7VGVzdFJ1bm5lcn0gb2JqZWN0cyBzaG91bGQgcmVzcGVjdAorICB0aGlzIGZsYWcgYW5kIHJldHVybiB3aXRob3V0IHJ1bm5pbmcgYW55IGFkZGl0aW9uYWwgdGVzdHMuCisgIAorICBGb3IgZXhhbXBsZSwgdGhpcyBmZWF0dXJlIGlzIHVzZWQgYnkgdGhlIFxjbGFzc3tUZXh0VGVzdFJ1bm5lcn0gY2xhc3MKKyAgdG8gc3RvcCB0aGUgdGVzdCBmcmFtZXdvcmsgd2hlbiB0aGUgdXNlciBzaWduYWxzIGFuIGludGVycnVwdCBmcm9tCisgIHRoZSBrZXlib2FyZC4gIEludGVyYWN0aXZlIHRvb2xzIHdoaWNoIHByb3ZpZGUgXGNsYXNze1Rlc3RSdW5uZXJ9CisgIGltcGxlbWVudGF0aW9ucyBjYW4gdXNlIHRoaXMgaW4gYSBzaW1pbGFyIG1hbm5lci4KIFxlbmR7bWV0aG9kZGVzY30KIAogCkBAIC03ODYsMTAgKzgyNSw5IEBACiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0UmVzdWx0XXthZGRFcnJvcn17dGVzdCwgZXJyfQotICBDYWxsZWQgd2hlbiB0aGUgdGVzdCBjYXNlIFx2YXJ7dGVzdH0gcmFpc2VzIGFuIGV4Y2VwdGlvbiB3aXRob3V0Ci0gIHNpZ25hbGxpbmcgYSB0ZXN0IGZhaWx1cmUuICBcdmFye2Vycn0gaXMgYSB0dXBsZSBvZiB0aGUgZm9ybQotICByZXR1cm5lZCBieSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9OiAgXGNvZGV7KFx2YXJ7dHlwZX0sCi0gIFx2YXJ7dmFsdWV9LCBcdmFye3RyYWNlYmFja30pfS4KKyAgQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSBcdmFye3Rlc3R9IHJhaXNlcyBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbgorICBcdmFye2Vycn0gaXMgYSB0dXBsZSBvZiB0aGUgZm9ybSByZXR1cm5lZCBieSBcZnVuY3Rpb257c3lzLmV4Y19pbmZvKCl9OgorICBcY29kZXsoXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17YWRkRmFpbHVyZX17dGVzdCwgZXJyfQpAQCAtODAwLDIzICs4MzgsMTAgQEAKIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RSZXN1bHRde2FkZFN1Y2Nlc3N9e3Rlc3R9Ci0gIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgYSB0ZXN0IHRoYXQgZG9lcyBub3QgZmFpbDsgXHZhcnt0ZXN0fSBpcwotICB0aGUgdGVzdCBjYXNlIG9iamVjdC4KKyAgQ2FsbGVkIHdoZW4gdGhlIHRlc3QgY2FzZSBcdmFye3Rlc3R9IHN1Y2NlZWRzLgogXGVuZHttZXRob2RkZXNjfQogCiAKLU9uZSBhZGRpdGlvbmFsIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIFxjbGFzc3tUZXN0UmVzdWx0fSBvYmplY3RzOgotCi1cYmVnaW57bWV0aG9kZGVzY31bVGVzdFJlc3VsdF17c3RvcH17fQotICBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIHNpZ25hbCB0aGF0IHRoZSBzZXQgb2YgdGVzdHMgYmVpbmcgcnVuCi0gIHNob3VsZCBiZSBhYm9ydGVkLiAgT25jZSB0aGlzIGhhcyBiZWVuIGNhbGxlZCwgdGhlCi0gIFxjbGFzc3tUZXN0UnVubmVyfSBvYmplY3QgcmV0dXJuIHRvIGl0cyBjYWxsZXIgd2l0aG91dCBydW5uaW5nIGFueQotICBhZGRpdGlvbmFsIHRlc3RzLiAgVGhpcyBpcyB1c2VkIGJ5IHRoZSBcY2xhc3N7VGV4dFRlc3RSdW5uZXJ9IGNsYXNzCi0gIHRvIHN0b3AgdGhlIHRlc3QgZnJhbWV3b3JrIHdoZW4gdGhlIHVzZXIgc2lnbmFscyBhbiBpbnRlcnJ1cHQgZnJvbQotICB0aGUga2V5Ym9hcmQuICBJbnRlcmFjdGl2ZSB0b29scyB3aGljaCBwcm92aWRlIHJ1bm5lcnMgY2FuIHVzZSB0aGlzCi0gIGluIGEgc2ltaWxhciBtYW5uZXIuCi1cZW5ke21ldGhvZGRlc2N9Ci0KIAogXHN1YnNlY3Rpb257VGVzdExvYWRlciBPYmplY3RzCiAgICAgICAgICAgICBcbGFiZWx7dGVzdGxvYWRlci1vYmplY3RzfX0KQEAgLTgyNCwxNSArODQ5LDE1IEBACiBUaGUgXGNsYXNze1Rlc3RMb2FkZXJ9IGNsYXNzIGlzIHVzZWQgdG8gY3JlYXRlIHRlc3Qgc3VpdGVzIGZyb20KIGNsYXNzZXMgYW5kIG1vZHVsZXMuICBOb3JtYWxseSwgdGhlcmUgaXMgbm8gbmVlZCB0byBjcmVhdGUgYW4gaW5zdGFuY2UKIG9mIHRoaXMgY2xhc3M7IHRoZSBccmVmbW9kdWxle3VuaXR0ZXN0fSBtb2R1bGUgcHJvdmlkZXMgYW4gaW5zdGFuY2UKLXRoYXQgY2FuIGJlIHNoYXJlZCBhcyB0aGUgXGNvZGV7ZGVmYXVsdFRlc3RMb2FkZXJ9IG1vZHVsZSBhdHRyaWJ1dGUuCi1Vc2luZyBhIHN1YmNsYXNzIG9yIGluc3RhbmNlIHdvdWxkIGFsbG93IGN1c3RvbWl6YXRpb24gb2Ygc29tZQordGhhdCBjYW4gYmUgc2hhcmVkIGFzIFxjb2Rle3VuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyfS4KK1VzaW5nIGEgc3ViY2xhc3Mgb3IgaW5zdGFuY2UsIGhvd2V2ZXIsIGFsbG93cyBjdXN0b21pemF0aW9uIG9mIHNvbWUKIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzLgogCiBcY2xhc3N7VGVzdExvYWRlcn0gb2JqZWN0cyBoYXZlIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21UZXN0Q2FzZX17dGVzdENhc2VDbGFzc30KICAgUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUKLSAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIGNsYXNzIFxjbGFzc3t0ZXN0Q2FzZUNsYXNzfS4KKyAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIFxjbGFzc3t0ZXN0Q2FzZUNsYXNzfS4KIFxlbmR7bWV0aG9kZGVzY30KIAogXGJlZ2lue21ldGhvZGRlc2N9W1Rlc3RMb2FkZXJde2xvYWRUZXN0c0Zyb21Nb2R1bGV9e21vZHVsZX0KQEAgLTg0Miw3ICs4NjcsNyBAQAogICBtZXRob2QgZGVmaW5lZCBmb3IgdGhlIGNsYXNzLgogCiAgIFx3YXJuaW5ne1doaWxlIHVzaW5nIGEgaGllcmFyY2h5IG9mCi0gIFxjbGFzc3tUZXN0Y2FzZX0tZGVyaXZlZCBjbGFzc2VzIGNhbiBiZSBjb252ZW5pZW50IGluIHNoYXJpbmcKKyAgXGNsYXNze1Rlc3RDYXNlfS1kZXJpdmVkIGNsYXNzZXMgY2FuIGJlIGNvbnZlbmllbnQgaW4gc2hhcmluZwogICBmaXh0dXJlcyBhbmQgaGVscGVyIGZ1bmN0aW9ucywgZGVmaW5pbmcgdGVzdCBtZXRob2RzIG9uIGJhc2UgY2xhc3NlcwogICB0aGF0IGFyZSBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IGRvZXMgbm90IHBsYXkgd2VsbAogICB3aXRoIHRoaXMgbWV0aG9kLiAgRG9pbmcgc28sIGhvd2V2ZXIsIGNhbiBiZSB1c2VmdWwgd2hlbiB0aGUKQEAgLTg1MywyMSArODc4LDIzIEBACiAgIFJldHVybiBhIHN1aXRlIG9mIGFsbCB0ZXN0cyBjYXNlcyBnaXZlbiBhIHN0cmluZyBzcGVjaWZpZXIuCiAKICAgVGhlIHNwZWNpZmllciBcdmFye25hbWV9IGlzIGEgYGBkb3R0ZWQgbmFtZScnIHRoYXQgbWF5IHJlc29sdmUKLSAgZWl0aGVyIHRvIGEgbW9kdWxlLCBhIHRlc3QgY2FzZSBjbGFzcywgYSB0ZXN0IG1ldGhvZCB3aXRoaW4gYSB0ZXN0Ci0gIGNhc2UgY2xhc3MsIG9yIGEgY2FsbGFibGUgb2JqZWN0IHdoaWNoIHJldHVybnMgYSBcY2xhc3N7VGVzdENhc2V9IG9yCi0gIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbW9kdWxlCi0gIFxtb2R1bGV7U2FtcGxlVGVzdHN9IGNvbnRhaW5pbmcgYSBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3MKLSAgXGNsYXNze1NhbXBsZVRlc3RDYXNlfSB3aXRoIHRocmVlIHRlc3QgbWV0aG9kcyAoXG1ldGhvZHt0ZXN0X29uZSgpfSwKLSAgXG1ldGhvZHt0ZXN0X3R3bygpfSwgYW5kIFxtZXRob2R7dGVzdF90aHJlZSgpfSksIHRoZSBzcGVjaWZpZXIKLSAgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlJ30gd291bGQgY2F1c2UgdGhpcyBtZXRob2QgdG8KLSAgcmV0dXJuIGEgc3VpdGUgd2hpY2ggd2lsbCBydW4gYWxsIHRocmVlIHRlc3QgbWV0aG9kcy4gIFVzaW5nIHRoZQotICBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlLnRlc3RfdHdvJ30gd291bGQgY2F1c2UKLSAgaXQgdG8gcmV0dXJuIGEgdGVzdCBzdWl0ZSB3aGljaCB3aWxsIHJ1biBvbmx5IHRoZQorICBlaXRoZXIgdG8gYSBtb2R1bGUsIGEgdGVzdCBjYXNlIGNsYXNzLCBhIFxjbGFzc3tUZXN0U3VpdGV9IGluc3RhbmNlLAorICBhIHRlc3QgbWV0aG9kIHdpdGhpbiBhIHRlc3QgY2FzZSBjbGFzcywgb3IgYSBjYWxsYWJsZSBvYmplY3Qgd2hpY2gKKyAgcmV0dXJucyBhIFxjbGFzc3tUZXN0Q2FzZX0gb3IgXGNsYXNze1Rlc3RTdWl0ZX0gaW5zdGFuY2UuCisKKyAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgbW9kdWxlIFxtb2R1bGV7U2FtcGxlVGVzdHN9IGNvbnRhaW5pbmcgYQorICBcY2xhc3N7VGVzdENhc2V9LWRlcml2ZWQgY2xhc3MgXGNsYXNze1NhbXBsZVRlc3RDYXNlfSB3aXRoIHRocmVlIHRlc3QKKyAgbWV0aG9kcyAoXG1ldGhvZHt0ZXN0X29uZSgpfSwgXG1ldGhvZHt0ZXN0X3R3bygpfSwgYW5kCisgIFxtZXRob2R7dGVzdF90aHJlZSgpfSksIHRoZSBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlJ30KKyAgd291bGQgY2F1c2UgdGhpcyBtZXRob2QgdG8gcmV0dXJuIGEgc3VpdGUgd2hpY2ggd2lsbCBydW4gYWxsIHRocmVlIHRlc3QKKyAgbWV0aG9kcy4gIFVzaW5nIHRoZSBzcGVjaWZpZXIgXGNvZGV7J1NhbXBsZVRlc3RzLlNhbXBsZVRlc3RDYXNlLnRlc3RfdHdvJ30KKyAgd291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGEgdGVzdCBzdWl0ZSB3aGljaCB3aWxsIHJ1biBvbmx5IHRoZQogICBcbWV0aG9ke3Rlc3RfdHdvKCl9IHRlc3QgbWV0aG9kLiAgVGhlIHNwZWNpZmllciBjYW4gcmVmZXIgdG8gbW9kdWxlcwogICBhbmQgcGFja2FnZXMgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbXBvcnRlZDsgdGhleSB3aWxsIGJlIGltcG9ydGVkIGFzCiAgIGEgc2lkZS1lZmZlY3QuCiAKLSAgVGhlIG1ldGhvZCBvcHRpb25hbGx5IHJlc29sdmVzIFx2YXJ7bmFtZX0gcmVsYXRpdmUgdG8gYSBnaXZlbiBtb2R1bGUuCisgIFRoZSBtZXRob2Qgb3B0aW9uYWxseSByZXNvbHZlcyBcdmFye25hbWV9IHJlbGF0aXZlIHRvIHRoZSBnaXZlbgorICBcdmFye21vZHVsZX0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtUZXN0TG9hZGVyXXtsb2FkVGVzdHNGcm9tTmFtZXN9e25hbWVzXG9wdGlvbmFseywgbW9kdWxlfX0KQEAgLTg4OCwxNyArOTE1LDIyIEBACiBcYmVnaW57bWVtYmVyZGVzY31bVGVzdExvYWRlcl17dGVzdE1ldGhvZFByZWZpeH0KICAgU3RyaW5nIGdpdmluZyB0aGUgcHJlZml4IG9mIG1ldGhvZCBuYW1lcyB3aGljaCB3aWxsIGJlIGludGVycHJldGVkCiAgIGFzIHRlc3QgbWV0aG9kcy4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIFxjb2Rleyd0ZXN0J30uCisgIAorICBUaGlzIGFmZmVjdHMgXG1ldGhvZHtnZXRUZXN0Q2FzZU5hbWVzKCl9IGFuZCBhbGwgdGhlCisgIFxtZXRob2R7bG9hZFRlc3RzRnJvbSooKX0gbWV0aG9kcy4KIFxlbmR7bWVtYmVyZGVzY30KIAogXGJlZ2lue21lbWJlcmRlc2N9W1Rlc3RMb2FkZXJde3NvcnRUZXN0TWV0aG9kc1VzaW5nfQogICBGdW5jdGlvbiB0byBiZSB1c2VkIHRvIGNvbXBhcmUgbWV0aG9kIG5hbWVzIHdoZW4gc29ydGluZyB0aGVtIGluCi0gIFxtZXRob2R7Z2V0VGVzdENhc2VOYW1lcygpfS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBidWlsdC1pbgotICBcZnVuY3Rpb257Y21wKCl9IGZ1bmN0aW9uOyBpdCBjYW4gYmUgc2V0IHRvIFxjb25zdGFudHtOb25lfSB0byBkaXNhYmxlCi0gIHRoZSBzb3J0LgorICBcbWV0aG9ke2dldFRlc3RDYXNlTmFtZXMoKX0gYW5kIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgorICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgYnVpbHQtaW4gXGZ1bmN0aW9ue2NtcCgpfSBmdW5jdGlvbjsgdGhlIGF0dHJpYnV0ZQorICBjYW4gYWxzbyBiZSBzZXQgdG8gXGNvbnN0YW50e05vbmV9IHRvIGRpc2FibGUgdGhlIHNvcnQuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfVtUZXN0TG9hZGVyXXtzdWl0ZUNsYXNzfQogICBDYWxsYWJsZSBvYmplY3QgdGhhdCBjb25zdHJ1Y3RzIGEgdGVzdCBzdWl0ZSBmcm9tIGEgbGlzdCBvZiB0ZXN0cy4KICAgTm8gbWV0aG9kcyBvbiB0aGUgcmVzdWx0aW5nIG9iamVjdCBhcmUgbmVlZGVkLiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMKICAgdGhlIFxjbGFzc3tUZXN0U3VpdGV9IGNsYXNzLgorICAKKyAgVGhpcyBhZmZlY3RzIGFsbCB0aGUgXG1ldGhvZHtsb2FkVGVzdHNGcm9tKigpfSBtZXRob2RzLgogXGVuZHttZW1iZXJkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ1cmxsaWIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIudGV4CmluZGV4IDBhODRjMWEuLjc1ZWUzMTAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlidXJsbGliLnRleAorKysgYi9Eb2MvbGliL2xpYnVybGxpYi50ZXgKQEAgLTI3MCwxMCArMjcwLDEwIEBACiBlbnZpcm9ubWVudGFsIHByb3h5IHNldHRpbmdzIHdpbGwgYmUgdXNlZCBpZiBwcmVzZW50LCBhcyBkaXNjdXNzZWQgaW4KIHRoZSBkZWZpbml0aW9uIG9mIFxmdW5jdGlvbnt1cmxvcGVuKCl9LCBhYm92ZS4KIAotQWRkaXRpb25hbCBrZXl3b3JkIHBhcmFtZXRlcnMsIGNvbGxlY3RlZCBpbiBcdmFye3g1MDl9LCBhcmUgdXNlZCBmb3IKLWF1dGhlbnRpY2F0aW9uIHdpdGggdGhlIFxmaWxle2h0dHBzOn0gc2NoZW1lLiAgVGhlIGtleXdvcmRzCi1cdmFye2tleV9maWxlfSBhbmQgXHZhcntjZXJ0X2ZpbGV9IGFyZSBzdXBwb3J0ZWQ7IGJvdGggYXJlIG5lZWRlZCB0bwotYWN0dWFsbHkgcmV0cmlldmUgYSByZXNvdXJjZSBhdCBhbiBcZmlsZXtodHRwczp9IFVSTC4KK0FkZGl0aW9uYWwga2V5d29yZCBwYXJhbWV0ZXJzLCBjb2xsZWN0ZWQgaW4gXHZhcnt4NTA5fSwgbWF5IGJlIHVzZWQgZm9yCithdXRoZW50aWNhdGlvbiBvZiB0aGUgY2xpZW50IHdoZW4gdXNpbmcgdGhlIFxmaWxle2h0dHBzOn0gc2NoZW1lLiAgVGhlIGtleXdvcmRzCitcdmFye2tleV9maWxlfSBhbmQgXHZhcntjZXJ0X2ZpbGV9IGFyZSBzdXBwb3J0ZWQgdG8gcHJvdmlkZSBhbiAKK1NTTCBrZXkgYW5kIGNlcnRpZmljYXRlOyBib3RoIGFyZSBuZWVkZWQgdG8gc3VwcG9ydCBjbGllbnQgYXV0aGVudGljYXRpb24uCiAKIFxjbGFzc3tVUkxvcGVuZXJ9IG9iamVjdHMgd2lsbCByYWlzZSBhbiBcZXhjZXB0aW9ue0lPRXJyb3J9IGV4Y2VwdGlvbgogaWYgdGhlIHNlcnZlciByZXR1cm5zIGFuIGVycm9yIGNvZGUuCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4IGIvRG9jL2xpYi9saWJ1cmxsaWIyLnRleAppbmRleCBmNDM1MWMzLi41NDJhN2I4IDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnVybGxpYjIudGV4CisrKyBiL0RvYy9saWIvbGlidXJsbGliMi50ZXgKQEAgLTE5LDcgKzE5LDggQEAKIG9iamVjdC4KIAogXHZhcntkYXRhfSBtYXkgYmUgYSBzdHJpbmcgc3BlY2lmeWluZyBhZGRpdGlvbmFsIGRhdGEgdG8gc2VuZCB0byB0aGUKLXNlcnZlci4gQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKK3NlcnZlciwgb3IgXGNvZGV7Tm9uZX0gaWYgbm8gc3VjaCBkYXRhIGlzIG5lZWRlZC4gCitDdXJyZW50bHkgSFRUUCByZXF1ZXN0cyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHVzZSBcdmFye2RhdGF9OwogdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIGEgUE9TVCBpbnN0ZWFkIG9mIGEgR0VUIHdoZW4gdGhlIFx2YXJ7ZGF0YX0KIHBhcmFtZXRlciBpcyBwcm92aWRlZC4gIFx2YXJ7ZGF0YX0gc2hvdWxkIGJlIGEgYnVmZmVyIGluIHRoZSBzdGFuZGFyZAogXG1pbWV0eXBle2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZH0gZm9ybWF0LiAgVGhlCkBAIC05Nyw4ICs5OCwxNyBAQAogICAgIFxvcHRpb25hbHssIG9yaWdpbl9yZXFfaG9zdH1cb3B0aW9uYWx7LCB1bnZlcmlmaWFibGV9fQogVGhpcyBjbGFzcyBpcyBhbiBhYnN0cmFjdGlvbiBvZiBhIFVSTCByZXF1ZXN0LgogCi1cdmFye3VybH0gc2hvdWxkIGJlIGEgc3RyaW5nIHdoaWNoIGlzIGEgdmFsaWQgVVJMLiAgRm9yIGEgZGVzY3JpcHRpb24KLW9mIFx2YXJ7ZGF0YX0gc2VlIHRoZSBcbWV0aG9ke2FkZF9kYXRhKCl9IGRlc2NyaXB0aW9uLgorXHZhcnt1cmx9IHNob3VsZCBiZSBhIHN0cmluZyBjb250YWluaW5nIGEgdmFsaWQgVVJMLiAgCisKK1x2YXJ7ZGF0YX0gbWF5IGJlIGEgc3RyaW5nIHNwZWNpZnlpbmcgYWRkaXRpb25hbCBkYXRhIHRvIHNlbmQgdG8gdGhlCitzZXJ2ZXIsIG9yIFxjb2Rle05vbmV9IGlmIG5vIHN1Y2ggZGF0YSBpcyBuZWVkZWQuIAorQ3VycmVudGx5IEhUVFAgcmVxdWVzdHMgYXJlIHRoZSBvbmx5IG9uZXMgdGhhdCB1c2UgXHZhcntkYXRhfTsKK3RoZSBIVFRQIHJlcXVlc3Qgd2lsbCBiZSBhIFBPU1QgaW5zdGVhZCBvZiBhIEdFVCB3aGVuIHRoZSBcdmFye2RhdGF9CitwYXJhbWV0ZXIgaXMgcHJvdmlkZWQuICBcdmFye2RhdGF9IHNob3VsZCBiZSBhIGJ1ZmZlciBpbiB0aGUgc3RhbmRhcmQKK1xtaW1ldHlwZXthcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9IGZvcm1hdC4gIFRoZQorXGZ1bmN0aW9ue3VybGxpYi51cmxlbmNvZGUoKX0gZnVuY3Rpb24gdGFrZXMgYSBtYXBwaW5nIG9yIHNlcXVlbmNlIG9mCisyLXR1cGxlcyBhbmQgcmV0dXJucyBhIHN0cmluZyBpbiB0aGlzIGZvcm1hdC4KKwogXHZhcntoZWFkZXJzfSBzaG91bGQgYmUgYSBkaWN0aW9uYXJ5LCBhbmQgd2lsbCBiZSB0cmVhdGVkIGFzIGlmCiBcbWV0aG9ke2FkZF9oZWFkZXIoKX0gd2FzIGNhbGxlZCB3aXRoIGVhY2gga2V5IGFuZCB2YWx1ZSBhcyBhcmd1bWVudHMuCiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlidXVpZC50ZXggYi9Eb2MvbGliL2xpYnV1aWQudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZDUyOTUKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYnV1aWQudGV4CkBAIC0wLDAgKzEsMjM0IEBACitcc2VjdGlvbntcbW9kdWxle3V1aWR9IC0tLQorICAgICAgICAgVVVJRCBvYmplY3RzIGFjY29yZGluZyB0byBSRkMgNDEyMn0KK1xkZWNsYXJlbW9kdWxle2J1aWx0aW59e3V1aWR9CitcbW9kdWxlc3lub3BzaXN7VVVJRCBvYmplY3RzICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMpIGFjY29yZGluZyB0byBSRkMgNDEyMn0KK1xtb2R1bGVhdXRob3J7S2EtUGluZyBZZWV9e3BpbmdAemVzdHkuY2F9Citcc2VjdGlvbmF1dGhvcntHZW9yZ2UgWW9zaGlkYX17cXVpdmVyQHVzZXJzLnNvdXJjZWZvcmdlLm5ldH0KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGltbXV0YWJsZSBcY2xhc3N7VVVJRH0gb2JqZWN0cyAodGhlIFxjbGFzc3tVVUlEfSBjbGFzcykKK2FuZCB0aGUgZnVuY3Rpb25zIFxmdW5jdGlvbnt1dWlkMSgpfSwgXGZ1bmN0aW9ue3V1aWQzKCl9LAorXGZ1bmN0aW9ue3V1aWQ0KCl9LCBcZnVuY3Rpb257dXVpZDUoKX0gZm9yIGdlbmVyYXRpbmcgdmVyc2lvbiAxLCAzLCA0LAorYW5kIDUgVVVJRHMgYXMgc3BlY2lmaWVkIGluIFxyZmN7NDEyMn0uCisKK0lmIGFsbCB5b3Ugd2FudCBpcyBhIHVuaXF1ZSBJRCwgeW91IHNob3VsZCBwcm9iYWJseSBjYWxsCitcZnVuY3Rpb257dXVpZDEoKX0gb3IgXGZ1bmN0aW9ue3V1aWQ0KCl9LiAgTm90ZSB0aGF0IFxmdW5jdGlvbnt1dWlkMSgpfQorbWF5IGNvbXByb21pc2UgcHJpdmFjeSBzaW5jZSBpdCBjcmVhdGVzIGEgVVVJRCBjb250YWluaW5nIHRoZSBjb21wdXRlcidzCituZXR3b3JrIGFkZHJlc3MuICBcZnVuY3Rpb257dXVpZDQoKX0gY3JlYXRlcyBhIHJhbmRvbSBVVUlELgorCitcYmVnaW57Y2xhc3NkZXNjfXtVVUlEfXtcb3B0aW9uYWx7aGV4XG9wdGlvbmFseywgYnl0ZXNcb3B0aW9uYWx7LAorZmllbGRzXG9wdGlvbmFseywgaW50XG9wdGlvbmFseywgdmVyc2lvbn19fX19fQorCislSW5zdGFuY2VzIG9mIHRoZSBVVUlEIGNsYXNzIHJlcHJlc2VudCBVVUlEcyBhcyBzcGVjaWZpZWQgaW4gUkZDIDQxMjIuCislVVVJRCBvYmplY3RzIGFyZSBpbW11dGFibGUsIGhhc2hhYmxlLCBhbmQgdXNhYmxlIGFzIGRpY3Rpb25hcnkga2V5cy4KKyVDb252ZXJ0aW5nIGEgVVVJRCB0byBhIHN0cmluZyB3aXRoIHN0cigpIHlpZWxkcyBzb21ldGhpbmcgaW4gdGhlIGZvcm0KKyUnMTIzNDU2NzgtMTIzNC0xMjM0LTEyMzQtMTIzNDU2Nzg5YWJjJy4gIFRoZSBVVUlEIGNvbnN0cnVjdG9yIGFjY2VwdHMKKyVmb3VyIHBvc3NpYmxlIGZvcm1zOiBhIHNpbWlsYXIgc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cywgb3IgYQorJXN0cmluZyBvZiAxNiByYXcgYnl0ZXMgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2J5dGVzJywgb3IgYSB0dXBsZSBvZgorJXNpeCBpbnRlZ2VyIGZpZWxkcyAod2l0aCAzMi1iaXQsIDE2LWJpdCwgMTYtYml0LCA4LWJpdCwgOC1iaXQsIGFuZAorJTQ4LWJpdCB2YWx1ZXMgcmVzcGVjdGl2ZWx5KSBhcyBhbiBhcmd1bWVudCBuYW1lZCAnZmllbGRzJywgb3IgYSBzaW5nbGUKKyUxMjgtYml0IGludGVnZXIgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2ludCcuCisKK0NyZWF0ZSBhIFVVSUQgZnJvbSBlaXRoZXIgYSBzdHJpbmcgb2YgMzIgaGV4YWRlY2ltYWwgZGlnaXRzLAorYSBzdHJpbmcgb2YgMTYgYnl0ZXMgYXMgdGhlIFx2YXJ7Ynl0ZXN9IGFyZ3VtZW50LCBhIHR1cGxlIG9mIHNpeAoraW50ZWdlcnMgKDMyLWJpdCBcdmFye3RpbWVfbG93fSwgMTYtYml0IFx2YXJ7dGltZV9taWR9LAorMTYtYml0IFx2YXJ7dGltZV9oaV92ZXJzaW9ufSwKKzgtYml0IFx2YXJ7Y2xvY2tfc2VxX2hpX3ZhcmlhbnR9LCA4LWJpdCBcdmFye2Nsb2NrX3NlcV9sb3d9LCA0OC1iaXQgXHZhcntub2RlfSkKK2FzIHRoZSBcdmFye2ZpZWxkc30gYXJndW1lbnQsIG9yIGEgc2luZ2xlIDEyOC1iaXQgaW50ZWdlciBhcyB0aGUgXHZhcntpbnR9Cithcmd1bWVudC4gIFdoZW4gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyBpcyBnaXZlbiwgY3VybHkgYnJhY2VzLAoraHlwaGVucywgYW5kIGEgVVJOIHByZWZpeCBhcmUgYWxsIG9wdGlvbmFsLiAgRm9yIGV4YW1wbGUsIHRoZXNlCitleHByZXNzaW9ucyBhbGwgeWllbGQgdGhlIHNhbWUgVVVJRDoKKworXGJlZ2lue3ZlcmJhdGltfQorVVVJRCgnezEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OH0nKQorVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgnKQorVVVJRCgndXJuOnV1aWQ6MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JykKK1VVSUQoYnl0ZXM9J1x4MTJceDM0XHg1Nlx4NzgnKjQpCitVVUlEKGZpZWxkcz0oMHgxMjM0NTY3OCwgMHgxMjM0LCAweDU2NzgsIDB4MTIsIDB4MzQsIDB4NTY3ODEyMzQ1Njc4KSkKK1VVSUQoaW50PTB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgpCitcZW5ke3ZlcmJhdGltfQorCitFeGFjdGx5IG9uZSBvZiBcdmFye2hleH0sIFx2YXJ7Ynl0ZXN9LCBcdmFye2ZpZWxkc30sIG9yIFx2YXJ7aW50fSBtdXN0CitiZSBnaXZlbi4gIFRoZSBcdmFye3ZlcnNpb259IGFyZ3VtZW50IGlzIG9wdGlvbmFsOyBpZiBnaXZlbiwgdGhlCityZXN1bHRpbmcgVVVJRCB3aWxsIGhhdmUgaXRzIHZhcmlhbnQgYW5kIHZlcnNpb24gbnVtYmVyIHNldCBhY2NvcmRpbmcgdG8KK1JGQyA0MTIyLCBvdmVycmlkaW5nIGJpdHMgaW4gdGhlIGdpdmVuIFx2YXJ7aGV4fSwgXHZhcntieXRlc30sCitcdmFye2ZpZWxkc30sIG9yIFx2YXJ7aW50fS4KKworXGVuZHtjbGFzc2Rlc2N9CisKK1xjbGFzc3tVVUlEfSBpbnN0YW5jZXMgaGF2ZSB0aGVzZSByZWFkLW9ubHkgYXR0cmlidXRlczoKKworXGJlZ2lue21lbWJlcmRlc2N9e2J5dGVzfQorVGhlIFVVSUQgYXMgYSAxNi1ieXRlIHN0cmluZy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2ZpZWxkc30KK0EgdHVwbGUgb2YgdGhlIHNpeCBpbnRlZ2VyIGZpZWxkcyBvZiB0aGUgVVVJRCwgd2hpY2ggYXJlIGFsc28gYXZhaWxhYmxlCithcyBzaXggaW5kaXZpZHVhbCBhdHRyaWJ1dGVzIGFuZCB0d28gZGVyaXZlZCBhdHRyaWJ1dGVzOgorCitcYmVnaW57dGFibGVpaX17bHxsfXttZW1iZXJ9e0ZpZWxkfXtNZWFuaW5nfQorICBcbGluZWlpe3RpbWVfbG93fXt0aGUgZmlyc3QgMzIgYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lX21pZH17dGhlIG5leHQgMTYgYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lX2hpX3ZlcnNpb259e3RoZSBuZXh0IDE2IGJpdHMgb2YgdGhlIFVVSUR9CisgIFxsaW5laWl7Y2xvY2tfc2VxX2hpX3ZhcmlhbnR9e3RoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXtjbG9ja19zZXFfbG93fXt0aGUgbmV4dCA4IGJpdHMgb2YgdGhlIFVVSUR9CisgIFxsaW5laWl7bm9kZX17dGhlIGxhc3QgNDggYml0cyBvZiB0aGUgVVVJRH0KKyAgXGxpbmVpaXt0aW1lfXt0aGUgNjAtYml0IHRpbWVzdGFtcH0KKyAgXGxpbmVpaXtjbG9ja19zZXF9e3RoZSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyfQorXGVuZHt0YWJsZWlpfQorCisKK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2hleH0KK1RoZSBVVUlEIGFzIGEgMzItY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2ludH0KK1RoZSBVVUlEIGFzIGEgMTI4LWJpdCBpbnRlZ2VyLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dXJufQorVGhlIFVVSUQgYXMgYSBVUk4gYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dmFyaWFudH0KK1RoZSBVVUlEIHZhcmlhbnQsIHdoaWNoIGRldGVybWluZXMgdGhlIGludGVybmFsIGxheW91dCBvZiB0aGUgVVVJRC4KK1RoaXMgd2lsbCBiZSBhbiBpbnRlZ2VyIGVxdWFsIHRvIG9uZSBvZiB0aGUgY29uc3RhbnRzCitcY29uc3RhbnR7UkVTRVJWRURfTkNTfSwKK1xjb25zdGFudHtSRkNfNDEyMn0sIFxjb25zdGFudHtSRVNFUlZFRF9NSUNST1NPRlR9LCBvcgorXGNvbnN0YW50e1JFU0VSVkVEX0ZVVFVSRX0pLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317dmVyc2lvbn0KK1RoZSBVVUlEIHZlcnNpb24gbnVtYmVyICgxIHRocm91Z2ggNSwgbWVhbmluZ2Z1bCBvbmx5Cit3aGVuIHRoZSB2YXJpYW50IGlzIFxjb25zdGFudHtSRkNfNDEyMn0pLgorXGVuZHttZW1iZXJkZXNjfQorCitUaGUgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucworCitcYmVnaW57ZnVuY2Rlc2N9e2dldG5vZGV9e30KK0dldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBhcyBhIDQ4LWJpdCBwb3NpdGl2ZSBpbnRlZ2VyLiAgVGhlIGZpcnN0IHRpbWUgdGhpcworcnVucywgaXQgbWF5IGxhdW5jaCBhIHNlcGFyYXRlIHByb2dyYW0sIHdoaWNoIGNvdWxkIGJlIHF1aXRlIHNsb3cuICBJZiBhbGwKK2F0dGVtcHRzIHRvIG9idGFpbiB0aGUgaGFyZHdhcmUgYWRkcmVzcyBmYWlsLCB3ZSBjaG9vc2UgYSByYW5kb20gNDgtYml0CitudW1iZXIgd2l0aCBpdHMgZWlnaHRoIGJpdCBzZXQgdG8gMSBhcyByZWNvbW1lbmRlZCBpbiBSRkMgNDEyMi4gICJIYXJkd2FyZQorYWRkcmVzcyIgbWVhbnMgdGhlIE1BQyBhZGRyZXNzIG9mIGEgbmV0d29yayBpbnRlcmZhY2UsIGFuZCBvbiBhIG1hY2hpbmUKK3dpdGggbXVsdGlwbGUgbmV0d29yayBpbnRlcmZhY2VzIHRoZSBNQUMgYWRkcmVzcyBvZiBhbnkgb25lIG9mIHRoZW0gbWF5CitiZSByZXR1cm5lZC4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7Z2V0bm9kZX0KKworXGJlZ2lue2Z1bmNkZXNjfXt1dWlkMX17XG9wdGlvbmFse25vZGVcb3B0aW9uYWx7LCBjbG9ja19zZXF9fX0KK0dlbmVyYXRlIGEgVVVJRCBmcm9tIGEgaG9zdCBJRCwgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGhlIGN1cnJlbnQgdGltZS4KK0lmIFx2YXJ7bm9kZX0gaXMgbm90IGdpdmVuLCBcZnVuY3Rpb257Z2V0bm9kZSgpfSBpcyB1c2VkIHRvIG9idGFpbiB0aGUKK2hhcmR3YXJlIGFkZHJlc3MuCitJZiBcdmFye2Nsb2NrX3NlcX0gaXMgZ2l2ZW4sIGl0IGlzIHVzZWQgYXMgdGhlIHNlcXVlbmNlIG51bWJlcjsKK290aGVyd2lzZSBhIHJhbmRvbSAxNC1iaXQgc2VxdWVuY2UgbnVtYmVyIGlzIGNob3Nlbi4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDF9CisKK1xiZWdpbntmdW5jZGVzY317dXVpZDN9e25hbWVzcGFjZSwgbmFtZX0KK0dlbmVyYXRlIGEgVVVJRCBiYXNlZCB1cG9uIGEgTUQ1IGhhc2ggb2YgdGhlIFx2YXJ7bmFtZX0gc3RyaW5nIHZhbHVlCitkcmF3biBmcm9tIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS4gICBcdmFye25hbWVzcGFjZX0KK211c3QgYmUgb25lIG9mIFxjb25zdGFudHtOQU1FU1BBQ0VfRE5TfSwKK1xjb25zdGFudHtOQU1FU1BBQ0VfVVJMfSwgXGNvbnN0YW50e05BTUVTUEFDRV9PSUR9LAorb3IgXGNvbnN0YW50e05BTUVTUEFDRV9YNTAwfS4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDN9CisKK1xiZWdpbntmdW5jZGVzY317dXVpZDR9e30KK0dlbmVyYXRlIGEgcmFuZG9tIFVVSUQuCitcZW5ke2Z1bmNkZXNjfQorXGluZGV4e3V1aWQ0fQorCitcYmVnaW57ZnVuY2Rlc2N9e3V1aWQ1fXtuYW1lc3BhY2UsIG5hbWV9CitHZW5lcmF0ZSBhIFVVSUQgYmFzZWQgdXBvbiBhIFNIQS0xIGhhc2ggb2YgdGhlIFx2YXJ7bmFtZX0gc3RyaW5nIHZhbHVlCitkcmF3biBmcm9tIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS4gICBcdmFye25hbWVzcGFjZX0KK211c3QgYmUgb25lIG9mIFxjb25zdGFudHtOQU1FU1BBQ0VfRE5TfSwKK1xjb25zdGFudHtOQU1FU1BBQ0VfVVJMfSwgXGNvbnN0YW50e05BTUVTUEFDRV9PSUR9LAorb3IgXGNvbnN0YW50e05BTUVTUEFDRV9YNTAwfS4KK1xlbmR7ZnVuY2Rlc2N9CitcaW5kZXh7dXVpZDV9CisKK1RoZSBcbW9kdWxle3V1aWR9IG1vZHVsZSBkZWZpbmVzIHRoZSBmb2xsb3dpbmcgbmFtZXNwYWNlIGNvbnN0YW50cworZm9yIHVzZSB3aXRoIFxmdW5jdGlvbnt1dWlkMygpfSBvciBcZnVuY3Rpb257dXVpZDUoKX0uCisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX0ROU30KK0Z1bGx5LXF1YWxpZmllZCBkb21haW4gbmFtZSBuYW1lc3BhY2UgVVVJRC4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX1VSTH0KK1VSTCBuYW1lc3BhY2UgVVVJRC4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317TkFNRVNQQUNFX09JRH0KK0lTTyBPSUQgbmFtZXNwYWNlIFVVSUQuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e05BTUVTUEFDRV9YNTAwfQorWC41MDAgRE4gbmFtZXNwYWNlIFVVSUQuCitcZW5ke2RhdGFkZXNjfQorCitUaGUgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZGVmaW5lcyB0aGUgZm9sbG93aW5nIGNvbnN0YW50cworZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgdGhlIFxtZW1iZXJ7dmFyaWFudH0gYXR0cmlidXRlOgorCitcYmVnaW57ZGF0YWRlc2N9e1JFU0VSVkVEX05DU30KK1Jlc2VydmVkIGZvciBOQ1MgY29tcGF0aWJpbGl0eS4KK1xlbmR7ZGF0YWRlc2N9CisKK1xiZWdpbntkYXRhZGVzY317UkZDXzQxMjJ9CitVc2VzIFVVSUQgbGF5b3V0IHNwZWNpZmllZCBpbiBccmZjezQxMjJ9LgorXGVuZHtkYXRhZGVzY30KKworXGJlZ2lue2RhdGFkZXNjfXtSRVNFUlZFRF9NSUNST1NPRlR9CitSZXNlcnZlZCBmb3IgTWljcm9zb2Z0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitcZW5ke2RhdGFkZXNjfQorCitcYmVnaW57ZGF0YWRlc2N9e1JFU0VSVkVEX0ZVVFVSRX0KK1Jlc2VydmVkIGZvciBmdXR1cmUgZGVmaW5pdGlvbi4KK1xlbmR7ZGF0YWRlc2N9CisKKworXGJlZ2lue3NlZWFsc299CisgIFxzZWVyZmN7NDEyMn17QSBVbml2ZXJzYWxseSBVbmlxdWUgSURlbnRpZmllciAoVVVJRCkgVVJOIE5hbWVzcGFjZX17CisgICAgICAgICAgVGhpcyBzcGVjaWZpZXMgYSBVbmlmb3JtIFJlc291cmNlIE5hbWUgbmFtZXNwYWNlIGZvciBVVUlEcy59CitcZW5ke3NlZWFsc299CisKK1xzdWJzZWN0aW9ue0V4YW1wbGUgXGxhYmVse3V1aWQtZXhhbXBsZX19CisKK0hlcmUgaXMgYSB0eXBpY2FsIHVzYWdlOgorXGJlZ2lue3ZlcmJhdGltfQorPj4+IGltcG9ydCB1dWlkCisKKyMgbWFrZSBhIFVVSUQgYmFzZWQgb24gdGhlIGhvc3QgSUQgYW5kIGN1cnJlbnQgdGltZQorPj4+IHV1aWQudXVpZDEoKQorVVVJRCgnYTgwOThjMWEtZjg2ZS0xMWRhLWJkMWEtMDAxMTI0NDRiZTFlJykKKworIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKz4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworIyBtYWtlIGEgcmFuZG9tIFVVSUQKKz4+PiB1dWlkLnV1aWQ0KCkKK1VVSUQoJzE2ZmQyNzA2LThiYWYtNDMzYi04MmViLThjN2ZhZGE4NDdkYScpCisKKyMgbWFrZSBhIFVVSUQgdXNpbmcgYSBTSEEtMSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZQorPj4+IHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCitVVUlEKCc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKQorCisjIG1ha2UgYSBVVUlEIGZyb20gYSBzdHJpbmcgb2YgaGV4IGRpZ2l0cyAoYnJhY2VzIGFuZCBoeXBoZW5zIGlnbm9yZWQpCis+Pj4geCA9IHV1aWQuVVVJRCgnezAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZn0nKQorCisjIGNvbnZlcnQgYSBVVUlEIHRvIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaW4gc3RhbmRhcmQgZm9ybQorPj4+IHN0cih4KQorJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicKKworIyBnZXQgdGhlIHJhdyAxNiBieXRlcyBvZiB0aGUgVVVJRAorPj4+IHguYnl0ZXMKKydceDAwXHgwMVx4MDJceDAzXHgwNFx4MDVceDA2XHgwN1x4MDhcdFxuXHgwYlx4MGNcclx4MGVceDBmJworCisjIG1ha2UgYSBVVUlEIGZyb20gYSAxNi1ieXRlIHN0cmluZworPj4+IHV1aWQuVVVJRChieXRlcz14LmJ5dGVzKQorVVVJRCgnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJykKK1xlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndhcm5pbmdzLnRleCBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CmluZGV4IDdiODI5YTAuLjA4YzAzNDAgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvbGlid2FybmluZ3MudGV4CisrKyBiL0RvYy9saWIvbGlid2FybmluZ3MudGV4CkBAIC03MSw2ICs3MSwxMSBAQAogXGxpbmVpaXtGdXR1cmVXYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dCBjb25zdHJ1Y3RzCiB0aGF0IHdpbGwgY2hhbmdlIHNlbWFudGljYWxseSBpbiB0aGUgZnV0dXJlLn0KIAorXGxpbmVpaXtQZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nfXtCYXNlIGNhdGVnb3J5IGZvciB3YXJuaW5ncyBhYm91dAorZmVhdHVyZXMgdGhhdCB3aWxsIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZSAoaWdub3JlZCBieSBkZWZhdWx0KS59CisKK1xsaW5laWl7SW1wb3J0V2FybmluZ317QmFzZSBjYXRlZ29yeSBmb3Igd2FybmluZ3MgdHJpZ2dlcmVkIGR1cmluZyB0aGUKK3Byb2Nlc3Mgb2YgaW1wb3J0aW5nIGEgbW9kdWxlIChpZ25vcmVkIGJ5IGRlZmF1bHQpLn0KIFxlbmR7dGFibGVpaX0KIAogV2hpbGUgdGhlc2UgYXJlIHRlY2huaWNhbGx5IGJ1aWx0LWluIGV4Y2VwdGlvbnMsIHRoZXkgYXJlIGRvY3VtZW50ZWQKQEAgLTE0Myw2ICsxNDgsMTcgQEAKIGl0IGlzIGZpcnN0IGltcG9ydGVkIChpbnZhbGlkIG9wdGlvbnMgYXJlIGlnbm9yZWQsIGFmdGVyIHByaW50aW5nIGEKIG1lc3NhZ2UgdG8gXGNvZGV7c3lzLnN0ZGVycn0pLgogCitUaGUgd2FybmluZ3MgdGhhdCBhcmUgaWdub3JlZCBieSBkZWZhdWx0IG1heSBiZSBlbmFibGVkIGJ5IHBhc3NpbmcKKyBccHJvZ3JhbW9wdHstV2R9IHRvIHRoZSBpbnRlcnByZXRlci4gVGhpcyBlbmFibGVzIGRlZmF1bHQgaGFuZGxpbmcKK2ZvciBhbGwgd2FybmluZ3MsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZSBub3JtYWxseSBpZ25vcmVkIGJ5CitkZWZhdWx0LiBUaGlzIGlzIHBhcnRpY3VsYXIgdXNlZnVsIGZvciBlbmFibGluZyBJbXBvcnRXYXJuaW5nIHdoZW4KK2RlYnVnZ2luZyBwcm9ibGVtcyBpbXBvcnRpbmcgYSBkZXZlbG9wZWQgcGFja2FnZS4gSW1wb3J0V2FybmluZyBjYW4KK2Fsc28gYmUgZW5hYmxlZCBleHBsaWNpdGx5IGluIFB5dGhvbiBjb2RlIHVzaW5nOgorCitcYmVnaW57dmVyYmF0aW19CisgICAgd2FybmluZ3Muc2ltcGxlZmlsdGVyKCdkZWZhdWx0JywgSW1wb3J0V2FybmluZykKK1xlbmR7dmVyYmF0aW19CisKIAogXHN1YnNlY3Rpb257QXZhaWxhYmxlIEZ1bmN0aW9ucyBcbGFiZWx7d2FybmluZy1mdW5jdGlvbnN9fQogCkBAIC0yMDksMTQgKzIyNSwyNiBAQAogaW5zZXJ0ZWQgYXQgdGhlIGZyb250IGJ5IGRlZmF1bHQ7IGlmIFx2YXJ7YXBwZW5kfSBpcyB0cnVlLCBpdCBpcwogaW5zZXJ0ZWQgYXQgdGhlIGVuZC4KIFRoaXMgY2hlY2tzIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLCBjb21waWxlcyB0aGUgbWVzc2FnZSBhbmQKLW1vZHVsZSByZWd1bGFyIGV4cHJlc3Npb25zLCBhbmQgaW5zZXJ0cyB0aGVtIGFzIGEgdHVwbGUgaW4gZnJvbnQKLW9mIHRoZSB3YXJuaW5ncyBmaWx0ZXIuICBFbnRyaWVzIGluc2VydGVkIGxhdGVyIG92ZXJyaWRlIGVudHJpZXMKLWluc2VydGVkIGVhcmxpZXIsIGlmIGJvdGggbWF0Y2ggYSBwYXJ0aWN1bGFyIHdhcm5pbmcuICBPbWl0dGVkCi1hcmd1bWVudHMgZGVmYXVsdCB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcyBldmVyeXRoaW5nLgorbW9kdWxlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFuZCBpbnNlcnRzIHRoZW0gYXMgYSB0dXBsZSBpbiB0aGUgCitsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMuICBFbnRyaWVzIGNsb3NlciB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QKK292ZXJyaWRlIGVudHJpZXMgbGF0ZXIgaW4gdGhlIGxpc3QsIGlmIGJvdGggbWF0Y2ggYSBwYXJ0aWN1bGFyCit3YXJuaW5nLiAgT21pdHRlZCBhcmd1bWVudHMgZGVmYXVsdCB0byBhIHZhbHVlIHRoYXQgbWF0Y2hlcworZXZlcnl0aGluZy4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2ltcGxlZmlsdGVyfXthY3Rpb25cb3B0aW9uYWx7LAorICAgICAgICAgICAgICAgICBjYXRlZ29yeVxvcHRpb25hbHssCisgICAgICAgICAgICAgICAgIGxpbmVub1xvcHRpb25hbHssIGFwcGVuZH19fX0KK0luc2VydCBhIHNpbXBsZSBlbnRyeSBpbnRvIHRoZSBsaXN0IG9mIHdhcm5pbmdzIGZpbHRlcnMuIFRoZSBtZWFuaW5nCitvZiB0aGUgZnVuY3Rpb24gcGFyYW1ldGVycyBpcyBhcyBmb3IgXGZ1bmN0aW9ue2ZpbHRlcndhcm5pbmdzKCl9LCBidXQKK3JlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIG5vdCBuZWVkZWQgYXMgdGhlIGZpbHRlciBpbnNlcnRlZCBhbHdheXMKK21hdGNoZXMgYW55IG1lc3NhZ2UgaW4gYW55IG1vZHVsZSBhcyBsb25nIGFzIHRoZSBjYXRlZ29yeSBhbmQgbGluZQorbnVtYmVyIG1hdGNoLgogXGVuZHtmdW5jZGVzY30KIAogXGJlZ2lue2Z1bmNkZXNjfXtyZXNldHdhcm5pbmdzfXt9CiBSZXNldCB0aGUgd2FybmluZ3MgZmlsdGVyLiAgVGhpcyBkaXNjYXJkcyB0aGUgZWZmZWN0IG9mIGFsbCBwcmV2aW91cwogY2FsbHMgdG8gXGZ1bmN0aW9ue2ZpbHRlcndhcm5pbmdzKCl9LCBpbmNsdWRpbmcgdGhhdCBvZiB0aGUKLVxwcm9ncmFtb3B0ey1XfSBjb21tYW5kIGxpbmUgb3B0aW9ucy4KK1xwcm9ncmFtb3B0ey1XfSBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQgY2FsbHMgdG8KK1xmdW5jdGlvbntzaW1wbGVmaWx0ZXIoKX0uCiBcZW5ke2Z1bmNkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleCBiL0RvYy9saWIvbGlid2Vha3JlZi50ZXgKaW5kZXggZmM5NDllNi4uNmY2NzZhMiAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ3ZWFrcmVmLnRleAorKysgYi9Eb2MvbGliL2xpYndlYWtyZWYudGV4CkBAIC02NSwxMCArNjUsMTQgQEAKIG9iaiA9IERpY3QocmVkPTEsIGdyZWVuPTIsIGJsdWU9MykgICAjIHRoaXMgb2JqZWN0IGlzIHdlYWsgcmVmZXJlbmNhYmxlCiBcZW5ke3ZlcmJhdGltfQogCi1FeHRlbnNpb24gdHlwZXMgY2FuIGVhc2lseSBiZSBtYWRlIHRvIHN1cHBvcnQgd2VhayByZWZlcmVuY2VzOyBzZWUgc2VjdGlvbgotXHJlZnt3ZWFrcmVmLWV4dGVuc2lvbn0sIGBgV2VhayBSZWZlcmVuY2VzIGluIEV4dGVuc2lvbiBUeXBlcywnJyBmb3IgbW9yZQotaW5mb3JtYXRpb24uCi0KK0V4dGVuc2lvbiB0eXBlcyBjYW4gZWFzaWx5IGJlIG1hZGUgdG8gc3VwcG9ydCB3ZWFrIHJlZmVyZW5jZXM7IHNlZQorYGBcdWxpbmt7V2VhayBSZWZlcmVuY2UgU3VwcG9ydH17Li4vZXh0L3dlYWtyZWYtc3VwcG9ydC5odG1sfScnIGluCitcY2l0ZXRpdGxlWy4uL2V4dC9leHQuaHRtbF17RXh0ZW5kaW5nIGFuZCBFbWJlZGRpbmcgdGhlIFB5dGhvbgorSW50ZXJwcmV0ZXJ9LgorJSBUaGUgcmVmZXJlbmNlZCBzZWN0aW9uIHVzZWQgdG8gYXBwZWFyIGluIHRoaXMgZG9jdW1lbnQgd2l0aCB0aGUKKyUgXGxhYmVsIHdlYWtyZWYtZXh0ZW5zaW9uLiAgSXQgd291bGQgYmUgZ29vZCB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIGEKKyUgcmVkaXJlY3QgZm9yIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgcGFnZSAod2Vha3JlZi1leHRlbnNpb24uaHRtbCkKKyUgZm9yIG9uLWxpbmUgdmVyc2lvbnMgb2YgdGhpcyBkb2N1bWVudC4KIAogXGJlZ2lue2NsYXNzZGVzY317cmVmfXtvYmplY3Rcb3B0aW9uYWx7LCBjYWxsYmFja319CiAgIFJldHVybiBhIHdlYWsgcmVmZXJlbmNlIHRvIFx2YXJ7b2JqZWN0fS4gIFRoZSBvcmlnaW5hbCBvYmplY3QgY2FuIGJlCkBAIC0zMzAsODMgKzMzNCwzIEBACiBkZWYgaWQyb2JqKG9pZCk6CiAgICAgcmV0dXJuIF9pZDJvYmpfZGljdFtvaWRdCiBcZW5ke3ZlcmJhdGltfQotCi0KLVxzdWJzZWN0aW9ue1dlYWsgUmVmZXJlbmNlcyBpbiBFeHRlbnNpb24gVHlwZXMKLSAgICAgICAgICAgIFxsYWJlbHt3ZWFrcmVmLWV4dGVuc2lvbn19Ci0KLU9uZSBvZiB0aGUgZ29hbHMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzIHRvIGFsbG93IGFueSB0eXBlIHRvCi1wYXJ0aWNpcGF0ZSBpbiB0aGUgd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtIHdpdGhvdXQgaW5jdXJyaW5nIHRoZQotb3ZlcmhlYWQgb24gdGhvc2Ugb2JqZWN0cyB3aGljaCBkbyBub3QgYmVuZWZpdCBieSB3ZWFrIHJlZmVyZW5jaW5nCi0oc3VjaCBhcyBudW1iZXJzKS4KLQotRm9yIGFuIG9iamVjdCB0byBiZSB3ZWFrbHkgcmVmZXJlbmNhYmxlLCB0aGUgZXh0ZW5zaW9uIG11c3QgaW5jbHVkZSBhCi1cY3R5cGV7UHlPYmplY3QqfSBmaWVsZCBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGZvciB0aGUgdXNlIG9mIHRoZQotd2VhayByZWZlcmVuY2UgbWVjaGFuaXNtOyBpdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIFxOVUxMe30gYnkgdGhlCi1vYmplY3QncyBjb25zdHJ1Y3Rvci4gIEl0IG11c3QgYWxzbyBzZXQgdGhlIFxtZW1iZXJ7dHBfd2Vha2xpc3RvZmZzZXR9Ci1maWVsZCBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlIG9iamVjdCB0byB0aGUgb2Zmc2V0IG9mIHRoZSBmaWVsZC4KLUFsc28sIGl0IG5lZWRzIHRvIGFkZCBcY29uc3RhbnR7UHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTfSB0byB0aGUKLXRwX2ZsYWdzIHNsb3QuICBGb3IgZXhhbXBsZSwgdGhlIGluc3RhbmNlIHR5cGUgaXMgZGVmaW5lZCB3aXRoIHRoZQotZm9sbG93aW5nIHN0cnVjdHVyZToKLQotXGJlZ2lue3ZlcmJhdGltfQotdHlwZWRlZiBzdHJ1Y3QgewotICAgIFB5T2JqZWN0X0hFQUQKLSAgICBQeUNsYXNzT2JqZWN0ICppbl9jbGFzczsgICAgICAgLyogVGhlIGNsYXNzIG9iamVjdCAqLwotICAgIFB5T2JqZWN0ICAgICAgKmluX2RpY3Q7ICAgICAgICAvKiBBIGRpY3Rpb25hcnkgKi8KLSAgICBQeU9iamVjdCAgICAgICppbl93ZWFrcmVmbGlzdDsgLyogTGlzdCBvZiB3ZWFrIHJlZmVyZW5jZXMgKi8KLX0gUHlJbnN0YW5jZU9iamVjdDsKLVxlbmR7dmVyYmF0aW19Ci0KLVRoZSBzdGF0aWNhbGx5LWRlY2xhcmVkIHR5cGUgb2JqZWN0IGZvciBpbnN0YW5jZXMgaXMgZGVmaW5lZCB0aGlzIHdheToKLQotXGJlZ2lue3ZlcmJhdGltfQotUHlUeXBlT2JqZWN0IFB5SW5zdGFuY2VfVHlwZSA9IHsKLSAgICBQeU9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlKQotICAgIDAsCi0gICAgIm1vZHVsZS5pbnN0YW5jZSIsCi0KLSAgICAvKiBMb3RzIG9mIHN0dWZmIG9taXR0ZWQgZm9yIGJyZXZpdHkuLi4gKi8KLQotICAgIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfSEFWRV9XRUFLUkVGUyAgIC8qIHRwX2ZsYWdzICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9jbGVhciAqLwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KLSAgICBvZmZzZXRvZihQeUluc3RhbmNlT2JqZWN0LCBpbl93ZWFrcmVmbGlzdCksIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCi19OwotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIHR5cGUgY29uc3RydWN0b3IgaXMgcmVzcG9uc2libGUgZm9yIGluaXRpYWxpemluZyB0aGUgd2VhayByZWZlcmVuY2UKLWxpc3QgdG8gXE5VTEw6Ci0KLVxiZWdpbnt2ZXJiYXRpbX0KLXN0YXRpYyBQeU9iamVjdCAqCi1pbnN0YW5jZV9uZXcoKSB7Ci0gICAgLyogT3RoZXIgaW5pdGlhbGl6YXRpb24gc3R1ZmYgb21pdHRlZCBmb3IgYnJldml0eSAqLwotCi0gICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwotCi0gICAgcmV0dXJuIChQeU9iamVjdCAqKSBzZWxmOwotfQotXGVuZHt2ZXJiYXRpbX0KLQotVGhlIG9ubHkgZnVydGhlciBhZGRpdGlvbiBpcyB0aGF0IHRoZSBkZXN0cnVjdG9yIG5lZWRzIHRvIGNhbGwgdGhlCi13ZWFrIHJlZmVyZW5jZSBtYW5hZ2VyIHRvIGNsZWFyIGFueSB3ZWFrIHJlZmVyZW5jZXMuICBUaGlzIHNob3VsZCBiZQotZG9uZSBiZWZvcmUgYW55IG90aGVyIHBhcnRzIG9mIHRoZSBkZXN0cnVjdGlvbiBoYXZlIG9jY3VycmVkLCBidXQgaXMKLW9ubHkgcmVxdWlyZWQgaWYgdGhlIHdlYWsgcmVmZXJlbmNlIGxpc3QgaXMgbm9uLVxOVUxMOgotCi1cYmVnaW57dmVyYmF0aW19Ci1zdGF0aWMgdm9pZAotaW5zdGFuY2VfZGVhbGxvYyhQeUluc3RhbmNlT2JqZWN0ICppbnN0KQotewotICAgIC8qIEFsbG9jYXRlIHRlbXBvcmFyaWVzIGlmIG5lZWRlZCwgYnV0IGRvIG5vdCBiZWdpbgotICAgICAgIGRlc3RydWN0aW9uIGp1c3QgeWV0LgotICAgICAqLwotCi0gICAgaWYgKGluc3QtPmluX3dlYWtyZWZsaXN0ICE9IE5VTEwpCi0gICAgICAgIFB5T2JqZWN0X0NsZWFyV2Vha1JlZnMoKFB5T2JqZWN0ICopIGluc3QpOwotCi0gICAgLyogUHJvY2VlZCB3aXRoIG9iamVjdCBkZXN0cnVjdGlvbiBub3JtYWxseS4gKi8KLX0KLVxlbmR7dmVyYmF0aW19CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4IGIvRG9jL2xpYi9saWJ3ZWJicm93c2VyLnRleAppbmRleCBlODZiNTc4Li4xMWQ3N2ExIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYndlYmJyb3dzZXIudGV4CisrKyBiL0RvYy9saWIvbGlid2ViYnJvd3Nlci50ZXgKQEAgLTEzNiw2ICsxMzYsMTggQEAKIE9ubHkgb24gTWFjT1MgWCBwbGF0Zm9ybS4KIFxlbmR7ZGVzY3JpcHRpb259CiAKK0hlcmUgYXJlIHNvbWUgc2ltcGxlIGV4YW1wbGVzOgorCitcYmVnaW57dmVyYmF0aW19Cit1cmwgPSAnaHR0cDovL3d3dy5weXRob24ub3JnJworCisjIE9wZW4gVVJMIGluIGEgbmV3IHRhYiwgaWYgYSBicm93c2VyIHdpbmRvdyBpcyBhbHJlYWR5IG9wZW4uIAord2ViYnJvd3Nlci5vcGVuX25ld190YWIodXJsICsgJy9kb2MnKQorCisjIE9wZW4gVVJMIGluIG5ldyB3aW5kb3csIHJhaXNpbmcgdGhlIHdpbmRvdyBpZiBwb3NzaWJsZS4KK3dlYmJyb3dzZXIub3Blbl9uZXcodXJsKQorXGVuZHt2ZXJiYXRpbX0KKwogCiBcc3Vic2VjdGlvbntCcm93c2VyIENvbnRyb2xsZXIgT2JqZWN0cyBcbGFiZWx7YnJvd3Nlci1jb250cm9sbGVyc319CiAKZGlmZiAtLWdpdCBhL0RvYy9saWIvbGlid3NnaXJlZi50ZXggYi9Eb2MvbGliL2xpYndzZ2lyZWYudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRiMTJlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2MvbGliL2xpYndzZ2lyZWYudGV4CkBAIC0wLDAgKzEsNzgxIEBACitcc2VjdGlvbntcbW9kdWxle3dzZ2lyZWZ9IC0tLSBXU0dJIFV0aWxpdGllcyBhbmQgUmVmZXJlbmNlCitJbXBsZW1lbnRhdGlvbn0KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZn0KK1xtb2R1bGVhdXRob3J7UGhpbGxpcCBKLiBFYnl9e3BqZUB0ZWxlY29tbXVuaXR5LmNvbX0KK1xzZWN0aW9uYXV0aG9ye1BoaWxsaXAgSi4gRWJ5fXtwamVAdGVsZWNvbW11bml0eS5jb219CitcbW9kdWxlc3lub3BzaXN7V1NHSSBVdGlsaXRpZXMgYW5kIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbn0KKworXHZlcnNpb25hZGRlZHsyLjV9CisKK1RoZSBXZWIgU2VydmVyIEdhdGV3YXkgSW50ZXJmYWNlIChXU0dJKSBpcyBhIHN0YW5kYXJkIGludGVyZmFjZQorYmV0d2VlbiB3ZWIgc2VydmVyIHNvZnR3YXJlIGFuZCB3ZWIgYXBwbGljYXRpb25zIHdyaXR0ZW4gaW4gUHl0aG9uLgorSGF2aW5nIGEgc3RhbmRhcmQgaW50ZXJmYWNlIG1ha2VzIGl0IGVhc3kgdG8gdXNlIGFuIGFwcGxpY2F0aW9uCit0aGF0IHN1cHBvcnRzIFdTR0kgd2l0aCBhIG51bWJlciBvZiBkaWZmZXJlbnQgd2ViIHNlcnZlcnMuCisKK09ubHkgYXV0aG9ycyBvZiB3ZWIgc2VydmVycyBhbmQgcHJvZ3JhbW1pbmcgZnJhbWV3b3JrcyBuZWVkIHRvIGtub3cKK2V2ZXJ5IGRldGFpbCBhbmQgY29ybmVyIGNhc2Ugb2YgdGhlIFdTR0kgZGVzaWduLiAgWW91IGRvbid0IG5lZWQgdG8KK3VuZGVyc3RhbmQgZXZlcnkgZGV0YWlsIG9mIFdTR0kganVzdCB0byBpbnN0YWxsIGEgV1NHSSBhcHBsaWNhdGlvbiBvcgordG8gd3JpdGUgYSB3ZWIgYXBwbGljYXRpb24gdXNpbmcgYW4gZXhpc3RpbmcgZnJhbWV3b3JrLgorCitcbW9kdWxle3dzZ2lyZWZ9IGlzIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBXU0dJIHNwZWNpZmljYXRpb24KK3RoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIFdTR0kgc3VwcG9ydCB0byBhIHdlYiBzZXJ2ZXIgb3IgZnJhbWV3b3JrLiAgSXQKK3Byb3ZpZGVzIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIFdTR0kgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZAorcmVzcG9uc2UgaGVhZGVycywgYmFzZSBjbGFzc2VzIGZvciBpbXBsZW1lbnRpbmcgV1NHSSBzZXJ2ZXJzLCBhIGRlbW8KK0hUVFAgc2VydmVyIHRoYXQgc2VydmVzIFdTR0kgYXBwbGljYXRpb25zLCBhbmQgYSB2YWxpZGF0aW9uIHRvb2wgdGhhdAorY2hlY2tzIFdTR0kgc2VydmVycyBhbmQgYXBwbGljYXRpb25zIGZvciBjb25mb3JtYW5jZSB0byB0aGUKK1dTR0kgc3BlY2lmaWNhdGlvbiAoXHBlcHszMzN9KS4KKworJSBYWFggSWYgeW91J3JlIGp1c3QgdHJ5aW5nIHRvIHdyaXRlIGEgd2ViIGFwcGxpY2F0aW9uLi4uCislIFhYWCBzaG91bGQgY3JlYXRlIGEgVVJMIG9uIHB5dGhvbi5vcmcgdG8gcG9pbnQgcGVvcGxlIHRvLgorCisKKworCisKKworCisKKworCisKKworCisKK1xzdWJzZWN0aW9ue1xtb2R1bGV7d3NnaXJlZi51dGlsfSAtLSBXU0dJIGVudmlyb25tZW50IHV0aWxpdGllc30KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZi51dGlsfQorCitUaGlzIG1vZHVsZSBwcm92aWRlcyBhIHZhcmlldHkgb2YgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIHdvcmtpbmcgd2l0aAorV1NHSSBlbnZpcm9ubWVudHMuICBBIFdTR0kgZW52aXJvbm1lbnQgaXMgYSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcKK0hUVFAgcmVxdWVzdCB2YXJpYWJsZXMgYXMgZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIEFsbCBvZiB0aGUgZnVuY3Rpb25zCit0YWtpbmcgYW4gXHZhcntlbnZpcm9ufSBwYXJhbWV0ZXIgZXhwZWN0IGEgV1NHSS1jb21wbGlhbnQgZGljdGlvbmFyeSB0bworYmUgc3VwcGxpZWQ7IHBsZWFzZSBzZWUgXHBlcHszMzN9IGZvciBhIGRldGFpbGVkIHNwZWNpZmljYXRpb24uCisKK1xiZWdpbntmdW5jZGVzY317Z3Vlc3Nfc2NoZW1lfXtlbnZpcm9ufQorUmV0dXJuIGEgZ3Vlc3MgZm9yIHdoZXRoZXIgXGNvZGV7d3NnaS51cmxfc2NoZW1lfSBzaG91bGQgYmUgYGBodHRwJycgb3IKK2BgaHR0cHMnJywgYnkgY2hlY2tpbmcgZm9yIGEgXGNvZGV7SFRUUFN9IGVudmlyb25tZW50IHZhcmlhYmxlIGluIHRoZQorXHZhcntlbnZpcm9ufSBkaWN0aW9uYXJ5LiAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHN0cmluZy4KKworVGhpcyBmdW5jdGlvbiBpcyB1c2VmdWwgd2hlbiBjcmVhdGluZyBhIGdhdGV3YXkgdGhhdCB3cmFwcyBDR0kgb3IgYQorQ0dJLWxpa2UgcHJvdG9jb2wgc3VjaCBhcyBGYXN0Q0dJLiAgVHlwaWNhbGx5LCBzZXJ2ZXJzIHByb3ZpZGluZyBzdWNoCitwcm90b2NvbHMgd2lsbCBpbmNsdWRlIGEgXGNvZGV7SFRUUFN9IHZhcmlhYmxlIHdpdGggYSB2YWx1ZSBvZiBgYDEnJworYGB5ZXMnJywgb3IgYGBvbicnIHdoZW4gYSByZXF1ZXN0IGlzIHJlY2VpdmVkIHZpYSBTU0wuICBTbywgdGhpcworZnVuY3Rpb24gcmV0dXJucyBgYGh0dHBzJycgaWYgc3VjaCBhIHZhbHVlIGlzIGZvdW5kLCBhbmQgYGBodHRwJycKK290aGVyd2lzZS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317cmVxdWVzdF91cml9e2Vudmlyb24gXG9wdGlvbmFseywgaW5jbHVkZV9xdWVyeT0xfX0KK1JldHVybiB0aGUgZnVsbCByZXF1ZXN0IFVSSSwgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIHF1ZXJ5IHN0cmluZywKK3VzaW5nIHRoZSBhbGdvcml0aG0gZm91bmQgaW4gdGhlIGBgVVJMIFJlY29uc3RydWN0aW9uJycgc2VjdGlvbiBvZgorXHBlcHszMzN9LiAgSWYgXHZhcntpbmNsdWRlX3F1ZXJ5fSBpcyBmYWxzZSwgdGhlIHF1ZXJ5IHN0cmluZyBpcworbm90IGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgVVJJLgorXGVuZHtmdW5jZGVzY30KKworXGJlZ2lue2Z1bmNkZXNjfXthcHBsaWNhdGlvbl91cml9e2Vudmlyb259CitTaW1pbGFyIHRvIFxmdW5jdGlvbntyZXF1ZXN0X3VyaX0sIGV4Y2VwdCB0aGF0IHRoZSBcY29kZXtQQVRIX0lORk99IGFuZAorXGNvZGV7UVVFUllfU1RSSU5HfSB2YXJpYWJsZXMgYXJlIGlnbm9yZWQuICBUaGUgcmVzdWx0IGlzIHRoZSBiYXNlIFVSSQorb2YgdGhlIGFwcGxpY2F0aW9uIG9iamVjdCBhZGRyZXNzZWQgYnkgdGhlIHJlcXVlc3QuCitcZW5ke2Z1bmNkZXNjfQorCitcYmVnaW57ZnVuY2Rlc2N9e3NoaWZ0X3BhdGhfaW5mb317ZW52aXJvbn0KK1NoaWZ0IGEgc2luZ2xlIG5hbWUgZnJvbSBcY29kZXtQQVRIX0lORk99IHRvIFxjb2Rle1NDUklQVF9OQU1FfSBhbmQKK3JldHVybiB0aGUgbmFtZS4gIFRoZSBcdmFye2Vudmlyb259IGRpY3Rpb25hcnkgaXMgXGVtcGh7bW9kaWZpZWR9Citpbi1wbGFjZTsgdXNlIGEgY29weSBpZiB5b3UgbmVlZCB0byBrZWVwIHRoZSBvcmlnaW5hbCBcY29kZXtQQVRIX0lORk99CitvciBcY29kZXtTQ1JJUFRfTkFNRX0gaW50YWN0LgorCitJZiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHBhdGggc2VnbWVudHMgaW4gXGNvZGV7UEFUSF9JTkZPfSwgXGNvZGV7Tm9uZX0KK2lzIHJldHVybmVkLgorCitUeXBpY2FsbHksIHRoaXMgcm91dGluZSBpcyB1c2VkIHRvIHByb2Nlc3MgZWFjaCBwb3J0aW9uIG9mIGEgcmVxdWVzdAorVVJJIHBhdGgsIGZvciBleGFtcGxlIHRvIHRyZWF0IHRoZSBwYXRoIGFzIGEgc2VyaWVzIG9mIGRpY3Rpb25hcnkga2V5cy4KK1RoaXMgcm91dGluZSBtb2RpZmllcyB0aGUgcGFzc2VkLWluIGVudmlyb25tZW50IHRvIG1ha2UgaXQgc3VpdGFibGUgZm9yCitpbnZva2luZyBhbm90aGVyIFdTR0kgYXBwbGljYXRpb24gdGhhdCBpcyBsb2NhdGVkIGF0IHRoZSB0YXJnZXQgVVJJLgorRm9yIGV4YW1wbGUsIGlmIHRoZXJlIGlzIGEgV1NHSSBhcHBsaWNhdGlvbiBhdCBcY29kZXsvZm9vfSwgYW5kIHRoZQorcmVxdWVzdCBVUkkgcGF0aCBpcyBcY29kZXsvZm9vL2Jhci9iYXp9LCBhbmQgdGhlIFdTR0kgYXBwbGljYXRpb24gYXQKK1xjb2Rley9mb299IGNhbGxzIFxmdW5jdGlvbntzaGlmdF9wYXRoX2luZm99LCBpdCB3aWxsIHJlY2VpdmUgdGhlIHN0cmluZworYGBiYXInJywgYW5kIHRoZSBlbnZpcm9ubWVudCB3aWxsIGJlIHVwZGF0ZWQgdG8gYmUgc3VpdGFibGUgZm9yIHBhc3NpbmcKK3RvIGEgV1NHSSBhcHBsaWNhdGlvbiBhdCBcY29kZXsvZm9vL2Jhcn0uICBUaGF0IGlzLCBcY29kZXtTQ1JJUFRfTkFNRX0KK3dpbGwgY2hhbmdlIGZyb20gXGNvZGV7L2Zvb30gdG8gXGNvZGV7L2Zvby9iYXJ9LCBhbmQgXGNvZGV7UEFUSF9JTkZPfQord2lsbCBjaGFuZ2UgZnJvbSBcY29kZXsvYmFyL2Jhen0gdG8gXGNvZGV7L2Jhen0uCisKK1doZW4gXGNvZGV7UEFUSF9JTkZPfSBpcyBqdXN0IGEgYGAvJycsIHRoaXMgcm91dGluZSByZXR1cm5zIGFuIGVtcHR5CitzdHJpbmcgYW5kIGFwcGVuZHMgYSB0cmFpbGluZyBzbGFzaCB0byBcY29kZXtTQ1JJUFRfTkFNRX0sIGV2ZW4gdGhvdWdoCitlbXB0eSBwYXRoIHNlZ21lbnRzIGFyZSBub3JtYWxseSBpZ25vcmVkLCBhbmQgXGNvZGV7U0NSSVBUX05BTUV9IGRvZXNuJ3QKK25vcm1hbGx5IGVuZCBpbiBhIHNsYXNoLiAgVGhpcyBpcyBpbnRlbnRpb25hbCBiZWhhdmlvciwgdG8gZW5zdXJlIHRoYXQKK2FuIGFwcGxpY2F0aW9uIGNhbiB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gVVJJcyBlbmRpbmcgaW4gXGNvZGV7L3h9Citmcm9tIG9uZXMgZW5kaW5nIGluIFxjb2Rley94L30gd2hlbiB1c2luZyB0aGlzIHJvdXRpbmUgdG8gZG8gb2JqZWN0Cit0cmF2ZXJzYWwuCisKK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntmdW5jZGVzY317c2V0dXBfdGVzdGluZ19kZWZhdWx0c317ZW52aXJvbn0KK1VwZGF0ZSBcdmFye2Vudmlyb259IHdpdGggdHJpdmlhbCBkZWZhdWx0cyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKworVGhpcyByb3V0aW5lIGFkZHMgdmFyaW91cyBwYXJhbWV0ZXJzIHJlcXVpcmVkIGZvciBXU0dJLCBpbmNsdWRpbmcKK1xjb2Rle0hUVFBfSE9TVH0sIFxjb2Rle1NFUlZFUl9OQU1FfSwgXGNvZGV7U0VSVkVSX1BPUlR9LAorXGNvZGV7UkVRVUVTVF9NRVRIT0R9LCBcY29kZXtTQ1JJUFRfTkFNRX0sIFxjb2Rle1BBVEhfSU5GT30sIGFuZCBhbGwgb2YKK3RoZSBccGVwezMzM30tZGVmaW5lZCBcY29kZXt3c2dpLip9IHZhcmlhYmxlcy4gIEl0IG9ubHkgc3VwcGxpZXMgZGVmYXVsdAordmFsdWVzLCBhbmQgZG9lcyBub3QgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgc2V0dGluZ3MgZm9yIHRoZXNlIHZhcmlhYmxlcy4KKworVGhpcyByb3V0aW5lIGlzIGludGVuZGVkIHRvIG1ha2UgaXQgZWFzaWVyIGZvciB1bml0IHRlc3RzIG9mIFdTR0kKK3NlcnZlcnMgYW5kIGFwcGxpY2F0aW9ucyB0byBzZXQgdXAgZHVtbXkgZW52aXJvbm1lbnRzLiAgSXQgc2hvdWxkIE5PVAorYmUgdXNlZCBieSBhY3R1YWwgV1NHSSBzZXJ2ZXJzIG9yIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIGRhdGEgaXMgZmFrZSEKK1xlbmR7ZnVuY2Rlc2N9CisKKworCitJbiBhZGRpdGlvbiB0byB0aGUgZW52aXJvbm1lbnQgZnVuY3Rpb25zIGFib3ZlLCB0aGUKK1xtb2R1bGV7d3NnaXJlZi51dGlsfSBtb2R1bGUgYWxzbyBwcm92aWRlcyB0aGVzZSBtaXNjZWxsYW5lb3VzCit1dGlsaXRpZXM6CisKK1xiZWdpbntmdW5jZGVzY317aXNfaG9wX2J5X2hvcH17aGVhZGVyX25hbWV9CitSZXR1cm4gdHJ1ZSBpZiAnaGVhZGVyX25hbWUnIGlzIGFuIEhUVFAvMS4xIGBgSG9wLWJ5LUhvcCcnIGhlYWRlciwgYXMKK2RlZmluZWQgYnkgXHJmY3syNjE2fS4KK1xlbmR7ZnVuY2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0ZpbGVXcmFwcGVyfXtmaWxlbGlrZSBcb3B0aW9uYWx7LCBibGtzaXplPTgxOTJ9fQorQSB3cmFwcGVyIHRvIGNvbnZlcnQgYSBmaWxlLWxpa2Ugb2JqZWN0IHRvIGFuIGl0ZXJhdG9yLiAgVGhlIHJlc3VsdGluZworb2JqZWN0cyBzdXBwb3J0IGJvdGggXG1ldGhvZHtfX2dldGl0ZW1fX30gYW5kIFxtZXRob2R7X19pdGVyX199CitpdGVyYXRpb24gc3R5bGVzLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIFB5dGhvbiAyLjEgYW5kIEp5dGhvbi4KK0FzIHRoZSBvYmplY3QgaXMgaXRlcmF0ZWQgb3ZlciwgdGhlIG9wdGlvbmFsIFx2YXJ7Ymxrc2l6ZX0gcGFyYW1ldGVyCit3aWxsIGJlIHJlcGVhdGVkbHkgcGFzc2VkIHRvIHRoZSBcdmFye2ZpbGVsaWtlfSBvYmplY3QncyBcbWV0aG9ke3JlYWQoKX0KK21ldGhvZCB0byBvYnRhaW4gc3RyaW5ncyB0byB5aWVsZC4gIFdoZW4gXG1ldGhvZHtyZWFkKCl9IHJldHVybnMgYW4KK2VtcHR5IHN0cmluZywgaXRlcmF0aW9uIGlzIGVuZGVkIGFuZCBpcyBub3QgcmVzdW1hYmxlLgorCitJZiBcdmFye2ZpbGVsaWtlfSBoYXMgYSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCwgdGhlIHJldHVybmVkIG9iamVjdAord2lsbCBhbHNvIGhhdmUgYSBcbWV0aG9ke2Nsb3NlKCl9IG1ldGhvZCwgYW5kIGl0IHdpbGwgaW52b2tlIHRoZQorXHZhcntmaWxlbGlrZX0gb2JqZWN0J3MgXG1ldGhvZHtjbG9zZSgpfSBtZXRob2Qgd2hlbiBjYWxsZWQuCitcZW5ke2NsYXNzZGVzY30KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLmhlYWRlcnN9IC0tIFdTR0kgcmVzcG9uc2UgaGVhZGVyIHRvb2xzfQorXGRlY2xhcmVtb2R1bGV7fXt3c2dpcmVmLmhlYWRlcnN9CisKK1RoaXMgbW9kdWxlIHByb3ZpZGVzIGEgc2luZ2xlIGNsYXNzLCBcY2xhc3N7SGVhZGVyc30sIGZvciBjb252ZW5pZW50CittYW5pcHVsYXRpb24gb2YgV1NHSSByZXNwb25zZSBoZWFkZXJzIHVzaW5nIGEgbWFwcGluZy1saWtlIGludGVyZmFjZS4KKworXGJlZ2lue2NsYXNzZGVzY317SGVhZGVyc317aGVhZGVyc30KK0NyZWF0ZSBhIG1hcHBpbmctbGlrZSBvYmplY3Qgd3JhcHBpbmcgXHZhcntoZWFkZXJzfSwgd2hpY2ggbXVzdCBiZSBhCitsaXN0IG9mIGhlYWRlciBuYW1lL3ZhbHVlIHR1cGxlcyBhcyBkZXNjcmliZWQgaW4gXHBlcHszMzN9LiAgQW55IGNoYW5nZXMKK21hZGUgdG8gdGhlIG5ldyBcY2xhc3N7SGVhZGVyc30gb2JqZWN0IHdpbGwgZGlyZWN0bHkgdXBkYXRlIHRoZQorXHZhcntoZWFkZXJzfSBsaXN0IGl0IHdhcyBjcmVhdGVkIHdpdGguCisKK1xjbGFzc3tIZWFkZXJzfSBvYmplY3RzIHN1cHBvcnQgdHlwaWNhbCBtYXBwaW5nIG9wZXJhdGlvbnMgaW5jbHVkaW5nCitcbWV0aG9ke19fZ2V0aXRlbV9ffSwgXG1ldGhvZHtnZXR9LCBcbWV0aG9ke19fc2V0aXRlbV9ffSwKK1xtZXRob2R7c2V0ZGVmYXVsdH0sIFxtZXRob2R7X19kZWxpdGVtX199LCBcbWV0aG9ke19fY29udGFpbnNfX30gYW5kCitcbWV0aG9ke2hhc19rZXl9LiAgRm9yIGVhY2ggb2YgdGhlc2UgbWV0aG9kcywgdGhlIGtleSBpcyB0aGUgaGVhZGVyIG5hbWUKKyh0cmVhdGVkIGNhc2UtaW5zZW5zaXRpdmVseSksIGFuZCB0aGUgdmFsdWUgaXMgdGhlIGZpcnN0IHZhbHVlCithc3NvY2lhdGVkIHdpdGggdGhhdCBoZWFkZXIgbmFtZS4gIFNldHRpbmcgYSBoZWFkZXIgZGVsZXRlcyBhbnkgZXhpc3RpbmcKK3ZhbHVlcyBmb3IgdGhhdCBoZWFkZXIsIHRoZW4gYWRkcyBhIG5ldyB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSB3cmFwcGVkCitoZWFkZXIgbGlzdC4gIEhlYWRlcnMnIGV4aXN0aW5nIG9yZGVyIGlzIGdlbmVyYWxseSBtYWludGFpbmVkLCB3aXRoIG5ldworaGVhZGVycyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSB3cmFwcGVkIGxpc3QuCisKK1VubGlrZSBhIGRpY3Rpb25hcnksIFxjbGFzc3tIZWFkZXJzfSBvYmplY3RzIGRvIG5vdCByYWlzZSBhbiBlcnJvciB3aGVuCit5b3UgdHJ5IHRvIGdldCBvciBkZWxldGUgYSBrZXkgdGhhdCBpc24ndCBpbiB0aGUgd3JhcHBlZCBoZWFkZXIgbGlzdC4KK0dldHRpbmcgYSBub25leGlzdGVudCBoZWFkZXIganVzdCByZXR1cm5zIFxjb2Rle05vbmV9LCBhbmQgZGVsZXRpbmcKK2Egbm9uZXhpc3RlbnQgaGVhZGVyIGRvZXMgbm90aGluZy4KKworXGNsYXNze0hlYWRlcnN9IG9iamVjdHMgYWxzbyBzdXBwb3J0IFxtZXRob2R7a2V5cygpfSwgXG1ldGhvZHt2YWx1ZXMoKX0sCithbmQgXG1ldGhvZHtpdGVtcygpfSBtZXRob2RzLiAgVGhlIGxpc3RzIHJldHVybmVkIGJ5IFxtZXRob2R7a2V5cygpfQorYW5kIFxtZXRob2R7aXRlbXMoKX0gY2FuIGluY2x1ZGUgdGhlIHNhbWUga2V5IG1vcmUgdGhhbiBvbmNlIGlmIHRoZXJlCitpcyBhIG11bHRpLXZhbHVlZCBoZWFkZXIuICBUaGUgXGNvZGV7bGVuKCl9IG9mIGEgXGNsYXNze0hlYWRlcnN9IG9iamVjdAoraXMgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiBpdHMgXG1ldGhvZHtpdGVtcygpfSwgd2hpY2ggaXMgdGhlIHNhbWUKK2FzIHRoZSBsZW5ndGggb2YgdGhlIHdyYXBwZWQgaGVhZGVyIGxpc3QuICBJbiBmYWN0LCB0aGUgXG1ldGhvZHtpdGVtcygpfQorbWV0aG9kIGp1c3QgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHdyYXBwZWQgaGVhZGVyIGxpc3QuCisKK0NhbGxpbmcgXGNvZGV7c3RyKCl9IG9uIGEgXGNsYXNze0hlYWRlcnN9IG9iamVjdCByZXR1cm5zIGEgZm9ybWF0dGVkCitzdHJpbmcgc3VpdGFibGUgZm9yIHRyYW5zbWlzc2lvbiBhcyBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuICBFYWNoIGhlYWRlcgoraXMgcGxhY2VkIG9uIGEgbGluZSB3aXRoIGl0cyB2YWx1ZSwgc2VwYXJhdGVkIGJ5IGEgY29sb24gYW5kIGEgc3BhY2UuCitFYWNoIGxpbmUgaXMgdGVybWluYXRlZCBieSBhIGNhcnJpYWdlIHJldHVybiBhbmQgbGluZSBmZWVkLCBhbmQgdGhlCitzdHJpbmcgaXMgdGVybWluYXRlZCB3aXRoIGEgYmxhbmsgbGluZS4KKworSW4gYWRkaXRpb24gdG8gdGhlaXIgbWFwcGluZyBpbnRlcmZhY2UgYW5kIGZvcm1hdHRpbmcgZmVhdHVyZXMsCitcY2xhc3N7SGVhZGVyc30gb2JqZWN0cyBhbHNvIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzIGZvciBxdWVyeWluZworYW5kIGFkZGluZyBtdWx0aS12YWx1ZWQgaGVhZGVycywgYW5kIGZvciBhZGRpbmcgaGVhZGVycyB3aXRoIE1JTUUKK3BhcmFtZXRlcnM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfYWxsfXtuYW1lfQorUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGhlYWRlci4KKworVGhlIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBzb3J0ZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyZWQgaW4gdGhlCitvcmlnaW5hbCBoZWFkZXIgbGlzdCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbgorZHVwbGljYXRlcy4gIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0bwordGhlIGhlYWRlciBsaXN0LiAgSWYgbm8gZmllbGRzIGV4aXN0IHdpdGggdGhlIGdpdmVuIG5hbWUsIHJldHVybnMgYW4KK2VtcHR5IGxpc3QuCitcZW5ke21ldGhvZGRlc2N9CisKKworXGJlZ2lue21ldGhvZGRlc2N9e2FkZF9oZWFkZXJ9e25hbWUsIHZhbHVlLCAqKl9wYXJhbXN9CitBZGQgYSAocG9zc2libHkgbXVsdGktdmFsdWVkKSBoZWFkZXIsIHdpdGggb3B0aW9uYWwgTUlNRSBwYXJhbWV0ZXJzCitzcGVjaWZpZWQgdmlhIGtleXdvcmQgYXJndW1lbnRzLgorCitcdmFye25hbWV9IGlzIHRoZSBoZWFkZXIgZmllbGQgdG8gYWRkLiAgS2V5d29yZCBhcmd1bWVudHMgY2FuIGJlIHVzZWQgdG8KK3NldCBNSU1FIHBhcmFtZXRlcnMgZm9yIHRoZSBoZWFkZXIgZmllbGQuICBFYWNoIHBhcmFtZXRlciBtdXN0IGJlIGEKK3N0cmluZyBvciBcY29kZXtOb25lfS4gIFVuZGVyc2NvcmVzIGluIHBhcmFtZXRlciBuYW1lcyBhcmUgY29udmVydGVkIHRvCitkYXNoZXMsIHNpbmNlIGRhc2hlcyBhcmUgaWxsZWdhbCBpbiBQeXRob24gaWRlbnRpZmllcnMsIGJ1dCBtYW55IE1JTUUKK3BhcmFtZXRlciBuYW1lcyBpbmNsdWRlIGRhc2hlcy4gIElmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgaXMgYSBzdHJpbmcsIGl0CitpcyBhZGRlZCB0byB0aGUgaGVhZGVyIHZhbHVlIHBhcmFtZXRlcnMgaW4gdGhlIGZvcm0gXGNvZGV7bmFtZT0idmFsdWUifS4KK0lmIGl0IGlzIFxjb2Rle05vbmV9LCBvbmx5IHRoZSBwYXJhbWV0ZXIgbmFtZSBpcyBhZGRlZC4gIChUaGlzIGlzIHVzZWQKK2ZvciBNSU1FIHBhcmFtZXRlcnMgd2l0aG91dCBhIHZhbHVlLikgIEV4YW1wbGUgdXNhZ2U6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2guYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorXGVuZHt2ZXJiYXRpbX0KKworVGhlIGFib3ZlIHdpbGwgYWRkIGEgaGVhZGVyIHRoYXQgbG9va3MgbGlrZSB0aGlzOgorCitcYmVnaW57dmVyYmF0aW19CitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0iYnVkLmdpZiIKK1xlbmR7dmVyYmF0aW19CitcZW5ke21ldGhvZGRlc2N9CitcZW5ke2NsYXNzZGVzY30KKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9IC0tIGEgc2ltcGxlIFdTR0kgSFRUUCBzZXJ2ZXJ9CitcZGVjbGFyZW1vZHVsZVt3c2dpcmVmLnNpbXBsZXNlcnZlcl17fXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9CisKK1RoaXMgbW9kdWxlIGltcGxlbWVudHMgYSBzaW1wbGUgSFRUUCBzZXJ2ZXIgKGJhc2VkIG9uCitcbW9kdWxle0Jhc2VIVFRQU2VydmVyfSkgdGhhdCBzZXJ2ZXMgV1NHSSBhcHBsaWNhdGlvbnMuICBFYWNoIHNlcnZlcgoraW5zdGFuY2Ugc2VydmVzIGEgc2luZ2xlIFdTR0kgYXBwbGljYXRpb24gb24gYSBnaXZlbiBob3N0IGFuZCBwb3J0LiAgSWYKK3lvdSB3YW50IHRvIHNlcnZlIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBvbiBhIHNpbmdsZSBob3N0IGFuZCBwb3J0LCB5b3UKK3Nob3VsZCBjcmVhdGUgYSBXU0dJIGFwcGxpY2F0aW9uIHRoYXQgcGFyc2VzIFxjb2Rle1BBVEhfSU5GT30gdG8gc2VsZWN0Cit3aGljaCBhcHBsaWNhdGlvbiB0byBpbnZva2UgZm9yIGVhY2ggcmVxdWVzdC4gIChFLmcuLCB1c2luZyB0aGUKK1xmdW5jdGlvbntzaGlmdF9wYXRoX2luZm8oKX0gZnVuY3Rpb24gZnJvbSBcbW9kdWxle3dzZ2lyZWYudXRpbH0uKQorCisKK1xiZWdpbntmdW5jZGVzY317bWFrZV9zZXJ2ZXJ9e2hvc3QsIHBvcnQsIGFwcAorXG9wdGlvbmFseywgc2VydmVyX2NsYXNzPVxjbGFzc3tXU0dJU2VydmVyfSBcb3B0aW9uYWx7LAoraGFuZGxlcl9jbGFzcz1cY2xhc3N7V1NHSVJlcXVlc3RIYW5kbGVyfX19fQorQ3JlYXRlIGEgbmV3IFdTR0kgc2VydmVyIGxpc3RlbmluZyBvbiBcdmFye2hvc3R9IGFuZCBcdmFye3BvcnR9LAorYWNjZXB0aW5nIGNvbm5lY3Rpb25zIGZvciBcdmFye2FwcH0uICBUaGUgcmV0dXJuIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mCit0aGUgc3VwcGxpZWQgXHZhcntzZXJ2ZXJfY2xhc3N9LCBhbmQgd2lsbCBwcm9jZXNzIHJlcXVlc3RzIHVzaW5nIHRoZQorc3BlY2lmaWVkIFx2YXJ7aGFuZGxlcl9jbGFzc30uICBcdmFye2FwcH0gbXVzdCBiZSBhIFdTR0kgYXBwbGljYXRpb24KK29iamVjdCwgYXMgZGVmaW5lZCBieSBccGVwezMzM30uCisKK0V4YW1wbGUgdXNhZ2U6CitcYmVnaW57dmVyYmF0aW19ZnJvbSB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIgaW1wb3J0IG1ha2Vfc2VydmVyLCBkZW1vX2FwcAorCitodHRwZCA9IG1ha2Vfc2VydmVyKCcnLCA4MDAwLCBkZW1vX2FwcCkKK3ByaW50ICJTZXJ2aW5nIEhUVFAgb24gcG9ydCA4MDAwLi4uIgorCisjIFJlc3BvbmQgdG8gcmVxdWVzdHMgdW50aWwgcHJvY2VzcyBpcyBraWxsZWQKK2h0dHBkLnNlcnZlX2ZvcmV2ZXIoKQorCisjIEFsdGVybmF0aXZlOiBzZXJ2ZSBvbmUgcmVxdWVzdCwgdGhlbiBleGl0CisjI2h0dHBkLmhhbmRsZV9yZXF1ZXN0KCkKK1xlbmR7dmVyYmF0aW19CisKK1xlbmR7ZnVuY2Rlc2N9CisKKworCisKKworCitcYmVnaW57ZnVuY2Rlc2N9e2RlbW9fYXBwfXtlbnZpcm9uLCBzdGFydF9yZXNwb25zZX0KK1RoaXMgZnVuY3Rpb24gaXMgYSBzbWFsbCBidXQgY29tcGxldGUgV1NHSSBhcHBsaWNhdGlvbiB0aGF0CityZXR1cm5zIGEgdGV4dCBwYWdlIGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UgYGBIZWxsbyB3b3JsZCEnJworYW5kIGEgbGlzdCBvZiB0aGUga2V5L3ZhbHVlIHBhaXJzIHByb3ZpZGVkIGluIHRoZQorXHZhcntlbnZpcm9ufSBwYXJhbWV0ZXIuICBJdCdzIHVzZWZ1bCBmb3IgdmVyaWZ5aW5nIHRoYXQgYSBXU0dJIHNlcnZlcgorKHN1Y2ggYXMgXG1vZHVsZXt3c2dpcmVmLnNpbXBsZV9zZXJ2ZXJ9KSBpcyBhYmxlIHRvIHJ1biBhIHNpbXBsZSBXU0dJCithcHBsaWNhdGlvbiBjb3JyZWN0bHkuCitcZW5ke2Z1bmNkZXNjfQorCisKK1xiZWdpbntjbGFzc2Rlc2N9e1dTR0lTZXJ2ZXJ9e3NlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzfQorQ3JlYXRlIGEgXGNsYXNze1dTR0lTZXJ2ZXJ9IGluc3RhbmNlLiAgXHZhcntzZXJ2ZXJfYWRkcmVzc30gc2hvdWxkIGJlCithIFxjb2Rleyhob3N0LHBvcnQpfSB0dXBsZSwgYW5kIFx2YXJ7UmVxdWVzdEhhbmRsZXJDbGFzc30gc2hvdWxkIGJlCit0aGUgc3ViY2xhc3Mgb2YgXGNsYXNze0Jhc2VIVFRQU2VydmVyLkJhc2VIVFRQUmVxdWVzdEhhbmRsZXJ9IHRoYXQgd2lsbAorYmUgdXNlZCB0byBwcm9jZXNzIHJlcXVlc3RzLgorCitZb3UgZG8gbm90IG5vcm1hbGx5IG5lZWQgdG8gY2FsbCB0aGlzIGNvbnN0cnVjdG9yLCBhcyB0aGUKK1xmdW5jdGlvbnttYWtlX3NlcnZlcigpfSBmdW5jdGlvbiBjYW4gaGFuZGxlIGFsbCB0aGUgZGV0YWlscyBmb3IgeW91LgorCitcY2xhc3N7V1NHSVNlcnZlcn0gaXMgYSBzdWJjbGFzcworb2YgXGNsYXNze0Jhc2VIVFRQU2VydmVyLkhUVFBTZXJ2ZXJ9LCBzbyBhbGwgb2YgaXRzIG1ldGhvZHMgKHN1Y2ggYXMKK1xtZXRob2R7c2VydmVfZm9yZXZlcigpfSBhbmQgXG1ldGhvZHtoYW5kbGVfcmVxdWVzdCgpfSkgYXJlIGF2YWlsYWJsZS4KK1xjbGFzc3tXU0dJU2VydmVyfSBhbHNvIHByb3ZpZGVzIHRoZXNlIFdTR0ktc3BlY2lmaWMgbWV0aG9kczoKKworXGJlZ2lue21ldGhvZGRlc2N9e3NldF9hcHB9e2FwcGxpY2F0aW9ufQorU2V0cyB0aGUgY2FsbGFibGUgXHZhcnthcHBsaWNhdGlvbn0gYXMgdGhlIFdTR0kgYXBwbGljYXRpb24gdGhhdCB3aWxsCityZWNlaXZlIHJlcXVlc3RzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X2FwcH17fQorUmV0dXJucyB0aGUgY3VycmVudGx5LXNldCBhcHBsaWNhdGlvbiBjYWxsYWJsZS4KK1xlbmR7bWV0aG9kZGVzY30KKworTm9ybWFsbHksIGhvd2V2ZXIsIHlvdSBkbyBub3QgbmVlZCB0byB1c2UgdGhlc2UgYWRkaXRpb25hbCBtZXRob2RzLCBhcworXG1ldGhvZHtzZXRfYXBwKCl9IGlzIG5vcm1hbGx5IGNhbGxlZCBieSBcZnVuY3Rpb257bWFrZV9zZXJ2ZXIoKX0sIGFuZAordGhlIFxtZXRob2R7Z2V0X2FwcCgpfSBleGlzdHMgbWFpbmx5IGZvciB0aGUgYmVuZWZpdCBvZiByZXF1ZXN0IGhhbmRsZXIKK2luc3RhbmNlcy4KK1xlbmR7Y2xhc3NkZXNjfQorCisKKworXGJlZ2lue2NsYXNzZGVzY317V1NHSVJlcXVlc3RIYW5kbGVyfXtyZXF1ZXN0LCBjbGllbnRfYWRkcmVzcywgc2VydmVyfQorQ3JlYXRlIGFuIEhUVFAgaGFuZGxlciBmb3IgdGhlIGdpdmVuIFx2YXJ7cmVxdWVzdH0gKGkuZS4gYSBzb2NrZXQpLAorXHZhcntjbGllbnRfYWRkcmVzc30gKGEgXGNvZGV7KFx2YXJ7aG9zdH0sXHZhcntwb3J0fSl9IHR1cGxlKSwgYW5kCitcdmFye3NlcnZlcn0gKFxjbGFzc3tXU0dJU2VydmVyfSBpbnN0YW5jZSkuCisKK1lvdSBkbyBub3QgbmVlZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHRoZXkgYXJlCithdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYXMgbmVlZGVkIGJ5IFxjbGFzc3tXU0dJU2VydmVyfSBvYmplY3RzLiAgWW91CitjYW4sIGhvd2V2ZXIsIHN1YmNsYXNzIHRoaXMgY2xhc3MgYW5kIHN1cHBseSBpdCBhcyBhIFx2YXJ7aGFuZGxlcl9jbGFzc30KK3RvIHRoZSBcZnVuY3Rpb257bWFrZV9zZXJ2ZXIoKX0gZnVuY3Rpb24uICBTb21lIHBvc3NpYmx5IHJlbGV2YW50CittZXRob2RzIGZvciBvdmVycmlkaW5nIGluIHN1YmNsYXNzZXM6CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfZW52aXJvbn17fQorUmV0dXJucyBhIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgV1NHSSBlbnZpcm9ubWVudCBmb3IgYSByZXF1ZXN0LiAgVGhlCitkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIFxjbGFzc3tXU0dJU2VydmVyfQorb2JqZWN0J3MgXG1lbWJlcntiYXNlX2Vudmlyb259IGRpY3Rpb25hcnkgYXR0cmlidXRlIGFuZCB0aGVuIGFkZHMKK3ZhcmlvdXMgaGVhZGVycyBkZXJpdmVkIGZyb20gdGhlIEhUVFAgcmVxdWVzdC4gIEVhY2ggY2FsbCB0byB0aGlzIG1ldGhvZAorc2hvdWxkIHJldHVybiBhIG5ldyBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSByZWxldmFudCBDR0kKK2Vudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgaW4gXHBlcHszMzN9LgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317Z2V0X3N0ZGVycn17fQorUmV0dXJuIHRoZSBvYmplY3QgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyB0aGUgXGNvZGV7d3NnaS5lcnJvcnN9IHN0cmVhbS4KK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgcmV0dXJucyBcY29kZXtzeXMuc3RkZXJyfS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2hhbmRsZX17fQorUHJvY2VzcyB0aGUgSFRUUCByZXF1ZXN0LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY3JlYXRlcyBhIGhhbmRsZXIKK2luc3RhbmNlIHVzaW5nIGEgXG1vZHVsZXt3c2dpcmVmLmhhbmRsZXJzfSBjbGFzcyB0byBpbXBsZW1lbnQgdGhlIGFjdHVhbAorV1NHSSBhcHBsaWNhdGlvbiBpbnRlcmZhY2UuCitcZW5ke21ldGhvZGRlc2N9CisKK1xlbmR7Y2xhc3NkZXNjfQorCisKKworCisKKworCisKKworXHN1YnNlY3Rpb257XG1vZHVsZXt3c2dpcmVmLnZhbGlkYXRlfSAtLSBXU0dJIGNvbmZvcm1hbmNlIGNoZWNrZXJ9CitcZGVjbGFyZW1vZHVsZXt9e3dzZ2lyZWYudmFsaWRhdGV9CitXaGVuIGNyZWF0aW5nIG5ldyBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdHMsIGZyYW1ld29ya3MsIHNlcnZlcnMsIG9yCittaWRkbGV3YXJlLCBpdCBjYW4gYmUgdXNlZnVsIHRvIHZhbGlkYXRlIHRoZSBuZXcgY29kZSdzIGNvbmZvcm1hbmNlCit1c2luZyBcbW9kdWxle3dzZ2lyZWYudmFsaWRhdGV9LiAgVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBmdW5jdGlvbiB0aGF0CitjcmVhdGVzIFdTR0kgYXBwbGljYXRpb24gb2JqZWN0cyB0aGF0IHZhbGlkYXRlIGNvbW11bmljYXRpb25zIGJldHdlZW4KK2EgV1NHSSBzZXJ2ZXIgb3IgZ2F0ZXdheSBhbmQgYSBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdCwgdG8gY2hlY2sgYm90aAorc2lkZXMgZm9yIHByb3RvY29sIGNvbmZvcm1hbmNlLgorCitOb3RlIHRoYXQgdGhpcyB1dGlsaXR5IGRvZXMgbm90IGd1YXJhbnRlZSBjb21wbGV0ZSBccGVwezMzM30gY29tcGxpYW5jZTsKK2FuIGFic2VuY2Ugb2YgZXJyb3JzIGZyb20gdGhpcyBtb2R1bGUgZG9lcyBub3QgbmVjZXNzYXJpbHkgbWVhbiB0aGF0CitlcnJvcnMgZG8gbm90IGV4aXN0LiAgSG93ZXZlciwgaWYgdGhpcyBtb2R1bGUgZG9lcyBwcm9kdWNlIGFuIGVycm9yLAordGhlbiBpdCBpcyB2aXJ0dWFsbHkgY2VydGFpbiB0aGF0IGVpdGhlciB0aGUgc2VydmVyIG9yIGFwcGxpY2F0aW9uIGlzCitub3QgMTAwXCUgY29tcGxpYW50LgorCitUaGlzIG1vZHVsZSBpcyBiYXNlZCBvbiB0aGUgXG1vZHVsZXtwYXN0ZS5saW50fSBtb2R1bGUgZnJvbSBJYW4KK0JpY2tpbmcncyBgYFB5dGhvbiBQYXN0ZScnIGxpYnJhcnkuCisKK1xiZWdpbntmdW5jZGVzY317dmFsaWRhdG9yfXthcHBsaWNhdGlvbn0KK1dyYXAgXHZhcnthcHBsaWNhdGlvbn0gYW5kIHJldHVybiBhIG5ldyBXU0dJIGFwcGxpY2F0aW9uIG9iamVjdC4gIFRoZQorcmV0dXJuZWQgYXBwbGljYXRpb24gd2lsbCBmb3J3YXJkIGFsbCByZXF1ZXN0cyB0byB0aGUgb3JpZ2luYWwKK1x2YXJ7YXBwbGljYXRpb259LCBhbmQgd2lsbCBjaGVjayB0aGF0IGJvdGggdGhlIFx2YXJ7YXBwbGljYXRpb259IGFuZAordGhlIHNlcnZlciBpbnZva2luZyBpdCBhcmUgY29uZm9ybWluZyB0byB0aGUgV1NHSSBzcGVjaWZpY2F0aW9uIGFuZCB0bworUkZDIDI2MTYuCisKK0FueSBkZXRlY3RlZCBub25jb25mb3JtYW5jZSByZXN1bHRzIGluIGFuIFxleGNlcHRpb257QXNzZXJ0aW9uRXJyb3J9CitiZWluZyByYWlzZWQ7IG5vdGUsIGhvd2V2ZXIsIHRoYXQgaG93IHRoZXNlIGVycm9ycyBhcmUgaGFuZGxlZCBpcworc2VydmVyLWRlcGVuZGVudC4gIEZvciBleGFtcGxlLCBcbW9kdWxle3dzZ2lyZWYuc2ltcGxlX3NlcnZlcn0gYW5kIG90aGVyCitzZXJ2ZXJzIGJhc2VkIG9uIFxtb2R1bGV7d3NnaXJlZi5oYW5kbGVyc30gKHRoYXQgZG9uJ3Qgb3ZlcnJpZGUgdGhlCitlcnJvciBoYW5kbGluZyBtZXRob2RzIHRvIGRvIHNvbWV0aGluZyBlbHNlKSB3aWxsIHNpbXBseSBvdXRwdXQgYQorbWVzc2FnZSB0aGF0IGFuIGVycm9yIGhhcyBvY2N1cnJlZCwgYW5kIGR1bXAgdGhlIHRyYWNlYmFjayB0bworXGNvZGV7c3lzLnN0ZGVycn0gb3Igc29tZSBvdGhlciBlcnJvciBzdHJlYW0uCisKK1RoaXMgd3JhcHBlciBtYXkgYWxzbyBnZW5lcmF0ZSBvdXRwdXQgdXNpbmcgdGhlIFxtb2R1bGV7d2FybmluZ3N9IG1vZHVsZQordG8gaW5kaWNhdGUgYmVoYXZpb3JzIHRoYXQgYXJlIHF1ZXN0aW9uYWJsZSBidXQgd2hpY2ggbWF5IG5vdCBhY3R1YWxseQorYmUgcHJvaGliaXRlZCBieSBccGVwezMzM30uICBVbmxlc3MgdGhleSBhcmUgc3VwcHJlc3NlZCB1c2luZyBQeXRob24KK2NvbW1hbmQtbGluZSBvcHRpb25zIG9yIHRoZSBcbW9kdWxle3dhcm5pbmdzfSBBUEksIGFueSBzdWNoIHdhcm5pbmdzCit3aWxsIGJlIHdyaXR0ZW4gdG8gXGNvZGV7c3lzLnN0ZGVycn0gKFxlbXBoe25vdH0gXGNvZGV7d3NnaS5lcnJvcnN9LAordW5sZXNzIHRoZXkgaGFwcGVuIHRvIGJlIHRoZSBzYW1lIG9iamVjdCkuCitcZW5ke2Z1bmNkZXNjfQorCitcc3Vic2VjdGlvbntcbW9kdWxle3dzZ2lyZWYuaGFuZGxlcnN9IC0tIHNlcnZlci9nYXRld2F5IGJhc2UgY2xhc3Nlc30KK1xkZWNsYXJlbW9kdWxle317d3NnaXJlZi5oYW5kbGVyc30KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgYmFzZSBoYW5kbGVyIGNsYXNzZXMgZm9yIGltcGxlbWVudGluZyBXU0dJIHNlcnZlcnMKK2FuZCBnYXRld2F5cy4gIFRoZXNlIGJhc2UgY2xhc3NlcyBoYW5kbGUgbW9zdCBvZiB0aGUgd29yayBvZgorY29tbXVuaWNhdGluZyB3aXRoIGEgV1NHSSBhcHBsaWNhdGlvbiwgYXMgbG9uZyBhcyB0aGV5IGFyZSBnaXZlbiBhCitDR0ktbGlrZSBlbnZpcm9ubWVudCwgYWxvbmcgd2l0aCBpbnB1dCwgb3V0cHV0LCBhbmQgZXJyb3Igc3RyZWFtcy4KKworCitcYmVnaW57Y2xhc3NkZXNjfXtDR0lIYW5kbGVyfXt9CitDR0ktYmFzZWQgaW52b2NhdGlvbiB2aWEgXGNvZGV7c3lzLnN0ZGlufSwgXGNvZGV7c3lzLnN0ZG91dH0sCitcY29kZXtzeXMuc3RkZXJyfSBhbmQgXGNvZGV7b3MuZW52aXJvbn0uICBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCithIFdTR0kgYXBwbGljYXRpb24gYW5kIHdhbnQgdG8gcnVuIGl0IGFzIGEgQ0dJIHNjcmlwdC4gIFNpbXBseSBpbnZva2UKK1xjb2Rle0NHSUhhbmRsZXIoKS5ydW4oYXBwKX0sIHdoZXJlIFxjb2Rle2FwcH0gaXMgdGhlIFdTR0kgYXBwbGljYXRpb24KK29iamVjdCB5b3Ugd2lzaCB0byBpbnZva2UuCisKK1RoaXMgY2xhc3MgaXMgYSBzdWJjbGFzcyBvZiBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9IHRoYXQgc2V0cworXGNvZGV7d3NnaS5ydW5fb25jZX0gdG8gdHJ1ZSwgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gdG8gZmFsc2UsIGFuZAorXGNvZGV7d3NnaS5tdWx0aXByb2Nlc3N9IHRvIHRydWUsIGFuZCBhbHdheXMgdXNlcyBcbW9kdWxle3N5c30gYW5kCitcbW9kdWxle29zfSB0byBvYnRhaW4gdGhlIG5lY2Vzc2FyeSBDR0kgc3RyZWFtcyBhbmQgZW52aXJvbm1lbnQuCitcZW5ke2NsYXNzZGVzY30KKworCitcYmVnaW57Y2xhc3NkZXNjfXtCYXNlQ0dJSGFuZGxlcn17c3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uCitcb3B0aW9uYWx7LCBtdWx0aXRocmVhZD1UcnVlIFxvcHRpb25hbHssIG11bHRpcHJvY2Vzcz1GYWxzZX19fQorCitTaW1pbGFyIHRvIFxjbGFzc3tDR0lIYW5kbGVyfSwgYnV0IGluc3RlYWQgb2YgdXNpbmcgdGhlIFxtb2R1bGV7c3lzfSBhbmQKK1xtb2R1bGV7b3N9IG1vZHVsZXMsIHRoZSBDR0kgZW52aXJvbm1lbnQgYW5kIEkvTyBzdHJlYW1zIGFyZSBzcGVjaWZpZWQKK2V4cGxpY2l0bHkuICBUaGUgXHZhcnttdWx0aXRocmVhZH0gYW5kIFx2YXJ7bXVsdGlwcm9jZXNzfSB2YWx1ZXMgYXJlCit1c2VkIHRvIHNldCB0aGUgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gYW5kIFxjb2Rle3dzZ2kubXVsdGlwcm9jZXNzfQorZmxhZ3MgZm9yIGFueSBhcHBsaWNhdGlvbnMgcnVuIGJ5IHRoZSBoYW5kbGVyIGluc3RhbmNlLgorCitUaGlzIGNsYXNzIGlzIGEgc3ViY2xhc3Mgb2YgXGNsYXNze1NpbXBsZUhhbmRsZXJ9IGludGVuZGVkIGZvciB1c2Ugd2l0aAorc29mdHdhcmUgb3RoZXIgdGhhbiBIVFRQIGBgb3JpZ2luIHNlcnZlcnMnJy4gIElmIHlvdSBhcmUgd3JpdGluZyBhCitnYXRld2F5IHByb3RvY29sIGltcGxlbWVudGF0aW9uIChzdWNoIGFzIENHSSwgRmFzdENHSSwgU0NHSSwgZXRjLikgdGhhdAordXNlcyBhIFxjb2Rle1N0YXR1czp9IGhlYWRlciB0byBzZW5kIGFuIEhUVFAgc3RhdHVzLCB5b3UgcHJvYmFibHkgd2FudAordG8gc3ViY2xhc3MgdGhpcyBpbnN0ZWFkIG9mIFxjbGFzc3tTaW1wbGVIYW5kbGVyfS4KK1xlbmR7Y2xhc3NkZXNjfQorCisKKworXGJlZ2lue2NsYXNzZGVzY317U2ltcGxlSGFuZGxlcn17c3RkaW4sIHN0ZG91dCwgc3RkZXJyLCBlbnZpcm9uCitcb3B0aW9uYWx7LG11bHRpdGhyZWFkPVRydWUgXG9wdGlvbmFseywgbXVsdGlwcm9jZXNzPUZhbHNlfX19CisKK1NpbWlsYXIgdG8gXGNsYXNze0Jhc2VDR0lIYW5kbGVyfSwgYnV0IGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBIVFRQIG9yaWdpbgorc2VydmVycy4gIElmIHlvdSBhcmUgd3JpdGluZyBhbiBIVFRQIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgeW91IHdpbGwKK3Byb2JhYmx5IHdhbnQgdG8gc3ViY2xhc3MgdGhpcyBpbnN0ZWFkIG9mIFxjbGFzc3tCYXNlQ0dJSGFuZGxlcn0KKworVGhpcyBjbGFzcyBpcyBhIHN1YmNsYXNzIG9mIFxjbGFzc3tCYXNlSGFuZGxlcn0uICBJdCBvdmVycmlkZXMgdGhlCitcbWV0aG9ke19faW5pdF9fKCl9LCBcbWV0aG9ke2dldF9zdGRpbigpfSwgXG1ldGhvZHtnZXRfc3RkZXJyKCl9LAorXG1ldGhvZHthZGRfY2dpX3ZhcnMoKX0sIFxtZXRob2R7X3dyaXRlKCl9LCBhbmQgXG1ldGhvZHtfZmx1c2goKX0KK21ldGhvZHMgdG8gc3VwcG9ydCBleHBsaWNpdGx5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IGFuZCBzdHJlYW1zIHZpYQordGhlIGNvbnN0cnVjdG9yLiAgVGhlIHN1cHBsaWVkIGVudmlyb25tZW50IGFuZCBzdHJlYW1zIGFyZSBzdG9yZWQgaW4KK3RoZSBcbWVtYmVye3N0ZGlufSwgXG1lbWJlcntzdGRvdXR9LCBcbWVtYmVye3N0ZGVycn0sIGFuZAorXG1lbWJlcntlbnZpcm9ufSBhdHRyaWJ1dGVzLgorXGVuZHtjbGFzc2Rlc2N9CisKK1xiZWdpbntjbGFzc2Rlc2N9e0Jhc2VIYW5kbGVyfXt9CitUaGlzIGlzIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHJ1bm5pbmcgV1NHSSBhcHBsaWNhdGlvbnMuICBFYWNoCitpbnN0YW5jZSB3aWxsIGhhbmRsZSBhIHNpbmdsZSBIVFRQIHJlcXVlc3QsIGFsdGhvdWdoIGluIHByaW5jaXBsZSB5b3UKK2NvdWxkIGNyZWF0ZSBhIHN1YmNsYXNzIHRoYXQgd2FzIHJldXNhYmxlIGZvciBtdWx0aXBsZSByZXF1ZXN0cy4KKworXGNsYXNze0Jhc2VIYW5kbGVyfSBpbnN0YW5jZXMgaGF2ZSBvbmx5IG9uZSBtZXRob2QgaW50ZW5kZWQgZm9yIGV4dGVybmFsCit1c2U6CisKK1xiZWdpbnttZXRob2RkZXNjfXtydW59e2FwcH0KK1J1biB0aGUgc3BlY2lmaWVkIFdTR0kgYXBwbGljYXRpb24sIFx2YXJ7YXBwfS4KK1xlbmR7bWV0aG9kZGVzY30KKworQWxsIG9mIHRoZSBvdGhlciBcY2xhc3N7QmFzZUhhbmRsZXJ9IG1ldGhvZHMgYXJlIGludm9rZWQgYnkgdGhpcyBtZXRob2QKK2luIHRoZSBwcm9jZXNzIG9mIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uLCBhbmQgdGh1cyBleGlzdCBwcmltYXJpbHkgdG8KK2FsbG93IGN1c3RvbWl6aW5nIHRoZSBwcm9jZXNzLgorCitUaGUgZm9sbG93aW5nIG1ldGhvZHMgTVVTVCBiZSBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3M6CisKK1xiZWdpbnttZXRob2RkZXNjfXtfd3JpdGV9e2RhdGF9CitCdWZmZXIgdGhlIHN0cmluZyBcdmFye2RhdGF9IGZvciB0cmFuc21pc3Npb24gdG8gdGhlIGNsaWVudC4gIEl0J3Mgb2theQoraWYgdGhpcyBtZXRob2QgYWN0dWFsbHkgdHJhbnNtaXRzIHRoZSBkYXRhOyBcY2xhc3N7QmFzZUhhbmRsZXJ9CitqdXN0IHNlcGFyYXRlcyB3cml0ZSBhbmQgZmx1c2ggb3BlcmF0aW9ucyBmb3IgZ3JlYXRlciBlZmZpY2llbmN5Cit3aGVuIHRoZSB1bmRlcmx5aW5nIHN5c3RlbSBhY3R1YWxseSBoYXMgc3VjaCBhIGRpc3RpbmN0aW9uLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317X2ZsdXNofXt9CitGb3JjZSBidWZmZXJlZCBkYXRhIHRvIGJlIHRyYW5zbWl0dGVkIHRvIHRoZSBjbGllbnQuICBJdCdzIG9rYXkgaWYgdGhpcworbWV0aG9kIGlzIGEgbm8tb3AgKGkuZS4sIGlmIFxtZXRob2R7X3dyaXRlKCl9IGFjdHVhbGx5IHNlbmRzIHRoZSBkYXRhKS4KK1xlbmR7bWV0aG9kZGVzY30KKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zdGRpbn17fQorUmV0dXJuIGFuIGlucHV0IHN0cmVhbSBvYmplY3Qgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUgXGNvZGV7d3NnaS5pbnB1dH0KK29mIHRoZSByZXF1ZXN0IGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZXRob2RkZXNjfXtnZXRfc3RkZXJyfXt9CitSZXR1cm4gYW4gb3V0cHV0IHN0cmVhbSBvYmplY3Qgc3VpdGFibGUgZm9yIHVzZSBhcyB0aGUKK1xjb2Rle3dzZ2kuZXJyb3JzfSBvZiB0aGUgcmVxdWVzdCBjdXJyZW50bHkgYmVpbmcgcHJvY2Vzc2VkLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317YWRkX2NnaV92YXJzfXt9CitJbnNlcnQgQ0dJIHZhcmlhYmxlcyBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBpbnRvIHRoZSBcbWVtYmVye2Vudmlyb259CithdHRyaWJ1dGUuCitcZW5ke21ldGhvZGRlc2N9CisKK0hlcmUgYXJlIHNvbWUgb3RoZXIgbWV0aG9kcyBhbmQgYXR0cmlidXRlcyB5b3UgbWF5IHdpc2ggdG8gb3ZlcnJpZGUuCitUaGlzIGxpc3QgaXMgb25seSBhIHN1bW1hcnksIGhvd2V2ZXIsIGFuZCBkb2VzIG5vdCBpbmNsdWRlIGV2ZXJ5IG1ldGhvZAordGhhdCBjYW4gYmUgb3ZlcnJpZGRlbi4gIFlvdSBzaG91bGQgY29uc3VsdCB0aGUgZG9jc3RyaW5ncyBhbmQgc291cmNlCitjb2RlIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGNyZWF0ZSBhIGN1c3RvbWl6ZWQKK1xjbGFzc3tCYXNlSGFuZGxlcn0gc3ViY2xhc3MuCisKKworCisKKworCisKKworCisKKworCisKKworCisKK0F0dHJpYnV0ZXMgYW5kIG1ldGhvZHMgZm9yIGN1c3RvbWl6aW5nIHRoZSBXU0dJIGVudmlyb25tZW50OgorCitcYmVnaW57bWVtYmVyZGVzY317d3NnaV9tdWx0aXRocmVhZH0KK1RoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciB0aGUgXGNvZGV7d3NnaS5tdWx0aXRocmVhZH0gZW52aXJvbm1lbnQKK3ZhcmlhYmxlLiAgSXQgZGVmYXVsdHMgdG8gdHJ1ZSBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQgbWF5IGhhdmUKK2EgZGlmZmVyZW50IGRlZmF1bHQgKG9yIGJlIHNldCBieSB0aGUgY29uc3RydWN0b3IpIGluIHRoZSBvdGhlcgorc3ViY2xhc3Nlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfbXVsdGlwcm9jZXNzfQorVGhlIHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBcY29kZXt3c2dpLm11bHRpcHJvY2Vzc30gZW52aXJvbm1lbnQKK3ZhcmlhYmxlLiAgSXQgZGVmYXVsdHMgdG8gdHJ1ZSBpbiBcY2xhc3N7QmFzZUhhbmRsZXJ9LCBidXQgbWF5IGhhdmUKK2EgZGlmZmVyZW50IGRlZmF1bHQgKG9yIGJlIHNldCBieSB0aGUgY29uc3RydWN0b3IpIGluIHRoZSBvdGhlcgorc3ViY2xhc3Nlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfcnVuX29uY2V9CitUaGUgdmFsdWUgdG8gYmUgdXNlZCBmb3IgdGhlIFxjb2Rle3dzZ2kucnVuX29uY2V9IGVudmlyb25tZW50Cit2YXJpYWJsZS4gIEl0IGRlZmF1bHRzIHRvIGZhbHNlIGluIFxjbGFzc3tCYXNlSGFuZGxlcn0sIGJ1dAorXGNsYXNze0NHSUhhbmRsZXJ9IHNldHMgaXQgdG8gdHJ1ZSBieSBkZWZhdWx0LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317b3NfZW52aXJvbn0KK1RoZSBkZWZhdWx0IGVudmlyb25tZW50IHZhcmlhYmxlcyB0byBiZSBpbmNsdWRlZCBpbiBldmVyeSByZXF1ZXN0J3MKK1dTR0kgZW52aXJvbm1lbnQuICBCeSBkZWZhdWx0LCB0aGlzIGlzIGEgY29weSBvZiBcY29kZXtvcy5lbnZpcm9ufSBhdAordGhlIHRpbWUgdGhhdCBcbW9kdWxle3dzZ2lyZWYuaGFuZGxlcnN9IHdhcyBpbXBvcnRlZCwgYnV0IHN1YmNsYXNzZXMgY2FuCitlaXRoZXIgY3JlYXRlIHRoZWlyIG93biBhdCB0aGUgY2xhc3Mgb3IgaW5zdGFuY2UgbGV2ZWwuICBOb3RlIHRoYXQgdGhlCitkaWN0aW9uYXJ5IHNob3VsZCBiZSBjb25zaWRlcmVkIHJlYWQtb25seSwgc2luY2UgdGhlIGRlZmF1bHQgdmFsdWUgaXMKK3NoYXJlZCBiZXR3ZWVuIG11bHRpcGxlIGNsYXNzZXMgYW5kIGluc3RhbmNlcy4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e3NlcnZlcl9zb2Z0d2FyZX0KK0lmIHRoZSBcbWVtYmVye29yaWdpbl9zZXJ2ZXJ9IGF0dHJpYnV0ZSBpcyBzZXQsIHRoaXMgYXR0cmlidXRlJ3MgdmFsdWUKK2lzIHVzZWQgdG8gc2V0IHRoZSBkZWZhdWx0IFxjb2Rle1NFUlZFUl9TT0ZUV0FSRX0gV1NHSSBlbnZpcm9ubWVudAordmFyaWFibGUsIGFuZCBhbHNvIHRvIHNldCBhIGRlZmF1bHQgXGNvZGV7U2VydmVyOn0gaGVhZGVyIGluIEhUVFAKK3Jlc3BvbnNlcy4gIEl0IGlzIGlnbm9yZWQgZm9yIGhhbmRsZXJzIChzdWNoIGFzIFxjbGFzc3tCYXNlQ0dJSGFuZGxlcn0KK2FuZCBcY2xhc3N7Q0dJSGFuZGxlcn0pIHRoYXQgYXJlIG5vdCBIVFRQIG9yaWdpbiBzZXJ2ZXJzLgorXGVuZHttZW1iZXJkZXNjfQorCisKKworXGJlZ2lue21ldGhvZGRlc2N9e2dldF9zY2hlbWV9e30KK1JldHVybiB0aGUgVVJMIHNjaGVtZSBiZWluZyB1c2VkIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LiAgVGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIHVzZXMgdGhlIFxmdW5jdGlvbntndWVzc19zY2hlbWUoKX0gZnVuY3Rpb24gZnJvbQorXG1vZHVsZXt3c2dpcmVmLnV0aWx9IHRvIGd1ZXNzIHdoZXRoZXIgdGhlIHNjaGVtZSBzaG91bGQgYmUgYGBodHRwJycgb3IKK2BgaHR0cHMnJywgYmFzZWQgb24gdGhlIGN1cnJlbnQgcmVxdWVzdCdzIFxtZW1iZXJ7ZW52aXJvbn0gdmFyaWFibGVzLgorXGVuZHttZXRob2RkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2V0dXBfZW52aXJvbn17fQorU2V0IHRoZSBcbWVtYmVye2Vudmlyb259IGF0dHJpYnV0ZSB0byBhIGZ1bGx5LXBvcHVsYXRlZCBXU0dJCitlbnZpcm9ubWVudC4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMgYWxsIG9mIHRoZSBhYm92ZSBtZXRob2RzCithbmQgYXR0cmlidXRlcywgcGx1cyB0aGUgXG1ldGhvZHtnZXRfc3RkaW4oKX0sIFxtZXRob2R7Z2V0X3N0ZGVycigpfSwKK2FuZCBcbWV0aG9ke2FkZF9jZ2lfdmFycygpfSBtZXRob2RzIGFuZCB0aGUgXG1lbWJlcnt3c2dpX2ZpbGVfd3JhcHBlcn0KK2F0dHJpYnV0ZS4gIEl0IGFsc28gaW5zZXJ0cyBhIFxjb2Rle1NFUlZFUl9TT0ZUV0FSRX0ga2V5IGlmIG5vdCBwcmVzZW50LAorYXMgbG9uZyBhcyB0aGUgXG1lbWJlcntvcmlnaW5fc2VydmVyfSBhdHRyaWJ1dGUgaXMgYSB0cnVlIHZhbHVlIGFuZCB0aGUKK1xtZW1iZXJ7c2VydmVyX3NvZnR3YXJlfSBhdHRyaWJ1dGUgaXMgc2V0LgorXGVuZHttZXRob2RkZXNjfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIGZvciBjdXN0b21pemluZyBleGNlcHRpb24gaGFuZGxpbmc6CisKK1xiZWdpbnttZXRob2RkZXNjfXtsb2dfZXhjZXB0aW9ufXtleGNfaW5mb30KK0xvZyB0aGUgXHZhcntleGNfaW5mb30gdHVwbGUgaW4gdGhlIHNlcnZlciBsb2cuICBcdmFye2V4Y19pbmZvfSBpcyBhCitcY29kZXsoXHZhcnt0eXBlfSwgXHZhcnt2YWx1ZX0sIFx2YXJ7dHJhY2ViYWNrfSl9IHR1cGxlLiAgVGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIHNpbXBseSB3cml0ZXMgdGhlIHRyYWNlYmFjayB0byB0aGUgcmVxdWVzdCdzCitcY29kZXt3c2dpLmVycm9yc30gc3RyZWFtIGFuZCBmbHVzaGVzIGl0LiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcworbWV0aG9kIHRvIGNoYW5nZSB0aGUgZm9ybWF0IG9yIHJldGFyZ2V0IHRoZSBvdXRwdXQsIG1haWwgdGhlIHRyYWNlYmFjawordG8gYW4gYWRtaW5pc3RyYXRvciwgb3Igd2hhdGV2ZXIgb3RoZXIgYWN0aW9uIG1heSBiZSBkZWVtZWQgc3VpdGFibGUuCitcZW5ke21ldGhvZGRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXt0cmFjZWJhY2tfbGltaXR9CitUaGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRvIGluY2x1ZGUgaW4gdHJhY2ViYWNrcyBvdXRwdXQgYnkgdGhlCitkZWZhdWx0IFxtZXRob2R7bG9nX2V4Y2VwdGlvbigpfSBtZXRob2QuICBJZiBcY29kZXtOb25lfSwgYWxsIGZyYW1lcworYXJlIGluY2x1ZGVkLgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317ZXJyb3Jfb3V0cHV0fXtlbnZpcm9uLCBzdGFydF9yZXNwb25zZX0KK1RoaXMgbWV0aG9kIGlzIGEgV1NHSSBhcHBsaWNhdGlvbiB0byBnZW5lcmF0ZSBhbiBlcnJvciBwYWdlIGZvciB0aGUKK3VzZXIuICBJdCBpcyBvbmx5IGludm9rZWQgaWYgYW4gZXJyb3Igb2NjdXJzIGJlZm9yZSBoZWFkZXJzIGFyZSBzZW50Cit0byB0aGUgY2xpZW50LgorCitUaGlzIG1ldGhvZCBjYW4gYWNjZXNzIHRoZSBjdXJyZW50IGVycm9yIGluZm9ybWF0aW9uIHVzaW5nCitcY29kZXtzeXMuZXhjX2luZm8oKX0sIGFuZCBzaG91bGQgcGFzcyB0aGF0IGluZm9ybWF0aW9uIHRvCitcdmFye3N0YXJ0X3Jlc3BvbnNlfSB3aGVuIGNhbGxpbmcgaXQgKGFzIGRlc2NyaWJlZCBpbiB0aGUgYGBFcnJvcgorSGFuZGxpbmcnJyBzZWN0aW9uIG9mIFxwZXB7MzMzfSkuCisKK1RoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QgdXNlcyB0aGUgXG1lbWJlcntlcnJvcl9zdGF0dXN9LAorXG1lbWJlcntlcnJvcl9oZWFkZXJzfSwgYW5kIFxtZW1iZXJ7ZXJyb3JfYm9keX0gYXR0cmlidXRlcyB0byBnZW5lcmF0ZQorYW4gb3V0cHV0IHBhZ2UuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIHRvIHByb2R1Y2UgbW9yZSBkeW5hbWljCitlcnJvciBvdXRwdXQuCisKK05vdGUsIGhvd2V2ZXIsIHRoYXQgaXQncyBub3QgcmVjb21tZW5kZWQgZnJvbSBhIHNlY3VyaXR5IHBlcnNwZWN0aXZlIHRvCitzcGl0IG91dCBkaWFnbm9zdGljcyB0byBhbnkgb2xkIHVzZXI7IGlkZWFsbHksIHlvdSBzaG91bGQgaGF2ZSB0byBkbworc29tZXRoaW5nIHNwZWNpYWwgdG8gZW5hYmxlIGRpYWdub3N0aWMgb3V0cHV0LCB3aGljaCBpcyB3aHkgdGhlIGRlZmF1bHQKK2ltcGxlbWVudGF0aW9uIGRvZXNuJ3QgaW5jbHVkZSBhbnkuCitcZW5ke21ldGhvZGRlc2N9CisKKworCisKK1xiZWdpbnttZW1iZXJkZXNjfXtlcnJvcl9zdGF0dXN9CitUaGUgSFRUUCBzdGF0dXMgdXNlZCBmb3IgZXJyb3IgcmVzcG9uc2VzLiAgVGhpcyBzaG91bGQgYmUgYSBzdGF0dXMKK3N0cmluZyBhcyBkZWZpbmVkIGluIFxwZXB7MzMzfTsgaXQgZGVmYXVsdHMgdG8gYSA1MDAgY29kZSBhbmQgbWVzc2FnZS4KK1xlbmR7bWVtYmVyZGVzY30KKworXGJlZ2lue21lbWJlcmRlc2N9e2Vycm9yX2hlYWRlcnN9CitUaGUgSFRUUCBoZWFkZXJzIHVzZWQgZm9yIGVycm9yIHJlc3BvbnNlcy4gIFRoaXMgc2hvdWxkIGJlIGEgbGlzdCBvZgorV1NHSSByZXNwb25zZSBoZWFkZXJzIChcY29kZXsoXHZhcntuYW1lfSwgXHZhcnt2YWx1ZX0pfSB0dXBsZXMpLCBhcworZGVzY3JpYmVkIGluIFxwZXB7MzMzfS4gIFRoZSBkZWZhdWx0IGxpc3QganVzdCBzZXRzIHRoZSBjb250ZW50IHR5cGUKK3RvIFxjb2Rle3RleHQvcGxhaW59LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWVtYmVyZGVzY317ZXJyb3JfYm9keX0KK1RoZSBlcnJvciByZXNwb25zZSBib2R5LiAgVGhpcyBzaG91bGQgYmUgYW4gSFRUUCByZXNwb25zZSBib2R5IHN0cmluZy4KK0l0IGRlZmF1bHRzIHRvIHRoZSBwbGFpbiB0ZXh0LCBgYEEgc2VydmVyIGVycm9yIG9jY3VycmVkLiAgUGxlYXNlCitjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLicnCitcZW5ke21lbWJlcmRlc2N9CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitNZXRob2RzIGFuZCBhdHRyaWJ1dGVzIGZvciBccGVwezMzM30ncyBgYE9wdGlvbmFsIFBsYXRmb3JtLVNwZWNpZmljIEZpbGUKK0hhbmRsaW5nJycgZmVhdHVyZToKKworXGJlZ2lue21lbWJlcmRlc2N9e3dzZ2lfZmlsZV93cmFwcGVyfQorQSBcY29kZXt3c2dpLmZpbGVfd3JhcHBlcn0gZmFjdG9yeSwgb3IgXGNvZGV7Tm9uZX0uICBUaGUgZGVmYXVsdCB2YWx1ZQorb2YgdGhpcyBhdHRyaWJ1dGUgaXMgdGhlIFxjbGFzc3tGaWxlV3JhcHBlcn0gY2xhc3MgZnJvbQorXG1vZHVsZXt3c2dpcmVmLnV0aWx9LgorXGVuZHttZW1iZXJkZXNjfQorCitcYmVnaW57bWV0aG9kZGVzY317c2VuZGZpbGV9e30KK092ZXJyaWRlIHRvIGltcGxlbWVudCBwbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIHRyYW5zbWlzc2lvbi4gIFRoaXMgbWV0aG9kCitpcyBjYWxsZWQgb25seSBpZiB0aGUgYXBwbGljYXRpb24ncyByZXR1cm4gdmFsdWUgaXMgYW4gaW5zdGFuY2Ugb2YKK3RoZSBjbGFzcyBzcGVjaWZpZWQgYnkgdGhlIFxtZW1iZXJ7d3NnaV9maWxlX3dyYXBwZXJ9IGF0dHJpYnV0ZS4gIEl0CitzaG91bGQgcmV0dXJuIGEgdHJ1ZSB2YWx1ZSBpZiBpdCB3YXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgdHJhbnNtaXQgdGhlCitmaWxlLCBzbyB0aGF0IHRoZSBkZWZhdWx0IHRyYW5zbWlzc2lvbiBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkLgorVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QganVzdCByZXR1cm5zIGEgZmFsc2UgdmFsdWUuCitcZW5ke21ldGhvZGRlc2N9CisKKworTWlzY2VsbGFuZW91cyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzOgorCitcYmVnaW57bWVtYmVyZGVzY317b3JpZ2luX3NlcnZlcn0KK1RoaXMgYXR0cmlidXRlIHNob3VsZCBiZSBzZXQgdG8gYSB0cnVlIHZhbHVlIGlmIHRoZSBoYW5kbGVyJ3MKK1xtZXRob2R7X3dyaXRlKCl9IGFuZCBcbWV0aG9ke19mbHVzaCgpfSBhcmUgYmVpbmcgdXNlZCB0byBjb21tdW5pY2F0ZQorZGlyZWN0bHkgdG8gdGhlIGNsaWVudCwgcmF0aGVyIHRoYW4gdmlhIGEgQ0dJLWxpa2UgZ2F0ZXdheSBwcm90b2NvbCB0aGF0Cit3YW50cyB0aGUgSFRUUCBzdGF0dXMgaW4gYSBzcGVjaWFsIFxjb2Rle1N0YXR1czp9IGhlYWRlci4KKworVGhpcyBhdHRyaWJ1dGUncyBkZWZhdWx0IHZhbHVlIGlzIHRydWUgaW4gXGNsYXNze0Jhc2VIYW5kbGVyfSwgYnV0CitmYWxzZSBpbiBcY2xhc3N7QmFzZUNHSUhhbmRsZXJ9IGFuZCBcY2xhc3N7Q0dJSGFuZGxlcn0uCitcZW5ke21lbWJlcmRlc2N9CisKK1xiZWdpbnttZW1iZXJkZXNjfXtodHRwX3ZlcnNpb259CitJZiBcbWVtYmVye29yaWdpbl9zZXJ2ZXJ9IGlzIHRydWUsIHRoaXMgc3RyaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvCitzZXQgdGhlIEhUVFAgdmVyc2lvbiBvZiB0aGUgcmVzcG9uc2Ugc2V0IHRvIHRoZSBjbGllbnQuICBJdCBkZWZhdWx0cyB0bworXGNvZGV7IjEuMCJ9LgorXGVuZHttZW1iZXJkZXNjfQorCisKKworCisKK1xlbmR7Y2xhc3NkZXNjfQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4IGIvRG9jL2xpYi9saWJ6aXBmaWxlLnRleAppbmRleCA0ZTA2ZWY2Li4zZDgxZTUwIDEwMDY0NAotLS0gYS9Eb2MvbGliL2xpYnppcGZpbGUudGV4CisrKyBiL0RvYy9saWIvbGliemlwZmlsZS50ZXgKQEAgLTEzLDExICsxMywxMiBAQAogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdG9vbHMgdG8gY3JlYXRlLCByZWFkLCB3cml0ZSwgYXBwZW5kLCBhbmQgbGlzdCBhCiBaSVAgZmlsZS4gIEFueSBhZHZhbmNlZCB1c2Ugb2YgdGhpcyBtb2R1bGUgd2lsbCByZXF1aXJlIGFuCiB1bmRlcnN0YW5kaW5nIG9mIHRoZSBmb3JtYXQsIGFzIGRlZmluZWQgaW4KLVxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2FwcG5vdGUuaHRtbF17UEtaSVAgQXBwbGljYXRpb24KLU5vdGV9LgorXGNpdGV0aXRsZVtodHRwOi8vd3d3LnBrd2FyZS5jb20vYnVzaW5lc3NfYW5kX2RldmVsb3BlcnMvZGV2ZWxvcGVyL2FwcG5vdGUvXQore1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9LgogCiBUaGlzIG1vZHVsZSBkb2VzIG5vdCBjdXJyZW50bHkgaGFuZGxlIFpJUCBmaWxlcyB3aGljaCBoYXZlIGFwcGVuZGVkCi1jb21tZW50cywgb3IgbXVsdGktZGlzayBaSVAgZmlsZXMuCitjb21tZW50cywgb3IgbXVsdGktZGlzayBaSVAgZmlsZXMuIEl0IGNhbiBoYW5kbGUgWklQIGZpbGVzIHRoYXQgdXNlIHRoZSAKK1pJUDY0IGV4dGVuc2lvbnMgKHRoYXQgaXMgWklQIGZpbGVzIHRoYXQgYXJlIG1vcmUgdGhhbiA0IEdCeXRlIGluIHNpemUpLgogCiBUaGUgYXZhaWxhYmxlIGF0dHJpYnV0ZXMgb2YgdGhpcyBtb2R1bGUgYXJlOgogCkBAIC0yNSw2ICsyNiwxMSBAQAogICBUaGUgZXJyb3IgcmFpc2VkIGZvciBiYWQgWklQIGZpbGVzLgogXGVuZHtleGNkZXNjfQogCitcYmVnaW57ZXhjZGVzY317TGFyZ2VaaXBGaWxlfQorICBUaGUgZXJyb3IgcmFpc2VkIHdoZW4gYSBaSVAgZmlsZSB3b3VsZCByZXF1aXJlIFpJUDY0IGZ1bmN0aW9uYWxpdHkgYnV0IHRoYXQKKyAgaGFzIG5vdCBiZWVuIGVuYWJsZWQuCitcZW5ke2V4Y2Rlc2N9CisKIFxiZWdpbntjbGFzc2Rlc2MqfXtaaXBGaWxlfQogICBUaGUgY2xhc3MgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgWklQIGZpbGVzLiAgU2VlCiAgIGBgXGNpdGV0aXRsZXtaaXBGaWxlIE9iamVjdHN9JycgKHNlY3Rpb24gXHJlZnt6aXBmaWxlLW9iamVjdHN9KSBmb3IKQEAgLTY1LDkgKzcxLDkgQEAKIAogCiBcYmVnaW57c2VlYWxzb30KLSAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9hcHBub3RlLmh0bWxde1BLWklQIEFwcGxpY2F0aW9uCi0gICAgICAgICAgICBOb3RlfXtEb2N1bWVudGF0aW9uIG9uIHRoZSBaSVAgZmlsZSBmb3JtYXQgYnkgUGhpbAotICAgICAgICAgICAgS2F0eiwgdGhlIGNyZWF0b3Igb2YgdGhlIGZvcm1hdCBhbmQgYWxnb3JpdGhtcyB1c2VkLn0KKyAgXHNlZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9idXNpbmVzc19hbmRfZGV2ZWxvcGVycy9kZXZlbG9wZXIvYXBwbm90ZS9dCisgICAgICAgICAgIHtQS1pJUCBBcHBsaWNhdGlvbiBOb3RlfXtEb2N1bWVudGF0aW9uIG9uIHRoZSBaSVAgZmlsZSBmb3JtYXQgYnkKKyAgICAgICAgICAgIFBoaWwgS2F0eiwgdGhlIGNyZWF0b3Igb2YgdGhlIGZvcm1hdCBhbmQgYWxnb3JpdGhtcyB1c2VkLn0KIAogICBcc2VldGl0bGVbaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvcHViL2luZm96aXAvXXtJbmZvLVpJUCBIb21lIFBhZ2V9ewogICAgICAgICAgICAgSW5mb3JtYXRpb24gYWJvdXQgdGhlIEluZm8tWklQIHByb2plY3QncyBaSVAgYXJjaGl2ZQpAQCAtNzcsNyArODMsNyBAQAogCiBcc3Vic2VjdGlvbntaaXBGaWxlIE9iamVjdHMgXGxhYmVse3ppcGZpbGUtb2JqZWN0c319CiAKLVxiZWdpbntjbGFzc2Rlc2N9e1ppcEZpbGV9e2ZpbGVcb3B0aW9uYWx7LCBtb2RlXG9wdGlvbmFseywgY29tcHJlc3Npb259fX0gCitcYmVnaW57Y2xhc3NkZXNjfXtaaXBGaWxlfXtmaWxlXG9wdGlvbmFseywgbW9kZVxvcHRpb25hbHssIGNvbXByZXNzaW9uXG9wdGlvbmFseywgYWxsb3daaXA2NH19fX0gCiAgIE9wZW4gYSBaSVAgZmlsZSwgd2hlcmUgXHZhcntmaWxlfSBjYW4gYmUgZWl0aGVyIGEgcGF0aCB0byBhIGZpbGUKICAgKGEgc3RyaW5nKSBvciBhIGZpbGUtbGlrZSBvYmplY3QuICBUaGUgXHZhcnttb2RlfSBwYXJhbWV0ZXIKICAgc2hvdWxkIGJlIFxjb2RleydyJ30gdG8gcmVhZCBhbiBleGlzdGluZyBmaWxlLCBcY29kZXsndyd9IHRvCkBAIC0xMDAsNiArMTA2LDEyIEBACiAgIGlzIHNwZWNpZmllZCBidXQgdGhlIFxyZWZtb2R1bGV7emxpYn0gbW9kdWxlIGlzIG5vdCBhdmFpbGFibGUsCiAgIFxleGNlcHRpb257UnVudGltZUVycm9yfSBpcyBhbHNvIHJhaXNlZC4gIFRoZSBkZWZhdWx0IGlzCiAgIFxjb25zdGFudHtaSVBfU1RPUkVEfS4gCisgIElmIFx2YXJ7YWxsb3daaXA2NH0gaXMgXGNvZGV7VHJ1ZX0gemlwZmlsZSB3aWxsIGNyZWF0ZSBaSVAgZmlsZXMgdGhhdCB1c2UKKyAgdGhlIFpJUDY0IGV4dGVuc2lvbnMgd2hlbiB0aGUgemlwZmlsZSBpcyBsYXJnZXIgdGhhbiAyIEdCLiBJZiBpdCBpcyAKKyAgZmFsc2UgKHRoZSBkZWZhdWx0KSBcbW9kdWxle3ppcGZpbGV9IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhlCisgIFpJUCBmaWxlIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucy4gWklQNjQgZXh0ZW5zaW9ucyBhcmUgZGlzYWJsZWQgYnkKKyAgZGVmYXVsdCBiZWNhdXNlIHRoZSBkZWZhdWx0IFxwcm9ncmFte3ppcH0gYW5kIFxwcm9ncmFte3VuemlwfSBjb21tYW5kcyBvbgorICBcVU5JWHt9ICh0aGUgSW5mb1pJUCB1dGlsaXRpZXMpIGRvbid0IHN1cHBvcnQgdGhlc2UgZXh0ZW5zaW9ucy4KIFxlbmR7Y2xhc3NkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317Y2xvc2V9e30KQEAgLTEzMiw4ICsxNDQsOCBAQAogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317dGVzdHppcH17fQotICBSZWFkIGFsbCB0aGUgZmlsZXMgaW4gdGhlIGFyY2hpdmUgYW5kIGNoZWNrIHRoZWlyIENSQydzLiAgUmV0dXJuIHRoZQotICBuYW1lIG9mIHRoZSBmaXJzdCBiYWQgZmlsZSwgb3IgZWxzZSByZXR1cm4gXGNvZGV7Tm9uZX0uCisgIFJlYWQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSBhbmQgY2hlY2sgdGhlaXIgQ1JDJ3MgYW5kIGZpbGUKKyAgaGVhZGVycy4gIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmlyc3QgYmFkIGZpbGUsIG9yIGVsc2UgcmV0dXJuIFxjb2Rle05vbmV9LgogXGVuZHttZXRob2RkZXNjfQogCiBcYmVnaW57bWV0aG9kZGVzY317d3JpdGV9e2ZpbGVuYW1lXG9wdGlvbmFseywgYXJjbmFtZVxvcHRpb25hbHssCkBAIC0yNDMsOSArMjU1LDkgQEAKIAogXGJlZ2lue21lbWJlcmRlc2N9W1ppcEluZm9de2V4dHJhfQogICBFeHBhbnNpb24gZmllbGQgZGF0YS4gIFRoZQotICBcY2l0ZXRpdGxlW2h0dHA6Ly93d3cucGt3YXJlLmNvbS9hcHBub3RlLmh0bWxde1BLWklQIEFwcGxpY2F0aW9uCi0gIE5vdGV9IGNvbnRhaW5zIHNvbWUgY29tbWVudHMgb24gdGhlIGludGVybmFsIHN0cnVjdHVyZSBvZiB0aGUgZGF0YQotICBjb250YWluZWQgaW4gdGhpcyBzdHJpbmcuCisgIFxjaXRldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KKyAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9IGNvbnRhaW5zIHNvbWUgY29tbWVudHMgb24gdGhlIGludGVybmFsCisgIHN0cnVjdHVyZSBvZiB0aGUgZGF0YSBjb250YWluZWQgaW4gdGhpcyBzdHJpbmcuCiBcZW5ke21lbWJlcmRlc2N9CiAKIFxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtjcmVhdGVfc3lzdGVtfQpAQCAtMjg0LDEwICsyOTYsNiBAQAogICBCeXRlIG9mZnNldCB0byB0aGUgZmlsZSBoZWFkZXIuCiBcZW5ke21lbWJlcmRlc2N9CiAKLVxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtmaWxlX29mZnNldH0KLSAgQnl0ZSBvZmZzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmaWxlIGRhdGEuCi1cZW5ke21lbWJlcmRlc2N9Ci0KIFxiZWdpbnttZW1iZXJkZXNjfVtaaXBJbmZvXXtDUkN9CiAgIENSQy0zMiBvZiB0aGUgdW5jb21wcmVzc2VkIGZpbGUuCiBcZW5ke21lbWJlcmRlc2N9CmRpZmYgLS1naXQgYS9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXggYi9Eb2MvbGliL2xpYnppcGltcG9ydC50ZXgKaW5kZXggNzcwZWEyMS4uMDk4ZTc4OCAxMDA2NDQKLS0tIGEvRG9jL2xpYi9saWJ6aXBpbXBvcnQudGV4CisrKyBiL0RvYy9saWIvbGliemlwaW1wb3J0LnRleApAQCAtNTAsOSArNTAsOSBAQAogCiAKIFxiZWdpbntzZWVhbHNvfQotICBcc2VldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2FwcG5vdGUuaHRtbF17UEtaSVAgQXBwbGljYXRpb24KLSAgICAgICAgICAgIE5vdGV9e0RvY3VtZW50YXRpb24gb24gdGhlIFpJUCBmaWxlIGZvcm1hdCBieSBQaGlsCi0gICAgICAgICAgICBLYXR6LCB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0IGFuZCBhbGdvcml0aG1zIHVzZWQufQorICBcc2VldGl0bGVbaHR0cDovL3d3dy5wa3dhcmUuY29tL2J1c2luZXNzX2FuZF9kZXZlbG9wZXJzL2RldmVsb3Blci9hcHBub3RlL10KKyAgICAgICAgICAge1BLWklQIEFwcGxpY2F0aW9uIE5vdGV9e0RvY3VtZW50YXRpb24gb24gdGhlIFpJUCBmaWxlIGZvcm1hdCBieQorICAgICAgICAgICAgUGhpbCBLYXR6LCB0aGUgY3JlYXRvciBvZiB0aGUgZm9ybWF0IGFuZCBhbGdvcml0aG1zIHVzZWQufQogCiAgIFxzZWVwZXB7MDI3M317SW1wb3J0IE1vZHVsZXMgZnJvbSBaaXAgQXJjaGl2ZXN9e1dyaXR0ZW4gYnkgSmFtZXMgQy4KICAgICAgICAgICBBaGxzdHJvbSwgd2hvIGFsc28gcHJvdmlkZWQgYW4gaW1wbGVtZW50YXRpb24uIFB5dGhvbiAyLjMKZGlmZiAtLWdpdCBhL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkgYi9Eb2MvbGliL3NxbGl0ZTMvY29tcGxldGVfc3RhdGVtZW50LnB5CmluZGV4IDg5ZmMyNTAuLjIyNTI1ZTMgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvc3FsaXRlMy9jb21wbGV0ZV9zdGF0ZW1lbnQucHkKKysrIGIvRG9jL2xpYi9zcWxpdGUzL2NvbXBsZXRlX3N0YXRlbWVudC5weQpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICAgICAgaWYgYnVmZmVyLmxzdHJpcCgpLnVwcGVyKCkuc3RhcnRzd2l0aCgiU0VMRUNUIik6CiAgICAgICAgICAgICAgICAgcHJpbnQgY3VyLmZldGNoYWxsKCkKICAgICAgICAgZXhjZXB0IHNxbGl0ZTMuRXJyb3IsIGU6Ci0gICAgICAgICAgICBwcmludCAiQW4gZXJyb3Igb2NjdXJlZDoiLCBlLmFyZ3NbMF0KKyAgICAgICAgICAgIHByaW50ICJBbiBlcnJvciBvY2N1cnJlZDoiLCBlLmFyZ3NbMF0KICAgICAgICAgYnVmZmVyID0gIiIKIAogY29uLmNsb3NlKCkKZGlmZiAtLWdpdCBhL0RvYy9saWIvdGtpbnRlci50ZXggYi9Eb2MvbGliL3RraW50ZXIudGV4CmluZGV4IDQwNWYwNDEuLmRiNTJjYmQgMTAwNjQ0Ci0tLSBhL0RvYy9saWIvdGtpbnRlci50ZXgKKysrIGIvRG9jL2xpYi90a2ludGVyLnRleApAQCAtMTgsMTAgKzE4LDkgQEAKIG1vZHVsZSBcbW9kdWxle1xfdGtpbnRlcn0gcHJvdmlkZXMgYSB0aHJlYWRzYWZlIG1lY2hhbmlzbSB3aGljaCBhbGxvd3MKIFB5dGhvbiBhbmQgVGNsIHRvIGludGVyYWN0LgogCi1UayBpcyBub3QgdGhlIG9ubHkgR1VJIGZvciBQeXRob24sIGJ1dCBpcyBob3dldmVyIHRoZSBtb3N0IGNvbW1vbmx5Ci11c2VkIG9uZTsgc2VlIHNlY3Rpb25+XHJlZntvdGhlci1ndWktbW9kdWxlc30sIGBgT3RoZXIgVXNlciBJbnRlcmZhY2UKLU1vZHVsZXMgYW5kIFBhY2thZ2VzLCcnIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIG90aGVyIEdVSSB0b29sa2l0cyBmb3IKLVB5dGhvbi4KK1RrIGlzIG5vdCB0aGUgb25seSBHVUkgZm9yIFB5dGhvbjsgc2VlCitzZWN0aW9uflxyZWZ7b3RoZXItZ3VpLXBhY2thZ2VzfSwgYGBPdGhlciBVc2VyIEludGVyZmFjZSBNb2R1bGVzIGFuZAorUGFja2FnZXMsJycgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gb3RoZXIgR1VJIHRvb2xraXRzIGZvciBQeXRob24uCiAKICUgT3RoZXIgc2VjdGlvbnMgSSBoYXZlIGluIG1pbmQgYXJlCiAlIFRraW50ZXIgaW50ZXJuYWxzCkBAIC0xMDMsMTQgKzEwMiwxNCBAQAogXGVuZHtjbGFzc2Rlc2N9CiAKIFxiZWdpbntmdW5jZGVzY317VGNsfXtzY3JlZW5OYW1lPU5vbmUsIGJhc2VOYW1lPU5vbmUsIGNsYXNzTmFtZT0nVGsnLCB1c2VUaz0wfQotVGhlIFxmdW5jdGlvbntUY2x9IGZ1bmN0aW9uIGlzIGEgZmFjdG9yeSBmdW5jdGlvbiB3aGljaCBjcmVhdGVzIGFuIG9iamVjdAotbXVjaCBsaWtlIHRoYXQgY3JlYXRlZCBieSB0aGUgXGNsYXNze1RrfSBjbGFzcywgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QKLWluaXRpYWxpemUgdGhlIFRrIHN1YnN5c3RlbS4gIFRoaXMgaXMgbW9zdCBvZnRlbiB1c2VmdWwgd2hlbiBkcml2aW5nIHRoZSBUY2wKLWludGVycHJldGVyIGluIGFuIGVudmlyb25tZW50IHdoZXJlIG9uZSBkb2Vzbid0IHdhbnQgdG8gY3JlYXRlIGV4dHJhbmVvdXMKLXRvcGxldmVsIHdpbmRvd3MsIG9yIHdoZXJlIG9uZSBjYW5ub3QgKGkuZS4gVW5peC9MaW51eCBzeXN0ZW1zIHdpdGhvdXQgYW4gWAotc2VydmVyKS4gIEFuIG9iamVjdCBjcmVhdGVkIGJ5IHRoZSBcZnVuY3Rpb257VGNsfSBvYmplY3QgY2FuIGhhdmUgYSBUb3BsZXZlbAotd2luZG93IGNyZWF0ZWQgKGFuZCB0aGUgVGsgc3Vic3lzdGVtIGluaXRpYWxpemVkKSBieSBjYWxsaW5nIGl0cwotXG1ldGhvZHtsb2FkdGt9IG1ldGhvZC4KK1RoZSBcZnVuY3Rpb257VGNsfSBmdW5jdGlvbiBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggY3JlYXRlcyBhbgorb2JqZWN0IG11Y2ggbGlrZSB0aGF0IGNyZWF0ZWQgYnkgdGhlIFxjbGFzc3tUa30gY2xhc3MsIGV4Y2VwdCB0aGF0IGl0Citkb2VzIG5vdCBpbml0aWFsaXplIHRoZSBUayBzdWJzeXN0ZW0uICBUaGlzIGlzIG1vc3Qgb2Z0ZW4gdXNlZnVsIHdoZW4KK2RyaXZpbmcgdGhlIFRjbCBpbnRlcnByZXRlciBpbiBhbiBlbnZpcm9ubWVudCB3aGVyZSBvbmUgZG9lc24ndCB3YW50Cit0byBjcmVhdGUgZXh0cmFuZW91cyB0b3BsZXZlbCB3aW5kb3dzLCBvciB3aGVyZSBvbmUgY2Fubm90IChzdWNoIGFzCitcVU5JWC9MaW51eCBzeXN0ZW1zIHdpdGhvdXQgYW4gWCBzZXJ2ZXIpLiAgQW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlCitcZnVuY3Rpb257VGNsfSBvYmplY3QgY2FuIGhhdmUgYSBUb3BsZXZlbCB3aW5kb3cgY3JlYXRlZCAoYW5kIHRoZSBUaworc3Vic3lzdGVtIGluaXRpYWxpemVkKSBieSBjYWxsaW5nIGl0cyBcbWV0aG9ke2xvYWR0a30gbWV0aG9kLgogXHZlcnNpb25hZGRlZHsyLjR9CiBcZW5ke2Z1bmNkZXNjfQogCkBAIC0zMTYsMTAgKzMxNSwxMCBAQAogcGVyaW9kcy4gIEZvciBleGFtcGxlLCBcY29kZXsubXlBcHAuY29udHJvbFBhbmVsLm9rQnV0dG9ufSBtaWdodCBiZQogdGhlIG5hbWUgb2YgYSB3aWRnZXQuCiAKLVxpdGVtW1x2YXJ7b3B0aW9uc30gXQorXGl0ZW1bXHZhcntvcHRpb25zfV0KIGNvbmZpZ3VyZSB0aGUgd2lkZ2V0J3MgYXBwZWFyYW5jZSBhbmQgaW4gc29tZSBjYXNlcywgaXRzCiBiZWhhdmlvci4gIFRoZSBvcHRpb25zIGNvbWUgaW4gdGhlIGZvcm0gb2YgYSBsaXN0IG9mIGZsYWdzIGFuZCB2YWx1ZXMuCi1GbGFncyBhcmUgcHJvY2VlZGVkIGJ5IGEgYC0nLCBsaWtlIHVuaXggc2hlbGwgY29tbWFuZCBmbGFncywgYW5kCitGbGFncyBhcmUgcHJvY2VlZGVkIGJ5IGEgYC0nLCBsaWtlIFxVTklYe30gc2hlbGwgY29tbWFuZCBmbGFncywgYW5kCiB2YWx1ZXMgYXJlIHB1dCBpbiBxdW90ZXMgaWYgdGhleSBhcmUgbW9yZSB0aGFuIG9uZSB3b3JkLgogXGVuZHtkZXNjcmlwdGlvbn0KIApAQCAtMTgwNiwyNCArMTgwNSwyOSBAQAogdGhyb3VnaCB0aGUgVGsvVGNsIGxheWVyLn0KIFxlbmR7c2VlYWxzbyp9CiAKLQotVGsgaXMgbm90IHRoZSBvbmx5IEdVSSBmb3IgUHl0aG9uLCBidXQgaXMgaG93ZXZlciB0aGUKLW1vc3QgY29tbW9ubHkgdXNlZCBvbmUuCitPdGhlciBHVUkgcGFja2FnZXMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBQeXRob246CiAKIFxiZWdpbntzZWVhbHNvKn0KLVxzZWV0aXRsZVtodHRwOi8vd3d3Lnd4d2luZG93cy5vcmdde3d4V2luZG93c317Ci1pcyBhIEdVSSB0b29sa2l0IHRoYXQgY29tYmluZXMgdGhlIG1vc3QgYXR0cmFjdGl2ZSBhdHRyaWJ1dGVzIG9mIFF0LAotVGssIE1vdGlmLCBhbmQgR1RLKyBpbiBvbmUgcG93ZXJmdWwgYW5kIGVmZmljaWVudCBwYWNrYWdlLiBJdCBpcwotaW1wbGVtZW50ZWQgaW4gXENwcC4gd3hXaW5kb3dzIHN1cHBvcnRzIHR3byBmbGF2b3JzIG9mIFxVTklYe30KLWltcGxlbWVudGF0aW9uOiBHVEsrIGFuZCBNb3RpZiwgYW5kIHVuZGVyIFdpbmRvd3MsIGl0IGhhcyBhIHN0YW5kYXJkCi1NaWNyb3NvZnQgRm91bmRhdGlvbiBDbGFzc2VzIChNRkMpIGFwcGVhcmFuY2UsIGJlY2F1c2UgaXQgdXNlcyBXaW4zMgotd2lkZ2V0cy4gIFRoZXJlIGlzIGEgUHl0aG9uIGNsYXNzIHdyYXBwZXIsIGluZGVwZW5kZW50IG9mIFRraW50ZXIuCi0KLXd4V2luZG93cyBpcyBtdWNoIHJpY2hlciBpbiB3aWRnZXRzIHRoYW4gXHJlZm1vZHVsZXtUa2ludGVyfSwgd2l0aCBpdHMKLWhlbHAgc3lzdGVtLCBzb3BoaXN0aWNhdGVkIEhUTUwgYW5kIGltYWdlIHZpZXdlcnMsIGFuZCBvdGhlcgotc3BlY2lhbGl6ZWQgd2lkZ2V0cywgZXh0ZW5zaXZlIGRvY3VtZW50YXRpb24sIGFuZCBwcmludGluZyBjYXBhYmlsaXRpZXMuCitcc2VldGl0bGVbaHR0cDovL3d3dy53eHB5dGhvbi5vcmdde3d4UHl0aG9ufXsKK3d4UHl0aG9uIGlzIGEgY3Jvc3MtcGxhdGZvcm0gR1VJIHRvb2xraXQgZm9yIFB5dGhvbiB0aGF0IGlzIGJ1aWx0Cithcm91bmQgdGhlIHBvcHVsYXIgXHVsaW5re3d4V2lkZ2V0c317aHR0cDovL3d3dy53eHdpZGdldHMub3JnL30gXENwcHt9Cit0b29sa2l0LiCgSXQgcHJvdmlkZXMgYSBuYXRpdmUgbG9vayBhbmQgZmVlbCBmb3IgYXBwbGljYXRpb25zIG9uCitXaW5kb3dzLCBNYWMgT1MgWCwgYW5kIFxVTklYe30gc3lzdGVtcyBieSB1c2luZyBlYWNoIHBsYXRmb3JtJ3MgbmF0aXZlCit3aWRnZXRzIHdoZXJlIGV2ZXIgcG9zc2libGUsIChHVEsrIG9uIFxVTklYLWxpa2Ugc3lzdGVtcykuIKBJbgorYWRkaXRpb24gdG8gYW4gZXh0ZW5zaXZlIHNldCBvZiB3aWRnZXRzLCB3eFB5dGhvbiBwcm92aWRlcyBjbGFzc2VzIGZvcgorb25saW5lIGRvY3VtZW50YXRpb24gYW5kIGNvbnRleHQgc2Vuc2l0aXZlIGhlbHAsIHByaW50aW5nLCBIVE1MCit2aWV3aW5nLCBsb3ctbGV2ZWwgZGV2aWNlIGNvbnRleHQgZHJhd2luZywgZHJhZyBhbmQgZHJvcCwgc3lzdGVtCitjbGlwYm9hcmQgYWNjZXNzLCBhbiBYTUwtYmFzZWQgcmVzb3VyY2UgZm9ybWF0IGFuZCBtb3JlLCBpbmNsdWRpbmcgYW4KK2V2ZXIgZ3Jvd2luZyBsaWJyYXJ5IG9mIHVzZXItY29udHJpYnV0ZWQgbW9kdWxlcy4goEJvdGggdGhlIHd4V2lkZ2V0cworYW5kIHd4UHl0aG9uIHByb2plY3RzIGFyZSB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQgYW5kIGNvbnRpbnVvdXMKK2ltcHJvdmVtZW50LCBhbmQgaGF2ZSBhY3RpdmUgYW5kIGhlbHBmdWwgdXNlciBhbmQgZGV2ZWxvcGVyCitjb21tdW5pdGllcy4KIH0KLVxzZWV0aXRsZVtde1B5UXR9eworXHNlZXRpdGxlW2h0dHA6Ly93d3cuYW1hem9uLmNvbS9leGVjL29iaWRvcy9BU0lOLzE5MzIzOTQ2MjFdCit7d3hQeXRob24gaW4gQWN0aW9ufXsKK1RoZSB3eFB5dGhvbiBib29rLCBieSBOb2VsIFJhcHBpbiBhbmQgUm9iaW4gRHVubi4KK30KK1xzZWV0aXRsZXtQeVF0fXsKIFB5UXQgaXMgYSBccHJvZ3JhbXtzaXB9LXdyYXBwZWQgYmluZGluZyB0byB0aGUgUXQgdG9vbGtpdC4gIFF0IGlzIGFuCiBleHRlbnNpdmUgXENwcHt9IEdVSSB0b29sa2l0IHRoYXQgaXMgYXZhaWxhYmxlIGZvciBcVU5JWCwgV2luZG93cyBhbmQKIE1hYyBPUyBYLiAgXHByb2dyYW17c2lwfSBpcyBhIHRvb2wgZm9yIGdlbmVyYXRpbmcgYmluZGluZ3MgZm9yIFxDcHB7fQpkaWZmIC0tZ2l0IGEvRG9jL21hYy9saWJtYWNmcy50ZXggYi9Eb2MvbWFjL2xpYm1hY2ZzLnRleAppbmRleCA5NDRlYTFiLi4xMmE3Y2MzIDEwMDY0NAotLS0gYS9Eb2MvbWFjL2xpYm1hY2ZzLnRleAorKysgYi9Eb2MvbWFjL2xpYm1hY2ZzLnRleApAQCAtMjIsMTAgKzIyLDEwIEBACiBhcmd1bWVudCBjYW4gYmUgb25lIG9mIHRocmVlIHRoaW5nczpcICgxKSBhIGZ1bGwgb3IgcGFydGlhbCBNYWNpbnRvc2gKIHBhdGhuYW1lLCAoMikgYW4gXGNsYXNze0ZTU3BlY30gb2JqZWN0IG9yICgzKSBhIDMtdHVwbGUKIFxjb2RleyhcdmFye3dkUmVmTnVtfSwgXHZhcntwYXJJRH0sIFx2YXJ7bmFtZX0pfSBhcyBkZXNjcmliZWQgaW4KLVxjaXRldGl0bGV7SW5zaWRlIE1hY2ludG9zaDpcIEZpbGVzfS4gQW4gXGNsYXNze0ZTU3BlY30gY2FuIHBvaW50IHRvCitcY2l0ZXRpdGxle0luc2lkZSBNYWNpbnRvc2g6XCBGaWxlc30uICBBbiBcY2xhc3N7RlNTcGVjfSBjYW4gcG9pbnQgdG8KIGEgbm9uLWV4aXN0aW5nIGZpbGUsIGFzIGxvbmcgYXMgdGhlIGZvbGRlciBjb250YWluaW5nIHRoZSBmaWxlIGV4aXN0cy4KLVVuZGVyIE1hY1B5dGhvbiB0aGUgc2FtZSBpcyB0cnVlIGZvciBhIHBhdGhuYW1lLCBidXQgbm90IHVuZGVyIHVuaXgtUHl0b24KLWJlY2F1c2Ugb2YgdGhlIHdheSBwYXRobmFtZXMgYW5kIEZTUmVmcyB3b3Jrcy4gU2VlIEFwcGxlJ3MgZG9jdW1lbnRhdGlvbgorVW5kZXIgTWFjUHl0aG9uIHRoZSBzYW1lIGlzIHRydWUgZm9yIGEgcGF0aG5hbWUsIGJ1dCBub3QgdW5kZXIgXFVOSVgtUHl0aG9uCitiZWNhdXNlIG9mIHRoZSB3YXkgcGF0aG5hbWVzIGFuZCBGU1JlZnMgd29ya3MuICBTZWUgQXBwbGUncyBkb2N1bWVudGF0aW9uCiBmb3IgZGV0YWlscy4KIAogQSBkZXNjcmlwdGlvbiBvZiBhbGlhc2VzIGFuZCB0aGUKZGlmZiAtLWdpdCBhL0RvYy9tYWMvbGlibWFjb3MudGV4IGIvRG9jL21hYy9saWJtYWNvcy50ZXgKaW5kZXggYjIyYjM5Yy4uZTUwYjk5YiAxMDA2NDQKLS0tIGEvRG9jL21hYy9saWJtYWNvcy50ZXgKKysrIGIvRG9jL21hYy9saWJtYWNvcy50ZXgKQEAgLTI1LDcgKzI1LDcgQEAKIGluY29tcGF0aWJsZSBiZXR3ZWVuIGxpbmtpbmcgbW9kZWxzLCBwYWNrYWdlcyBjb3VsZCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBnaXZlCiBtb3JlIGRlY2VudCBlcnJvciBtZXNzYWdlcy4gVGhlIHZhbHVlIGlzIG9uZSBvZiBcY29kZXsnc3RhdGljJ30gZm9yIGEKIHN0YXRpY2FsbHkgbGlua2VkIFB5dGhvbiwgXGNvZGV7J2ZyYW1ld29yayd9IGZvciBQeXRob24gaW4gYSBNYWMgT1MgWCBmcmFtZXdvcmssCi1cY29kZXsnc2hhcmVkJ30gZm9yIFB5dGhvbiBpbiBhIHN0YW5kYXJkIHVuaXggc2hhcmVkIGxpYnJhcnkuCitcY29kZXsnc2hhcmVkJ30gZm9yIFB5dGhvbiBpbiBhIHN0YW5kYXJkIFxVTklYe30gc2hhcmVkIGxpYnJhcnkuCiBPbGRlciBQeXRob25zIGNvdWxkIGFsc28gaGF2ZSB0aGUgdmFsdWUKIFxjb2RleydjZm0nfSBmb3IgTWFjIE9TIDktY29tcGF0aWJsZSBQeXRob24uCiBcZW5ke2RhdGFkZXNjfQpkaWZmIC0tZ2l0IGEvRG9jL21hYy91c2luZy50ZXggYi9Eb2MvbWFjL3VzaW5nLnRleAppbmRleCBiZmE0NzhlLi5iMjFhOThlIDEwMDY0NAotLS0gYS9Eb2MvbWFjL3VzaW5nLnRleAorKysgYi9Eb2MvbWFjL3VzaW5nLnRleApAQCAtNiw3ICs2LDcgQEAKIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIElERSBhbmQgdGhlIFBhY2thZ2UgTWFuYWdlciB0aGF0IGFyZSB3b3J0aCBwb2ludGluZyBvdXQuCiAKIFB5dGhvbiBvbiBNYWMgT1MgOSBvciBlYXJsaWVyIGNhbiBiZSBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBQeXRob24gb24KLVVuaXggb3IgV2luZG93cywgYnV0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwsIGFzIHRoYXQgcGxhdGZvcm0KK1xVTklYe30gb3IgV2luZG93cywgYnV0IGlzIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBtYW51YWwsIGFzIHRoYXQgcGxhdGZvcm0KIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQsIHN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNC4gU2VlCiBcdXJse2h0dHA6Ly93d3cuY3dpLm5sL1x0ZXh0YXNjaWl0aWxkZSBqYWNrL21hY3B5dGhvbn0gZm9yIGluc3RhbGxlcnMKIGZvciB0aGUgbGF0ZXN0IDIuMyByZWxlYXNlIGZvciBNYWMgT1MgOSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWYyLnRleCBiL0RvYy9yZWYvcmVmMi50ZXgKaW5kZXggMmVkOGE1ZC4uYmFkNDYwOSAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWYyLnRleAorKysgYi9Eb2MvcmVmL3JlZjIudGV4CkBAIC01Niw3ICs1Niw3IEBACiAKIEEgcGh5c2ljYWwgbGluZSBpcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgdGVybWluYXRlZCBieSBhbiBlbmQtb2YtbGluZQogc2VxdWVuY2UuICBJbiBzb3VyY2UgZmlsZXMsIGFueSBvZiB0aGUgc3RhbmRhcmQgcGxhdGZvcm0gbGluZQotdGVybWluYXRpb24gc2VxdWVuY2VzIGNhbiBiZSB1c2VkIC0gdGhlIFxVTklYIGZvcm0gdXNpbmcgXEFTQ0lJe30gTEYKK3Rlcm1pbmF0aW9uIHNlcXVlbmNlcyBjYW4gYmUgdXNlZCAtIHRoZSBcVU5JWHt9IGZvcm0gdXNpbmcgXEFTQ0lJe30gTEYKIChsaW5lZmVlZCksIHRoZSBXaW5kb3dzIGZvcm0gdXNpbmcgdGhlIFxBU0NJSXt9IHNlcXVlbmNlIENSIExGIChyZXR1cm4KIGZvbGxvd2VkIGJ5IGxpbmVmZWVkKSwgb3IgdGhlIE1hY2ludG9zaCBmb3JtIHVzaW5nIHRoZSBcQVNDSUl7fSBDUgogKHJldHVybikgY2hhcmFjdGVyLiAgQWxsIG9mIHRoZXNlIGZvcm1zIGNhbiBiZSB1c2VkIGVxdWFsbHksIHJlZ2FyZGxlc3MKZGlmZiAtLWdpdCBhL0RvYy9yZWYvcmVmMy50ZXggYi9Eb2MvcmVmL3JlZjMudGV4CmluZGV4IGQwYzhjY2YuLjE1ZmMxODggMTAwNjQ0Ci0tLSBhL0RvYy9yZWYvcmVmMy50ZXgKKysrIGIvRG9jL3JlZi9yZWYzLnRleApAQCAtMTMwNyw2ICsxMzA3LDExIEBACiBzaW5jZSB0aGUgZGljdGlvbmFyeSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGF0IGEga2V5J3MgaGFzaCB2YWx1ZQogaXMgaW1tdXRhYmxlIChpZiB0aGUgb2JqZWN0J3MgaGFzaCB2YWx1ZSBjaGFuZ2VzLCBpdCB3aWxsIGJlIGluIHRoZQogd3JvbmcgaGFzaCBidWNrZXQpLgorCitcdmVyc2lvbmNoYW5nZWRbXG1ldGhvZHtfX2hhc2hfXygpfSBtYXkgbm93IGFsc28gcmV0dXJuIGEgbG9uZworaW50ZWdlciBvYmplY3Q7IHRoZSAzMi1iaXQgaW50ZWdlciBpcyB0aGVuIGRlcml2ZWQgZnJvbSB0aGUgaGFzaAorb2YgdGhhdCBvYmplY3RdezIuNX0KKwogXHdpdGhzdWJpdGVteyhvYmplY3QgbWV0aG9kKX17XHR0aW5kZXh7X19jbXBfXygpfX0KIFxlbmR7bWV0aG9kZGVzY30KIApAQCAtMTg4Niw2ICsxODkxLDkgQEAKIFxtZXRob2R7X19wb3dfXygpfSBzaG91bGQgYmUgZGVmaW5lZCB0byBhY2NlcHQgYW4gb3B0aW9uYWwgdGhpcmQKIGFyZ3VtZW50IGlmIHRoZSB0ZXJuYXJ5IHZlcnNpb24gb2YgdGhlIGJ1aWx0LWluCiBcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30gZnVuY3Rpb24gaXMgdG8gYmUgc3VwcG9ydGVkLgorCitJZiBvbmUgb2YgdGhvc2UgbWV0aG9kcyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBvcGVyYXRpb24gd2l0aCB0aGUKK3N1cHBsaWVkIGFyZ3VtZW50cywgaXQgc2hvdWxkIHJldHVybiBcY29kZXtOb3RJbXBsZW1lbnRlZH0uCiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtudW1lcmljIG9iamVjdF17X19kaXZfX317c2VsZiwgb3RoZXJ9CkBAIC0xOTE4LDEzICsxOTI2LDI4IEBACiBcZnVuY3Rpb257cG93KCl9XGJpZnVuY2luZGV4e3Bvd30sIFxjb2RleyoqfSwgXGNvZGV7PDx9LAogXGNvZGV7Pj59LCBcY29kZXtcJn0sIFxjb2Rle1xefSwgXGNvZGV7fH0pIHdpdGggcmVmbGVjdGVkCiAoc3dhcHBlZCkgb3BlcmFuZHMuICBUaGVzZSBmdW5jdGlvbnMgYXJlIG9ubHkgY2FsbGVkIGlmIHRoZSBsZWZ0Ci1vcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uLiAgRm9yIGluc3RhbmNlLAotdG8gZXZhbHVhdGUgdGhlIGV4cHJlc3Npb24gXHZhcnt4fVxjb2Rley19XHZhcnt5fSwgd2hlcmUgXHZhcnt5fSBpcyBhbgotaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGhhcyBhbiBcbWV0aG9ke19fcnN1Yl9fKCl9IG1ldGhvZCwKLVxjb2Rle1x2YXJ7eX0uX19yc3ViX18oXHZhcnt4fSl9IGlzIGNhbGxlZC4gIE5vdGUgdGhhdCB0ZXJuYXJ5CitvcGVyYW5kIGRvZXMgbm90IHN1cHBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgb3BlcmF0aW9uIGFuZCB0aGUKK29wZXJhbmRzIGFyZSBvZiBkaWZmZXJlbnQgdHlwZXMuXGZvb3Rub3RleworICAgIEZvciBvcGVyYW5kcyBvZiB0aGUgc2FtZSB0eXBlLCBpdCBpcyBhc3N1bWVkIHRoYXQgaWYgdGhlCisgICAgbm9uLXJlZmxlY3RlZCBtZXRob2QgKHN1Y2ggYXMgXG1ldGhvZHtfX2FkZF9fKCl9KSBmYWlscyB0aGUKKyAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCwgd2hpY2ggaXMgd2h5IHRoZSByZWZsZWN0ZWQgbWV0aG9kCisgICAgaXMgbm90IGNhbGxlZC59IAorRm9yIGluc3RhbmNlLCB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiBcdmFye3h9XGNvZGV7LX1cdmFye3l9LAord2hlcmUgXHZhcnt5fSBpcyBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaGFzIGFuCitcbWV0aG9ke19fcnN1Yl9fKCl9IG1ldGhvZCwgXGNvZGV7XHZhcnt5fS5fX3JzdWJfXyhcdmFye3h9KX0KK2lzIGNhbGxlZCBpZiBcY29kZXtcdmFye3h9Ll9fc3ViX18oXHZhcnt5fSl9IHJldHVybnMKK1x2YXJ7Tm90SW1wbGVtZW50ZWR9LgorCitOb3RlIHRoYXQgdGVybmFyeQogXGZ1bmN0aW9ue3BvdygpfVxiaWZ1bmNpbmRleHtwb3d9IHdpbGwgbm90IHRyeSBjYWxsaW5nCiBcbWV0aG9ke19fcnBvd19fKCl9ICh0aGUgY29lcmNpb24gcnVsZXMgd291bGQgYmVjb21lIHRvbwogY29tcGxpY2F0ZWQpLgorCitcbm90ZXtJZiB0aGUgcmlnaHQgb3BlcmFuZCdzIHR5cGUgaXMgYSBzdWJjbGFzcyBvZiB0aGUgbGVmdCBvcGVyYW5kJ3MKKyAgICAgIHR5cGUgYW5kIHRoYXQgc3ViY2xhc3MgcHJvdmlkZXMgdGhlIHJlZmxlY3RlZCBtZXRob2QgZm9yIHRoZQorICAgICAgb3BlcmF0aW9uLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBiZWZvcmUgdGhlIGxlZnQgb3BlcmFuZCdzCisgICAgICBub24tcmVmbGVjdGVkIG1ldGhvZC4gIFRoaXMgYmVoYXZpb3IgYWxsb3dzIHN1YmNsYXNzZXMgdG8KKyAgICAgIG92ZXJyaWRlIHRoZWlyIGFuY2VzdG9ycycgb3BlcmF0aW9ucy59CiBcZW5ke21ldGhvZGRlc2N9CiAKIFxiZWdpbnttZXRob2RkZXNjfVtudW1lcmljIG9iamVjdF17X19pYWRkX199e3NlbGYsIG90aGVyfQpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY0LnRleCBiL0RvYy9yZWYvcmVmNC50ZXgKaW5kZXggZGNkYzgyMy4uMTJhMmI5MiAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY0LnRleAorKysgYi9Eb2MvcmVmL3JlZjQudGV4CkBAIC05NywxMCArOTcsMjAgQEAKIFRoZSBidWlsdC1pbiBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGVjdXRpb24gb2YgYSBjb2RlIGJsb2NrCiBpcyBhY3R1YWxseSBmb3VuZCBieSBsb29raW5nIHVwIHRoZSBuYW1lIFxjb2Rle19fYnVpbHRpbnNfX30gaW4gaXRzCiBnbG9iYWwgbmFtZXNwYWNlOyB0aGlzIHNob3VsZCBiZSBhIGRpY3Rpb25hcnkgb3IgYSBtb2R1bGUgKGluIHRoZQotbGF0dGVyIGNhc2UgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBOb3JtYWxseSwgdGhlCi1cY29kZXtfX2J1aWx0aW5zX199IG5hbWVzcGFjZSBpcyB0aGUgZGljdGlvbmFyeSBvZiB0aGUgYnVpbHQtaW4gbW9kdWxlCi1cbW9kdWxle19fYnVpbHRpbl9ffSAobm90ZTogbm8gYHMnKS4gIElmIGl0IGlzbid0LCByZXN0cmljdGVkCi1leGVjdXRpb25caW5kZXhpaXtyZXN0cmljdGVkfXtleGVjdXRpb259IG1vZGUgaXMgaW4gZWZmZWN0LgorbGF0dGVyIGNhc2UgdGhlIG1vZHVsZSdzIGRpY3Rpb25hcnkgaXMgdXNlZCkuICBCeSBkZWZhdWx0LCB3aGVuIGluIHRoZQorXG1vZHVsZXtfX21haW5fX30gbW9kdWxlLCBcY29kZXtfX2J1aWx0aW5zX199IGlzIHRoZSBidWlsdC1pbiBtb2R1bGUKK1xtb2R1bGV7X19idWlsdGluX199IChub3RlOiBubyBgcycpOyB3aGVuIGluIGFueSBvdGhlciBtb2R1bGUsCitcY29kZXtfX2J1aWx0aW5zX199IGlzIGFuIGFsaWFzIGZvciB0aGUgZGljdGlvbmFyeSBvZiB0aGUKK1xtb2R1bGV7X19idWlsdGluX199IG1vZHVsZSBpdHNlbGYuICBcY29kZXtfX2J1aWx0aW5zX199IGNhbiBiZSBzZXQKK3RvIGEgdXNlci1jcmVhdGVkIGRpY3Rpb25hcnkgdG8gY3JlYXRlIGEgd2VhayBmb3JtIG9mIHJlc3RyaWN0ZWQKK2V4ZWN1dGlvblxpbmRleGlpe3Jlc3RyaWN0ZWR9e2V4ZWN1dGlvbn0uCisKK1xiZWdpbntub3RpY2V9CisgIFVzZXJzIHNob3VsZCBub3QgdG91Y2ggXGNvZGV7X19idWlsdGluc19ffTsgaXQgaXMgc3RyaWN0bHkgYW4KKyAgaW1wbGVtZW50YXRpb24gZGV0YWlsLiAgVXNlcnMgd2FudGluZyB0byBvdmVycmlkZSB2YWx1ZXMgaW4gdGhlCisgIGJ1aWx0LWluIG5hbWVzcGFjZSBzaG91bGQgXGtleXdvcmR7aW1wb3J0fSB0aGUgXG1vZHVsZXtfX2J1aWx0aW5fX30KKyAgKG5vIGBzJykgbW9kdWxlIGFuZCBtb2RpZnkgaXRzIGF0dHJpYnV0ZXMgYXBwcm9wcmlhdGVseS4KK1xlbmR7bm90aWNlfQogCiBUaGUgbmFtZXNwYWNlIGZvciBhIG1vZHVsZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgYQogbW9kdWxlIGlzIGltcG9ydGVkLiAgVGhlIG1haW4gbW9kdWxlIGZvciBhIHNjcmlwdCBpcyBhbHdheXMgY2FsbGVkCmRpZmYgLS1naXQgYS9Eb2MvcmVmL3JlZjUudGV4IGIvRG9jL3JlZi9yZWY1LnRleAppbmRleCA4OWY5OTc3Li45MDllNWJiIDEwMDY0NAotLS0gYS9Eb2MvcmVmL3JlZjUudGV4CisrKyBiL0RvYy9yZWYvcmVmNS50ZXgKQEAgLTkwNyw3ICs5MDcsMTAgQEAKIHRoZSB2YWx1ZXMgb2YgdHdvIG9iamVjdHMuICBUaGUgb2JqZWN0cyBuZWVkIG5vdCBoYXZlIHRoZSBzYW1lIHR5cGUuCiBJZiBib3RoIGFyZSBudW1iZXJzLCB0aGV5IGFyZSBjb252ZXJ0ZWQgdG8gYSBjb21tb24gdHlwZS4gIE90aGVyd2lzZSwKIG9iamVjdHMgb2YgZGlmZmVyZW50IHR5cGVzIFxlbXBoe2Fsd2F5c30gY29tcGFyZSB1bmVxdWFsLCBhbmQgYXJlCi1vcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuCitvcmRlcmVkIGNvbnNpc3RlbnRseSBidXQgYXJiaXRyYXJpbHkuICBZb3UgY2FuIGNvbnRyb2wgY29tcGFyaXNvbgorYmVoYXZpb3Igb2Ygb2JqZWN0cyBvZiBub24tYnVpbHRpbiB0eXBlcyBieSBkZWZpbmluZyBhIFxjb2Rle19fY21wX199CittZXRob2Qgb3IgcmljaCBjb21wYXJpc29uIG1ldGhvZHMgbGlrZSBcY29kZXtfX2d0X199LCBkZXNjcmliZWQgaW4KK3NlY3Rpb25+XHJlZntzcGVjaWFsbmFtZXN9LgogCiAoVGhpcyB1bnVzdWFsIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiB3YXMgdXNlZCB0byBzaW1wbGlmeSB0aGUKIGRlZmluaXRpb24gb2Ygb3BlcmF0aW9ucyBsaWtlIHNvcnRpbmcgYW5kIHRoZSBca2V5d29yZHtpbn0gYW5kCkBAIC05NTIsNyArOTU1LDggQEAKICAgYSBkaWN0aW9uYXJ5IGZvciBlbXB0aW5lc3MgYnkgY29tcGFyaW5nIGl0IHRvIFxjb2Rle1x7XH19Ln0KIAogXGl0ZW0KLU1vc3Qgb3RoZXIgdHlwZXMgY29tcGFyZSB1bmVxdWFsIHVubGVzcyB0aGV5IGFyZSB0aGUgc2FtZSBvYmplY3Q7CitNb3N0IG90aGVyIG9iamVjdHMgb2YgYnVpbHRpbiB0eXBlcyBjb21wYXJlIHVuZXF1YWwgdW5sZXNzIHRoZXkgYXJlCit0aGUgc2FtZSBvYmplY3Q7CiB0aGUgY2hvaWNlIHdoZXRoZXIgb25lIG9iamVjdCBpcyBjb25zaWRlcmVkIHNtYWxsZXIgb3IgbGFyZ2VyIHRoYW4KIGFub3RoZXIgb25lIGlzIG1hZGUgYXJiaXRyYXJpbHkgYnV0IGNvbnNpc3RlbnRseSB3aXRoaW4gb25lCiBleGVjdXRpb24gb2YgYSBwcm9ncmFtLgpkaWZmIC0tZ2l0IGEvRG9jL3JlZi9yZWY4LnRleCBiL0RvYy9yZWYvcmVmOC50ZXgKaW5kZXggODAxYWI1OC4uNDViZTcxZCAxMDA2NDQKLS0tIGEvRG9jL3JlZi9yZWY4LnRleAorKysgYi9Eb2MvcmVmL3JlZjgudGV4CkBAIC0zNCw3ICszNCw3IEBACiBcaW5kZXh7aW50ZXJhY3RpdmUgbW9kZX0KIFxyZWZiaW1vZGluZGV4e19fbWFpbl9ffQogCi1VbmRlciB7XFVOSVh9LCBhIGNvbXBsZXRlIHByb2dyYW0gY2FuIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgaW4KK1VuZGVyIFxVTklYLCBhIGNvbXBsZXRlIHByb2dyYW0gY2FuIGJlIHBhc3NlZCB0byB0aGUgaW50ZXJwcmV0ZXIgaW4KIHRocmVlIGZvcm1zOiB3aXRoIHRoZSBccHJvZ3JhbW9wdHstY30gXHZhcntzdHJpbmd9IGNvbW1hbmQgbGluZSBvcHRpb24sIGFzIGEKIGZpbGUgcGFzc2VkIGFzIHRoZSBmaXJzdCBjb21tYW5kIGxpbmUgYXJndW1lbnQsIG9yIGFzIHN0YW5kYXJkIGlucHV0LgogSWYgdGhlIGZpbGUgb3Igc3RhbmRhcmQgaW5wdXQgaXMgYSB0dHkgZGV2aWNlLCB0aGUgaW50ZXJwcmV0ZXIgZW50ZXJzCmRpZmYgLS1naXQgYS9Eb2MvdHV0L3R1dC50ZXggYi9Eb2MvdHV0L3R1dC50ZXgKaW5kZXggNGUwYTI2Yi4uMWIwOGE4ZSAxMDA2NDQKLS0tIGEvRG9jL3R1dC90dXQudGV4CisrKyBiL0RvYy90dXQvdHV0LnRleApAQCAtMjkzMSwxNCArMjkzMSwxMyBAQAogCiBUaGUgc3VibW9kdWxlcyBvZnRlbiBuZWVkIHRvIHJlZmVyIHRvIGVhY2ggb3RoZXIuICBGb3IgZXhhbXBsZSwgdGhlCiBcbW9kdWxle3N1cnJvdW5kfSBtb2R1bGUgbWlnaHQgdXNlIHRoZSBcbW9kdWxle2VjaG99IG1vZHVsZS4gIEluIGZhY3QsCi1zdWNoIHJlZmVyZW5jZXMKLWFyZSBzbyBjb21tb24gdGhhdCB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgZmlyc3QgbG9va3MgaW4gdGhlCi1jb250YWluaW5nIHBhY2thZ2UgYmVmb3JlIGxvb2tpbmcgaW4gdGhlIHN0YW5kYXJkIG1vZHVsZSBzZWFyY2ggcGF0aC4KLVRodXMsIHRoZSBzdXJyb3VuZCBtb2R1bGUgY2FuIHNpbXBseSB1c2UgXGNvZGV7aW1wb3J0IGVjaG99IG9yCi1cY29kZXtmcm9tIGVjaG8gaW1wb3J0IGVjaG9maWx0ZXJ9LiAgSWYgdGhlIGltcG9ydGVkIG1vZHVsZSBpcyBub3QKLWZvdW5kIGluIHRoZSBjdXJyZW50IHBhY2thZ2UgKHRoZSBwYWNrYWdlIG9mIHdoaWNoIHRoZSBjdXJyZW50IG1vZHVsZQotaXMgYSBzdWJtb2R1bGUpLCB0aGUgXGtleXdvcmR7aW1wb3J0fSBzdGF0ZW1lbnQgbG9va3MgZm9yIGEgdG9wLWxldmVsCi1tb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KK3N1Y2ggcmVmZXJlbmNlcyBhcmUgc28gY29tbW9uIHRoYXQgdGhlIFxrZXl3b3Jke2ltcG9ydH0gc3RhdGVtZW50CitmaXJzdCBsb29rcyBpbiB0aGUgY29udGFpbmluZyBwYWNrYWdlIGJlZm9yZSBsb29raW5nIGluIHRoZSBzdGFuZGFyZAorbW9kdWxlIHNlYXJjaCBwYXRoLiBUaHVzLCB0aGUgXG1vZHVsZXtzdXJyb3VuZH0gbW9kdWxlIGNhbiBzaW1wbHkgdXNlCitcY29kZXtpbXBvcnQgZWNob30gb3IgXGNvZGV7ZnJvbSBlY2hvIGltcG9ydCBlY2hvZmlsdGVyfS4gIElmIHRoZQoraW1wb3J0ZWQgbW9kdWxlIGlzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBwYWNrYWdlICh0aGUgcGFja2FnZSBvZgord2hpY2ggdGhlIGN1cnJlbnQgbW9kdWxlIGlzIGEgc3VibW9kdWxlKSwgdGhlIFxrZXl3b3Jke2ltcG9ydH0KK3N0YXRlbWVudCBsb29rcyBmb3IgYSB0b3AtbGV2ZWwgbW9kdWxlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAKIFdoZW4gcGFja2FnZXMgYXJlIHN0cnVjdHVyZWQgaW50byBzdWJwYWNrYWdlcyAoYXMgd2l0aCB0aGUKIFxtb2R1bGV7U291bmR9IHBhY2thZ2UgaW4gdGhlIGV4YW1wbGUpLCB0aGVyZSdzIG5vIHNob3J0Y3V0IHRvIHJlZmVyCkBAIC0yOTQ4LDYgKzI5NDcsMjQgQEAKIGluIHRoZSBcbW9kdWxle1NvdW5kLkVmZmVjdHN9IHBhY2thZ2UsIGl0IGNhbiB1c2UgXGNvZGV7ZnJvbQogU291bmQuRWZmZWN0cyBpbXBvcnQgZWNob30uCiAKK1N0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSwgaW4gYWRkaXRpb24gdG8gdGhlIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMKK2Rlc2NyaWJlZCBhYm92ZSwgeW91IGNhbiB3cml0ZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnRzIHdpdGggdGhlCitcY29kZXtmcm9tIG1vZHVsZSBpbXBvcnQgbmFtZX0gZm9ybSBvZiBpbXBvcnQgc3RhdGVtZW50LiBUaGVzZSBleHBsaWNpdAorcmVsYXRpdmUgaW1wb3J0cyB1c2UgbGVhZGluZyBkb3RzIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IGFuZCBwYXJlbnQKK3BhY2thZ2VzIGludm9sdmVkIGluIHRoZSByZWxhdGl2ZSBpbXBvcnQuIEZyb20gdGhlIFxtb2R1bGV7c3Vycm91bmR9Cittb2R1bGUgZm9yIGV4YW1wbGUsIHlvdSBtaWdodCB1c2U6CisKK1xiZWdpbnt2ZXJiYXRpbX0KK2Zyb20gLiBpbXBvcnQgZWNobworZnJvbSAuLiBpbXBvcnQgRm9ybWF0cworZnJvbSAuLkZpbHRlcnMgaW1wb3J0IGVxdWFsaXplcgorXGVuZHt2ZXJiYXRpbX0KKworTm90ZSB0aGF0IGJvdGggZXhwbGljaXQgYW5kIGltcGxpY2l0IHJlbGF0aXZlIGltcG9ydHMgYXJlIGJhc2VkIG9uIHRoZQorbmFtZSBvZiB0aGUgY3VycmVudCBtb2R1bGUuIFNpbmNlIHRoZSBuYW1lIG9mIHRoZSBtYWluIG1vZHVsZSBpcyBhbHdheXMKK1xjb2RleyJfX21haW5fXyJ9LCBtb2R1bGVzIGludGVuZGVkIGZvciB1c2UgYXMgdGhlIG1haW4gbW9kdWxlIG9mIGEKK1B5dGhvbiBhcHBsaWNhdGlvbiBzaG91bGQgYWx3YXlzIHVzZSBhYnNvbHV0ZSBpbXBvcnRzLgorCiBcc3Vic2VjdGlvbntQYWNrYWdlcyBpbiBNdWx0aXBsZSBEaXJlY3Rvcmllc30KIAogUGFja2FnZXMgc3VwcG9ydCBvbmUgbW9yZSBzcGVjaWFsIGF0dHJpYnV0ZSwgXG1lbWJlcntfX3BhdGhfX30uICBUaGlzCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMC50ZXgKaW5kZXggNTZkMTViOC4uMzYwZDdkYyAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjAudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIwLnRleApAQCAtMjE2LDcgKzIxNiw3IEBACiBjaGFyYWN0ZXIgcHJvcGVydGllcy4gIEZvciBleGFtcGxlLCBcY29kZXt1bmljb2RlZGF0YS5jYXRlZ29yeSh1J0EnKX0KIHJldHVybnMgdGhlIDItY2hhcmFjdGVyIHN0cmluZyAnTHUnLCB0aGUgJ0wnIGRlbm90aW5nIGl0J3MgYSBsZXR0ZXIsCiBhbmQgJ3UnIG1lYW5pbmcgdGhhdCBpdCdzIHVwcGVyY2FzZS4KLVxjb2Rle3UuYmlkaXJlY3Rpb25hbCh1J1xlIHgwNjYwJyl9IHJldHVybnMgJ0FOJywgbWVhbmluZyB0aGF0IFUrMDY2MCBpcworXGNvZGV7dW5pY29kZWRhdGEuYmlkaXJlY3Rpb25hbCh1J1xlIHUwNjYwJyl9IHJldHVybnMgJ0FOJywgbWVhbmluZyB0aGF0IFUrMDY2MCBpcwogYW4gQXJhYmljIG51bWJlci4KIAogVGhlIFxtb2R1bGV7Y29kZWNzfSBtb2R1bGUgY29udGFpbnMgZnVuY3Rpb25zIHRvIGxvb2sgdXAgZXhpc3RpbmcgZW5jb2RpbmdzCkBAIC01NzEsNyArNTcxLDcgQEAKIAogVGhlIFxrZXl3b3Jke3ByaW50fSBzdGF0ZW1lbnQgY2FuIG5vdyBoYXZlIGl0cyBvdXRwdXQgZGlyZWN0ZWQgdG8gYQogZmlsZS1saWtlIG9iamVjdCBieSBmb2xsb3dpbmcgdGhlIFxrZXl3b3Jke3ByaW50fSB3aXRoIAotXHZlcmJ8Pj4gZmlsZXwsIHNpbWlsYXIgdG8gdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yIGluIFVuaXggc2hlbGxzLgorXHZlcmJ8Pj4gZmlsZXwsIHNpbWlsYXIgdG8gdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yIGluIFxVTklYe30gc2hlbGxzLgogUHJldmlvdXNseSB5b3UnZCBlaXRoZXIgaGF2ZSB0byB1c2UgdGhlIFxtZXRob2R7d3JpdGUoKX0gbWV0aG9kIG9mIHRoZQogZmlsZS1saWtlIG9iamVjdCwgd2hpY2ggbGFja3MgdGhlIGNvbnZlbmllbmNlIGFuZCBzaW1wbGljaXR5IG9mCiBca2V5d29yZHtwcmludH0sIG9yIHlvdSBjb3VsZCBhc3NpZ24gYSBuZXcgdmFsdWUgdG8gCkBAIC03NzcsNyArNzc3LDcgQEAKIAogU29tZSB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gbWFrZSBpbnRlZ2VycyBhbmQgbG9uZyBpbnRlZ2VycyBhIGJpdCBtb3JlCiBpbnRlcmNoYW5nZWFibGUuICBJbiAxLjUuMiwgbGFyZ2UtZmlsZSBzdXBwb3J0IHdhcyBhZGRlZCBmb3IgU29sYXJpcywKLXRvIGFsbG93IHJlYWRpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMkdiOyB0aGlzIG1hZGUgdGhlIFxtZXRob2R7dGVsbCgpfQordG8gYWxsb3cgcmVhZGluZyBmaWxlcyBsYXJnZXIgdGhhbiAyfkdpQjsgdGhpcyBtYWRlIHRoZSBcbWV0aG9ke3RlbGwoKX0KIG1ldGhvZCBvZiBmaWxlIG9iamVjdHMgcmV0dXJuIGEgbG9uZyBpbnRlZ2VyIGluc3RlYWQgb2YgYSByZWd1bGFyCiBpbnRlZ2VyLiAgU29tZSBjb2RlIHdvdWxkIHN1YnRyYWN0IHR3byBmaWxlIG9mZnNldHMgYW5kIGF0dGVtcHQgdG8gdXNlCiB0aGUgcmVzdWx0IHRvIG11bHRpcGx5IGEgc2VxdWVuY2Ugb3Igc2xpY2UgYSBzdHJpbmcsIGJ1dCB0aGlzIHJhaXNlZCBhCkBAIC04OTQsNyArODk0LDcgQEAKIG5hbWUuICBUaGlzIHRoaXJkIGFyZ3VtZW50IGlzLCByZXNwZWN0aXZlbHksIGEgUHl0aG9uIG9iamVjdCwgYSBDCiBsb25nLCBvciBhIEMgc3RyaW5nLgogCi1BIHdyYXBwZXIgQVBJIHdhcyBhZGRlZCBmb3IgVW5peC1zdHlsZSBzaWduYWwgaGFuZGxlcnMuCitBIHdyYXBwZXIgQVBJIHdhcyBhZGRlZCBmb3IgXFVOSVgtc3R5bGUgc2lnbmFsIGhhbmRsZXJzLgogXGZ1bmN0aW9ue1B5T1NfZ2V0c2lnKCl9IGdldHMgYSBzaWduYWwgaGFuZGxlciBhbmQKIFxmdW5jdGlvbntQeU9TX3NldHNpZygpfSB3aWxsIHNldCBhIG5ldyBoYW5kbGVyLgogCkBAIC05MDUsNyArOTA1LDcgQEAKIHdhcyBubyB3YXkgdG8gZmlndXJlIG91dCBhdXRvbWF0aWNhbGx5IHdoZXJlIFB5dGhvbiBpcyBpbnN0YWxsZWQsIG9yCiB3aGF0IGNvbXBpbGVyIG9wdGlvbnMgdG8gdXNlIGZvciBleHRlbnNpb24gbW9kdWxlcy4gIFNvZnR3YXJlIGF1dGhvcnMKIGhhZCB0byBnbyB0aHJvdWdoIGFuIGFyZHVvdXMgcml0dWFsIG9mIGVkaXRpbmcgTWFrZWZpbGVzIGFuZAotY29uZmlndXJhdGlvbiBmaWxlcywgd2hpY2ggb25seSByZWFsbHkgd29yayBvbiBVbml4IGFuZCBsZWF2ZSBXaW5kb3dzCitjb25maWd1cmF0aW9uIGZpbGVzLCB3aGljaCBvbmx5IHJlYWxseSB3b3JrIG9uIFxVTklYe30gYW5kIGxlYXZlIFdpbmRvd3MKIGFuZCBNYWNPUyB1bnN1cHBvcnRlZC4gIFB5dGhvbiB1c2VycyBmYWNlZCB3aWxkbHkgZGlmZmVyaW5nCiBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIHdoaWNoIHZhcmllZCBiZXR3ZWVuIGRpZmZlcmVudCBleHRlbnNpb24KIHBhY2thZ2VzLCB3aGljaCBtYWRlIGFkbWluaXN0ZXJpbmcgYSBQeXRob24gaW5zdGFsbGF0aW9uIHNvbWV0aGluZyBvZiAKQEAgLTEyMjIsNyArMTIyMiw3IEBACiAoQ29udHJpYnV0ZWQgYnkgUGV0ZXIgQm9zY2gsIHdpdGggZml4ZXMgYnkgSmVyZW15IEh5bHRvbi4pCiAKIFxpdGVte1xtb2R1bGV7bW1hcH06fSBBbiBpbnRlcmZhY2UgdG8gbWVtb3J5LW1hcHBlZCBmaWxlcyBvbiBib3RoCi1XaW5kb3dzIGFuZCBVbml4LiAgQSBmaWxlJ3MgY29udGVudHMgY2FuIGJlIG1hcHBlZCBkaXJlY3RseSBpbnRvCitXaW5kb3dzIGFuZCBcVU5JWC4gIEEgZmlsZSdzIGNvbnRlbnRzIGNhbiBiZSBtYXBwZWQgZGlyZWN0bHkgaW50bwogbWVtb3J5LCBhdCB3aGljaCBwb2ludCBpdCBiZWhhdmVzIGxpa2UgYSBtdXRhYmxlIHN0cmluZywgc28gaXRzCiBjb250ZW50cyBjYW4gYmUgcmVhZCBhbmQgbW9kaWZpZWQuICBUaGV5IGNhbiBldmVuIGJlIHBhc3NlZCB0bwogZnVuY3Rpb25zIHRoYXQgZXhwZWN0IG9yZGluYXJ5IHN0cmluZ3MsIHN1Y2ggYXMgdGhlIFxtb2R1bGV7cmV9CkBAIC0xMjYyLDcgKzEyNjIsNyBAQAogCiBcaXRlbXtcbW9kdWxle3ppcGZpbGV9On0gQSBtb2R1bGUgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgWklQLWZvcm1hdAogYXJjaGl2ZXMuICBUaGVzZSBhcmUgYXJjaGl2ZXMgcHJvZHVjZWQgYnkgXHByb2dyYW17UEtaSVB9IG9uCi1ET1MvV2luZG93cyBvciBccHJvZ3JhbXt6aXB9IG9uIFVuaXgsIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoCitET1MvV2luZG93cyBvciBccHJvZ3JhbXt6aXB9IG9uIFxVTklYLCBub3QgdG8gYmUgY29uZnVzZWQgd2l0aAogXHByb2dyYW17Z3ppcH0tZm9ybWF0IGZpbGVzICh3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBcbW9kdWxle2d6aXB9CiBtb2R1bGUpCiAoQ29udHJpYnV0ZWQgYnkgSmFtZXMgQy4gQWhsc3Ryb20uKQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjEudGV4CmluZGV4IGYzZDAyNDUuLjY3Y2JiZTQgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzIxLnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMS50ZXgKQEAgLTMyNSw3ICszMjUsNyBAQAogV2hlbiBjb21waWxpbmcgUHl0aG9uLCB0aGUgdXNlciBoYWQgdG8gZ28gaW4gYW5kIGVkaXQgdGhlCiBcZmlsZXtNb2R1bGVzL1NldHVwfSBmaWxlIGluIG9yZGVyIHRvIGVuYWJsZSB2YXJpb3VzIGFkZGl0aW9uYWwKIG1vZHVsZXM7IHRoZSBkZWZhdWx0IHNldCBpcyByZWxhdGl2ZWx5IHNtYWxsIGFuZCBsaW1pdGVkIHRvIG1vZHVsZXMKLXRoYXQgY29tcGlsZSBvbiBtb3N0IFVuaXggcGxhdGZvcm1zLiAgVGhpcyBtZWFucyB0aGF0IG9uIFVuaXgKK3RoYXQgY29tcGlsZSBvbiBtb3N0IFxVTklYe30gcGxhdGZvcm1zLiAgVGhpcyBtZWFucyB0aGF0IG9uIFxVbml4e30KIHBsYXRmb3JtcyB3aXRoIG1hbnkgbW9yZSBmZWF0dXJlcywgbW9zdCBub3RhYmx5IExpbnV4LCBQeXRob24KIGluc3RhbGxhdGlvbnMgb2Z0ZW4gZG9uJ3QgY29udGFpbiBhbGwgdXNlZnVsIG1vZHVsZXMgdGhleSBjb3VsZC4KIApAQCAtNjYxLDcgKzY2MSw3IEBACiBcaXRlbSBUaGUgXG1vZHVsZXtkaWZmbGlifSBtb2R1bGUgY29udGFpbnMgYSBjbGFzcywKIFxjbGFzc3tTZXF1ZW5jZU1hdGNoZXJ9LCB3aGljaCBjb21wYXJlcyB0d28gc2VxdWVuY2VzIGFuZCBjb21wdXRlcyB0aGUKIGNoYW5nZXMgcmVxdWlyZWQgdG8gdHJhbnNmb3JtIG9uZSBzZXF1ZW5jZSBpbnRvIHRoZSBvdGhlci4gIEZvcgotZXhhbXBsZSwgdGhpcyBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gd3JpdGUgYSB0b29sIHNpbWlsYXIgdG8gdGhlIFVuaXgKK2V4YW1wbGUsIHRoaXMgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGEgdG9vbCBzaW1pbGFyIHRvIHRoZSBcVU5JWHt9CiBccHJvZ3JhbXtkaWZmfSBwcm9ncmFtLCBhbmQgaW4gZmFjdCB0aGUgc2FtcGxlIHByb2dyYW0KIFxmaWxle1Rvb2xzL3NjcmlwdHMvbmRpZmYucHl9IGRlbW9uc3RyYXRlcyBob3cgdG8gd3JpdGUgc3VjaCBhIHNjcmlwdC4gIAogCmRpZmYgLS1naXQgYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXggYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyMy50ZXgKaW5kZXggYTEyMjA4My4uNzJmZDMwNiAxMDA2NDQKLS0tIGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjMudGV4CisrKyBiL0RvYy93aGF0c25ldy93aGF0c25ldzIzLnRleApAQCAtMTQ3OSw3ICsxNDc5LDcgQEAKICgnYW1rJywgNTAwKQogXGVuZHt2ZXJiYXRpbX0KIAotXGl0ZW0gVGhlIFxtb2R1bGV7Z3ppcH0gbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZpbGVzIGV4Y2VlZGluZyAyfkdiLiAgCitcaXRlbSBUaGUgXG1vZHVsZXtnemlwfSBtb2R1bGUgY2FuIG5vdyBoYW5kbGUgZmlsZXMgZXhjZWVkaW5nIDJ+R2lCLiAgCiAKIFxpdGVtIFRoZSBuZXcgXG1vZHVsZXtoZWFwcX0gbW9kdWxlIGNvbnRhaW5zIGFuIGltcGxlbWVudGF0aW9uIG9mIGEKIGhlYXAgcXVldWUgYWxnb3JpdGhtLiAgQSBoZWFwIGlzIGFuIGFycmF5LWxpa2UgZGF0YSBzdHJ1Y3R1cmUgdGhhdApAQCAtMTk3OSw3ICsxOTc5LDcgQEAKIAogVGhlIFxtb2R1bGV7Z2V0b3B0fSBtb2R1bGUgcHJvdmlkZXMgc2ltcGxlIHBhcnNpbmcgb2YgY29tbWFuZC1saW5lCiBhcmd1bWVudHMuICBUaGUgbmV3IFxtb2R1bGV7b3B0cGFyc2V9IG1vZHVsZSAob3JpZ2luYWxseSBuYW1lZCBPcHRpaykKLXByb3ZpZGVzIG1vcmUgZWxhYm9yYXRlIGNvbW1hbmQtbGluZSBwYXJzaW5nIHRoYXQgZm9sbG93cyB0aGUgVW5peAorcHJvdmlkZXMgbW9yZSBlbGFib3JhdGUgY29tbWFuZC1saW5lIHBhcnNpbmcgdGhhdCBmb2xsb3dzIHRoZSBcVU5JWHt9CiBjb252ZW50aW9ucywgYXV0b21hdGljYWxseSBjcmVhdGVzIHRoZSBvdXRwdXQgZm9yIFxsb25ncHJvZ3JhbW9wdHtoZWxwfSwKIGFuZCBjYW4gcGVyZm9ybSBkaWZmZXJlbnQgYWN0aW9ucyBmb3IgZGlmZmVyZW50IG9wdGlvbnMuCiAKZGlmZiAtLWdpdCBhL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleCBiL0RvYy93aGF0c25ldy93aGF0c25ldzI0LnRleAppbmRleCA1MWJhZWNlLi4wOTZiMWVjIDEwMDY0NAotLS0gYS9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNC50ZXgKKysrIGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjQudGV4CkBAIC0xNjIsNyArMTYyLDcgQEAKIAogR2VuZXJhdG9yIGV4cHJlc3Npb25zIGFsd2F5cyBoYXZlIHRvIGJlIHdyaXR0ZW4gaW5zaWRlIHBhcmVudGhlc2VzLCBhcwogaW4gdGhlIGFib3ZlIGV4YW1wbGUuICBUaGUgcGFyZW50aGVzZXMgc2lnbmFsbGluZyBhIGZ1bmN0aW9uIGNhbGwgYWxzbwotY291bnQsIHNvIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGl0ZXJhdG9yIHRoYXQgd2lsbCBiZSBpbW1lZGlhdGVseQorY291bnQsIHNvIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpdGVyYXRvciB0aGF0IHdpbGwgYmUgaW1tZWRpYXRlbHkKIHBhc3NlZCB0byBhIGZ1bmN0aW9uIHlvdSBjb3VsZCB3cml0ZToKIAogXGJlZ2lue3ZlcmJhdGltfQpkaWZmIC0tZ2l0IGEvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4IGIvRG9jL3doYXRzbmV3L3doYXRzbmV3MjUudGV4CmluZGV4IDQwMTVkOTguLmRjYjZhYjEgMTAwNjQ0Ci0tLSBhL0RvYy93aGF0c25ldy93aGF0c25ldzI1LnRleAorKysgYi9Eb2Mvd2hhdHNuZXcvd2hhdHNuZXcyNS50ZXgKQEAgLTMsMTAgKzMsOSBAQAogJSAkSWQkCiAKICUgRml4IFhYWCBjb21tZW50cwotJSBDb3VudCB1cCB0aGUgcGF0Y2hlcyBhbmQgYnVncwogCiBcdGl0bGV7V2hhdCdzIE5ldyBpbiBQeXRob24gMi41fQotXHJlbGVhc2V7MC4yfQorXHJlbGVhc2V7MC45fQogXGF1dGhvcntBLk0uIEt1Y2hsaW5nfQogXGF1dGhvcmFkZHJlc3N7XGVtYWlse2Fta0BhbWsuY2F9fQogCkBAIC0xNCwzMSArMTMsNTcgQEAKIFxtYWtldGl0bGUKIFx0YWJsZW9mY29udGVudHMKIAotVGhpcyBhcnRpY2xlIGV4cGxhaW5zIHRoZSBuZXcgZmVhdHVyZXMgaW4gUHl0aG9uIDIuNS4gIE5vIHJlbGVhc2UgZGF0ZQotZm9yIFB5dGhvbiAyLjUgaGFzIGJlZW4gc2V0OyBpdCB3aWxsIHByb2JhYmx5IGJlIHJlbGVhc2VkIGluIHRoZQotYXV0dW1uIG9mIDIwMDYuICBccGVwezM1Nn0gZGVzY3JpYmVzIHRoZSBwbGFubmVkIHJlbGVhc2Ugc2NoZWR1bGUuCitUaGlzIGFydGljbGUgZXhwbGFpbnMgdGhlIG5ldyBmZWF0dXJlcyBpbiBQeXRob24gMi41LiAgVGhlIGZpbmFsCityZWxlYXNlIG9mIFB5dGhvbiAyLjUgaXMgc2NoZWR1bGVkIGZvciBBdWd1c3QgMjAwNjsKK1xwZXB7MzU2fSBkZXNjcmliZXMgdGhlIHBsYW5uZWQgcmVsZWFzZSBzY2hlZHVsZS4KIAotQ29tbWVudHMsIHN1Z2dlc3Rpb25zLCBhbmQgZXJyb3IgcmVwb3J0cyBhcmUgd2VsY29tZTsgcGxlYXNlIGUtbWFpbCB0aGVtIAotdG8gdGhlIGF1dGhvciBvciBvcGVuIGEgYnVnIGluIHRoZSBQeXRob24gYnVnIHRyYWNrZXIuCitUaGUgY2hhbmdlcyBpbiBQeXRob24gMi41IGFyZSBhbiBpbnRlcmVzdGluZyBtaXggb2YgbGFuZ3VhZ2UgYW5kCitsaWJyYXJ5IGltcHJvdmVtZW50cy4gVGhlIGxpYnJhcnkgZW5oYW5jZW1lbnRzIHdpbGwgYmUgbW9yZSBpbXBvcnRhbnQKK3RvIFB5dGhvbidzIHVzZXIgY29tbXVuaXR5LCBJIHRoaW5rLCBiZWNhdXNlIHNldmVyYWwgd2lkZWx5LXVzZWZ1bAorcGFja2FnZXMgd2VyZSBhZGRlZC4gIE5ldyBtb2R1bGVzIGluY2x1ZGUgRWxlbWVudFRyZWUgZm9yIFhNTAorcHJvY2Vzc2luZyAoc2VjdGlvbn5ccmVme21vZHVsZS1ldHJlZX0pLCB0aGUgU1FMaXRlIGRhdGFiYXNlIG1vZHVsZQorKHNlY3Rpb25+XHJlZnttb2R1bGUtc3FsaXRlfSksIGFuZCB0aGUgXG1vZHVsZXtjdHlwZXN9IG1vZHVsZSBmb3IKK2NhbGxpbmcgQyBmdW5jdGlvbnMgKHNlY3Rpb25+XHJlZnttb2R1bGUtY3R5cGVzfSkuCiAKLSUgWFhYIENvbXBhcmUgd2l0aCBwcmV2aW91cyByZWxlYXNlIGluIDIgLSAzIHNlbnRlbmNlcyBoZXJlLgorVGhlIGxhbmd1YWdlIGNoYW5nZXMgYXJlIG9mIG1pZGRsaW5nIHNpZ25pZmljYW5jZS4gIFNvbWUgcGxlYXNhbnQgbmV3CitmZWF0dXJlcyB3ZXJlIGFkZGVkLCBidXQgbW9zdCBvZiB0aGVtIGFyZW4ndCBmZWF0dXJlcyB0aGF0IHlvdSdsbCB1c2UKK2V2ZXJ5IGRheS4gIENvbmRpdGlvbmFsIGV4cHJlc3Npb25zIHdlcmUgZmluYWxseSBhZGRlZCB0byB0aGUgbGFuZ3VhZ2UKK3VzaW5nIGEgbm92ZWwgc3ludGF4OyBzZWUgc2VjdGlvbn5ccmVme3BlcC0zMDh9LiAgVGhlIG5ldworJ1xrZXl3b3Jke3dpdGh9JyBzdGF0ZW1lbnQgd2lsbCBtYWtlIHdyaXRpbmcgY2xlYW51cCBjb2RlIGVhc2llcgorKHNlY3Rpb25+XHJlZntwZXAtMzQzfSkuICBWYWx1ZXMgY2FuIG5vdyBiZSBwYXNzZWQgaW50byBnZW5lcmF0b3JzCisoc2VjdGlvbn5ccmVme3BlcC0zNDJ9KS4gIEltcG9ydHMgYXJlIG5vdyB2aXNpYmxlIGFzIGVpdGhlciBhYnNvbHV0ZQorb3IgcmVsYXRpdmUgKHNlY3Rpb25+XHJlZntwZXAtMzI4fSkuICBTb21lIGNvcm5lciBjYXNlcyBvZiBleGNlcHRpb24KK2hhbmRsaW5nIGFyZSBoYW5kbGVkIGJldHRlciAoc2VjdGlvbn5ccmVme3BlcC0zNDF9KS4gIEFsbCB0aGVzZQoraW1wcm92ZW1lbnRzIGFyZSB3b3J0aHdoaWxlLCBidXQgdGhleSdyZSBpbXByb3ZlbWVudHMgdG8gb25lIHNwZWNpZmljCitsYW5ndWFnZSBmZWF0dXJlIG9yIGFub3RoZXI7IG5vbmUgb2YgdGhlbSBhcmUgYnJvYWQgbW9kaWZpY2F0aW9ucyB0bworUHl0aG9uJ3Mgc2VtYW50aWNzLgogCi1UaGlzIGFydGljbGUgZG9lc24ndCBhdHRlbXB0IHRvIHByb3ZpZGUgYSBjb21wbGV0ZSBzcGVjaWZpY2F0aW9uIG9mCi10aGUgbmV3IGZlYXR1cmVzLCBidXQgaW5zdGVhZCBwcm92aWRlcyBhIGNvbnZlbmllbnQgb3ZlcnZpZXcuICBGb3IKLWZ1bGwgZGV0YWlscywgeW91IHNob3VsZCByZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgUHl0aG9uIDIuNS4KK0FzIHdlbGwgYXMgdGhlIGxhbmd1YWdlIGFuZCBsaWJyYXJ5IGFkZGl0aW9ucywgb3RoZXIgaW1wcm92ZW1lbnRzIGFuZAorYnVnZml4ZXMgd2VyZSBtYWRlIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgQSBzZWFyY2ggdGhyb3VnaCB0aGUKK1NWTiBjaGFuZ2UgbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIDMzNCBwYXRjaGVzIGFwcGxpZWQgYW5kIDQ0MyBidWdzCitmaXhlZCBiZXR3ZWVuIFB5dGhvbiAyLjQgYW5kIDIuNS4gIChCb3RoIGZpZ3VyZXMgYXJlIGxpa2VseSB0byBiZQordW5kZXJlc3RpbWF0ZXMuKSAgCisKK1RoaXMgYXJ0aWNsZSBkb2Vzbid0IHRyeSB0byBiZSBhIGNvbXBsZXRlIHNwZWNpZmljYXRpb24gb2YgdGhlIG5ldworZmVhdHVyZXM7IGluc3RlYWQgY2hhbmdlcyBhcmUgYnJpZWZseSBpbnRyb2R1Y2VkIHVzaW5nIGhlbHBmdWwKK2V4YW1wbGVzLiAgRm9yIGZ1bGwgZGV0YWlscywgeW91IHNob3VsZCBhbHdheXMgcmVmZXIgdG8gdGhlCitkb2N1bWVudGF0aW9uIGZvciBQeXRob24gMi41LgogJSBYWFggYWRkIGh5cGVybGluayB3aGVuIHRoZSBkb2N1bWVudGF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9ubGluZS4KIElmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgdGhlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uIGFuZCBkZXNpZ24KIHJhdGlvbmFsZSwgcmVmZXIgdG8gdGhlIFBFUCBmb3IgYSBwYXJ0aWN1bGFyIG5ldyBmZWF0dXJlLgogCitDb21tZW50cywgc3VnZ2VzdGlvbnMsIGFuZCBlcnJvciByZXBvcnRzIGZvciB0aGlzIGRvY3VtZW50IGFyZQord2VsY29tZTsgcGxlYXNlIGUtbWFpbCB0aGVtIHRvIHRoZSBhdXRob3Igb3Igb3BlbiBhIGJ1ZyBpbiB0aGUgUHl0aG9uCitidWcgdHJhY2tlci4KIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue1BFUCAzMDg6IENvbmRpdGlvbmFsIEV4cHJlc3Npb25zXGxhYmVse3BlcC0zMDh9fQogCiBGb3IgYSBsb25nIHRpbWUsIHBlb3BsZSBoYXZlIGJlZW4gcmVxdWVzdGluZyBhIHdheSB0byB3cml0ZQotY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMsIGV4cHJlc3Npb25zIHRoYXQgcmV0dXJuIHZhbHVlIEEgb3IgdmFsdWUgQgotZGVwZW5kaW5nIG9uIHdoZXRoZXIgYSBCb29sZWFuIHZhbHVlIGlzIHRydWUgb3IgZmFsc2UuICBBIGNvbmRpdGlvbmFsCi1leHByZXNzaW9uIGxldHMgeW91IHdyaXRlIGEgc2luZ2xlIGFzc2lnbm1lbnQgc3RhdGVtZW50IHRoYXQgaGFzIHRoZQotc2FtZSBlZmZlY3QgYXMgdGhlIGZvbGxvd2luZzoKK2NvbmRpdGlvbmFsIGV4cHJlc3Npb25zLCB3aGljaCBhcmUgZXhwcmVzc2lvbnMgdGhhdCByZXR1cm4gdmFsdWUgQSBvcgordmFsdWUgQiBkZXBlbmRpbmcgb24gd2hldGhlciBhIEJvb2xlYW4gdmFsdWUgaXMgdHJ1ZSBvciBmYWxzZS4gIEEKK2NvbmRpdGlvbmFsIGV4cHJlc3Npb24gbGV0cyB5b3Ugd3JpdGUgYSBzaW5nbGUgYXNzaWdubWVudCBzdGF0ZW1lbnQKK3RoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyB0aGUgZm9sbG93aW5nOgogCiBcYmVnaW57dmVyYmF0aW19CiBpZiBjb25kaXRpb246CkBAIC01NCw3ICs3OSw3IEBACiBDYW5kaWRhdGVzIGluY2x1ZGVkIEMncyBcY29kZXtjb25kID8gdHJ1ZV92IDogZmFsc2Vfdn0sCiBcY29kZXtpZiBjb25kIHRoZW4gdHJ1ZV92IGVsc2UgZmFsc2Vfdn0sIGFuZCAxNiBvdGhlciB2YXJpYXRpb25zLgogCi1HdlIgZXZlbnR1YWxseSBjaG9zZSBhIHN1cnByaXNpbmcgc3ludGF4OgorR3VpZG8gdmFuflJvc3N1bSBldmVudHVhbGx5IGNob3NlIGEgc3VycHJpc2luZyBzeW50YXg6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KIHggPSB0cnVlX3ZhbHVlIGlmIGNvbmRpdGlvbiBlbHNlIGZhbHNlX3ZhbHVlCkBAIC0xMjYsMTkgKzE1MSwxNiBAQAogXHNlY3Rpb257UEVQIDMwOTogUGFydGlhbCBGdW5jdGlvbiBBcHBsaWNhdGlvblxsYWJlbHtwZXAtMzA5fX0KIAogVGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgaW50ZW5kZWQgdG8gY29udGFpbiB0b29scyBmb3IKLWZ1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbW1pbmcuICBDdXJyZW50bHkgaXQgb25seSBjb250YWlucyBhCi1cY2xhc3N7cGFydGlhbCgpfSBmdW5jdGlvbiwgYnV0IG5ldyBmdW5jdGlvbnMgd2lsbCBwcm9iYWJseSBiZSBhZGRlZAotaW4gZnV0dXJlIHZlcnNpb25zIG9mIFB5dGhvbi4KK2Z1bmN0aW9uYWwtc3R5bGUgcHJvZ3JhbW1pbmcuICAKIAotRm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gYSBmdW5jdGlvbmFsIHN0eWxlLCBpdCBjYW4gYmUgdXNlZnVsIHRvCitPbmUgdXNlZnVsIHRvb2wgaW4gdGhpcyBtb2R1bGUgaXMgdGhlIFxmdW5jdGlvbntwYXJ0aWFsKCl9IGZ1bmN0aW9uLgorRm9yIHByb2dyYW1zIHdyaXR0ZW4gaW4gYSBmdW5jdGlvbmFsIHN0eWxlLCB5b3UnbGwgc29tZXRpbWVzIHdhbnQgdG8KIGNvbnN0cnVjdCB2YXJpYW50cyBvZiBleGlzdGluZyBmdW5jdGlvbnMgdGhhdCBoYXZlIHNvbWUgb2YgdGhlCiBwYXJhbWV0ZXJzIGZpbGxlZCBpbi4gIENvbnNpZGVyIGEgUHl0aG9uIGZ1bmN0aW9uIFxjb2Rle2YoYSwgYiwgYyl9OwogeW91IGNvdWxkIGNyZWF0ZSBhIG5ldyBmdW5jdGlvbiBcY29kZXtnKGIsIGMpfSB0aGF0IHdhcyBlcXVpdmFsZW50IHRvCi1cY29kZXtmKDEsIGIsIGMpfS4gIFRoaXMgaXMgY2FsbGVkIGBgcGFydGlhbCBmdW5jdGlvbiBhcHBsaWNhdGlvbicnLAotYW5kIGlzIHByb3ZpZGVkIGJ5IHRoZSBcY2xhc3N7cGFydGlhbH0gY2xhc3MgaW4gdGhlIG5ldwotXG1vZHVsZXtmdW5jdG9vbHN9IG1vZHVsZS4KK1xjb2Rle2YoMSwgYiwgYyl9LiAgVGhpcyBpcyBjYWxsZWQgYGBwYXJ0aWFsIGZ1bmN0aW9uIGFwcGxpY2F0aW9uJycuCiAKLVRoZSBjb25zdHJ1Y3RvciBmb3IgXGNsYXNze3BhcnRpYWx9IHRha2VzIHRoZSBhcmd1bWVudHMKK1xmdW5jdGlvbntwYXJ0aWFsfSB0YWtlcyB0aGUgYXJndW1lbnRzCiBcY29kZXsoXHZhcntmdW5jdGlvbn0sIFx2YXJ7YXJnMX0sIFx2YXJ7YXJnMn0sIC4uLgogXHZhcntrd2FyZzF9PVx2YXJ7dmFsdWUxfSwgXHZhcntrd2FyZzJ9PVx2YXJ7dmFsdWUyfSl9LiAgVGhlIHJlc3VsdGluZwogb2JqZWN0IGlzIGNhbGxhYmxlLCBzbyB5b3UgY2FuIGp1c3QgY2FsbCBpdCB0byBpbnZva2UgXHZhcntmdW5jdGlvbn0KQEAgLTE3NSwxMSArMTk3LDQwIEBACiBcZW5ke3ZlcmJhdGltfQogCiAKK0Fub3RoZXIgZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7ZnVuY3Rvb2xzfSBtb2R1bGUgaXMgdGhlCitcZnVuY3Rpb257dXBkYXRlX3dyYXBwZXIoXHZhcnt3cmFwcGVyfSwgXHZhcnt3cmFwcGVkfSl9IGZ1bmN0aW9uIHRoYXQKK2hlbHBzIHlvdSB3cml0ZSB3ZWxsLWJlaGF2ZWQgZGVjb3JhdG9ycy4gIFxmdW5jdGlvbnt1cGRhdGVfd3JhcHBlcigpfQorY29waWVzIHRoZSBuYW1lLCBtb2R1bGUsIGFuZCBkb2NzdHJpbmcgYXR0cmlidXRlIHRvIGEgd3JhcHBlciBmdW5jdGlvbgorc28gdGhhdCB0cmFjZWJhY2tzIGluc2lkZSB0aGUgd3JhcHBlZCBmdW5jdGlvbiBhcmUgZWFzaWVyIHRvCit1bmRlcnN0YW5kLiAgRm9yIGV4YW1wbGUsIHlvdSBtaWdodCB3cml0ZToKKworXGJlZ2lue3ZlcmJhdGltfQorZGVmIG15X2RlY29yYXRvcihmKToKKyAgICBkZWYgd3JhcHBlcigqYXJncywgKiprd2RzKToKKyAgICAgICAgcHJpbnQgJ0NhbGxpbmcgZGVjb3JhdGVkIGZ1bmN0aW9uJworICAgICAgICByZXR1cm4gZigqYXJncywgKiprd2RzKQorICAgIGZ1bmN0b29scy51cGRhdGVfd3JhcHBlcih3cmFwcGVyLCBmKQorICAgIHJldHVybiB3cmFwcGVyCitcZW5ke3ZlcmJhdGltfQorCitcZnVuY3Rpb257d3JhcHMoKX0gaXMgYSBkZWNvcmF0b3IgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgeW91ciBvd24KK2RlY29yYXRvcnMgdG8gY29weSB0aGUgd3JhcHBlZCBmdW5jdGlvbidzIGluZm9ybWF0aW9uLiAgQW4gYWx0ZXJuYXRlIAordmVyc2lvbiBvZiB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBiZToKKworXGJlZ2lue3ZlcmJhdGltfQorZGVmIG15X2RlY29yYXRvcihmKToKKyAgICBAZnVuY3Rvb2xzLndyYXBzKGYpCisgICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dkcyk6CisgICAgICAgIHByaW50ICdDYWxsaW5nIGRlY29yYXRlZCBmdW5jdGlvbicKKyAgICAgICAgcmV0dXJuIGYoKmFyZ3MsICoqa3dkcykKKyAgICByZXR1cm4gd3JhcHBlcgorXGVuZHt2ZXJiYXRpbX0KKwogXGJlZ2lue3NlZWFsc299CiAKIFxzZWVwZXB7MzA5fXtQYXJ0aWFsIEZ1bmN0aW9uIEFwcGxpY2F0aW9ufXtQRVAgcHJvcG9zZWQgYW5kIHdyaXR0ZW4gYnkKLVBldGVyIEhhcnJpczsgaW1wbGVtZW50ZWQgYnkgSHllLVNoaWsgQ2hhbmcsIHdpdGggYWRhcHRhdGlvbnMgYnkKLVJheW1vbmQgSGV0dGluZ2VyLn0KK1BldGVyIEhhcnJpczsgaW1wbGVtZW50ZWQgYnkgSHllLVNoaWsgQ2hhbmcgYW5kIE5pY2sgQ29naGxhbiwgd2l0aAorYWRhcHRhdGlvbnMgYnkgUmF5bW9uZCBIZXR0aW5nZXIufQogCiBcZW5ke3NlZWFsc299CiAKQEAgLTM2MSw3ICs0MTIsNyBAQAogY29tYmluZWQgdmVyc2lvbiB3YXMgY29tcGxpY2F0ZWQgYW5kIGl0IHdhc24ndCBjbGVhciB3aGF0IHRoZQogc2VtYW50aWNzIG9mIHRoZSBjb21iaW5lZCBzaG91bGQgYmUuICAKIAotR3ZSIHNwZW50IHNvbWUgdGltZSB3b3JraW5nIHdpdGggSmF2YSwgd2hpY2ggZG9lcyBzdXBwb3J0IHRoZQorR3VpZG8gdmFuflJvc3N1bSBzcGVudCBzb21lIHRpbWUgd29ya2luZyB3aXRoIEphdmEsIHdoaWNoIGRvZXMgc3VwcG9ydCB0aGUKIGVxdWl2YWxlbnQgb2YgY29tYmluaW5nIFxrZXl3b3Jke2V4Y2VwdH0gYmxvY2tzIGFuZCBhCiBca2V5d29yZHtmaW5hbGx5fSBibG9jaywgYW5kIHRoaXMgY2xhcmlmaWVkIHdoYXQgdGhlIHN0YXRlbWVudCBzaG91bGQKIG1lYW4uICBJbiBQeXRob24gMi41LCB5b3UgY2FuIG5vdyB3cml0ZToKQEAgLTU1NCw3ICs2MDUsMTEgQEAKIFxzZWVwZXB7MzQyfXtDb3JvdXRpbmVzIHZpYSBFbmhhbmNlZCBHZW5lcmF0b3JzfXtQRVAgd3JpdHRlbiBieSAKIEd1aWRvIHZhbn5Sb3NzdW0gYW5kIFBoaWxsaXAgSi4gRWJ5OwogaW1wbGVtZW50ZWQgYnkgUGhpbGxpcCBKLiBFYnkuICBJbmNsdWRlcyBleGFtcGxlcyBvZiAKLXNvbWUgZmFuY2llciB1c2VzIG9mIGdlbmVyYXRvcnMgYXMgY29yb3V0aW5lcy59Citzb21lIGZhbmNpZXIgdXNlcyBvZiBnZW5lcmF0b3JzIGFzIGNvcm91dGluZXMuCisKK0VhcmxpZXIgdmVyc2lvbnMgb2YgdGhlc2UgZmVhdHVyZXMgd2VyZSBwcm9wb3NlZCBpbiAKK1xwZXB7Mjg4fSBieSBSYXltb25kIEhldHRpbmdlciBhbmQgXHBlcHszMjV9IGJ5IFNhbXVlbGUgUGVkcm9uaS4KK30KIAogXHNlZXVybHtodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Nvcm91dGluZX17VGhlIFdpa2lwZWRpYSBlbnRyeSBmb3IgCiBjb3JvdXRpbmVzLn0KQEAgLTc3MSw3ICs4MjYsNyBAQAogZGVjb3JhdG9yIHRoYXQgYXJlIHVzZWZ1bCBmb3Igd3JpdGluZyBvYmplY3RzIGZvciB1c2Ugd2l0aCB0aGUKICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50LgogCi1UaGUgZGVjb3JhdG9yIGlzIGNhbGxlZCBcZnVuY3Rpb257Y29udGV4dGZhY3Rvcnl9LCBhbmQgbGV0cyB5b3Ugd3JpdGUKK1RoZSBkZWNvcmF0b3IgaXMgY2FsbGVkIFxmdW5jdGlvbntjb250ZXh0bWFuYWdlcn0sIGFuZCBsZXRzIHlvdSB3cml0ZQogYSBzaW5nbGUgZ2VuZXJhdG9yIGZ1bmN0aW9uIGluc3RlYWQgb2YgZGVmaW5pbmcgYSBuZXcgY2xhc3MuICBUaGUgZ2VuZXJhdG9yCiBzaG91bGQgeWllbGQgZXhhY3RseSBvbmUgdmFsdWUuICBUaGUgY29kZSB1cCB0byB0aGUgXGtleXdvcmR7eWllbGR9CiB3aWxsIGJlIGV4ZWN1dGVkIGFzIHRoZSBcbWV0aG9ke19fZW50ZXJfXygpfSBtZXRob2QsIGFuZCB0aGUgdmFsdWUKQEAgLTc4NSw5ICs4NDAsOSBAQAogdXNpbmcgdGhpcyBkZWNvcmF0b3IgYXM6CiAKIFxiZWdpbnt2ZXJiYXRpbX0KLWZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dGZhY3RvcnkKK2Zyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKIAotQGNvbnRleHRmYWN0b3J5CitAY29udGV4dG1hbmFnZXIKIGRlZiBkYl90cmFuc2FjdGlvbiAoY29ubmVjdGlvbik6CiAgICAgY3Vyc29yID0gY29ubmVjdGlvbi5jdXJzb3IoKQogICAgIHRyeToKQEAgLTkzMyw3ICs5ODgsNyBAQAogYWxyZWFkeSBtb3JlIGJ5dGVzIHRoYW4gYSAzMi1iaXQgYWRkcmVzcyBzcGFjZSBjYW4gY29udGFpbi4KIAogSXQncyBwb3NzaWJsZSB0byBhZGRyZXNzIHRoYXQgbXVjaCBtZW1vcnkgb24gYSA2NC1iaXQgcGxhdGZvcm0sCi1ob3dldmVyLiAgVGhlIHBvaW50ZXJzIGZvciBhIGxpc3QgdGhhdCBzaXplIHdvdWxkIG9ubHkgcmVxdWlyZSAxNkdpQgoraG93ZXZlci4gIFRoZSBwb2ludGVycyBmb3IgYSBsaXN0IHRoYXQgc2l6ZSB3b3VsZCBvbmx5IHJlcXVpcmUgMTZ+R2lCCiBvZiBzcGFjZSwgc28gaXQncyBub3QgdW5yZWFzb25hYmxlIHRoYXQgUHl0aG9uIHByb2dyYW1tZXJzIG1pZ2h0CiBjb25zdHJ1Y3QgbGlzdHMgdGhhdCBsYXJnZS4gIFRoZXJlZm9yZSwgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBoYWQgdG8KIGJlIGNoYW5nZWQgdG8gdXNlIHNvbWUgdHlwZSBvdGhlciB0aGFuIFxjdHlwZXtpbnR9LCBhbmQgdGhpcyB3aWxsIGJlIGEKQEAgLTEwNDQsMTAgKzEwOTksMTAgQEAKIAogXGl0ZW0gQm90aCA4LWJpdCBhbmQgVW5pY29kZSBzdHJpbmdzIGhhdmUgbmV3IFxtZXRob2R7cGFydGl0aW9uKHNlcCl9IAogYW5kIFxtZXRob2R7cnBhcnRpdGlvbihzZXApfSBtZXRob2RzIHRoYXQgc2ltcGxpZnkgYSBjb21tb24gdXNlIGNhc2UuCisKIFRoZSBcbWV0aG9ke2ZpbmQoUyl9IG1ldGhvZCBpcyBvZnRlbiB1c2VkIHRvIGdldCBhbiBpbmRleCB3aGljaCBpcwogdGhlbiB1c2VkIHRvIHNsaWNlIHRoZSBzdHJpbmcgYW5kIG9idGFpbiB0aGUgcGllY2VzIHRoYXQgYXJlIGJlZm9yZQogYW5kIGFmdGVyIHRoZSBzZXBhcmF0b3IuICAKLQogXG1ldGhvZHtwYXJ0aXRpb24oc2VwKX0gY29uZGVuc2VzIHRoaXMKIHBhdHRlcm4gaW50byBhIHNpbmdsZSBtZXRob2QgY2FsbCB0aGF0IHJldHVybnMgYSAzLXR1cGxlIGNvbnRhaW5pbmcKIHRoZSBzdWJzdHJpbmcgYmVmb3JlIHRoZSBzZXBhcmF0b3IsIHRoZSBzZXBhcmF0b3IgaXRzZWxmLCBhbmQgdGhlCkBAIC0xMDcyLDYgKzExMjcsMTcgQEAKIAogKEltcGxlbWVudGVkIGJ5IEZyZWRyaWsgTHVuZGggZm9sbG93aW5nIGEgc3VnZ2VzdGlvbiBieSBSYXltb25kIEhldHRpbmdlci4pCiAKK1xpdGVtIFRoZSBcbWV0aG9ke3N0YXJ0c3dpdGgoKX0gYW5kIFxtZXRob2R7ZW5kc3dpdGgoKX0gbWV0aG9kcworb2Ygc3RyaW5nIHR5cGVzIG5vdyBhY2NlcHQgdHVwbGVzIG9mIHN0cmluZ3MgdG8gY2hlY2sgZm9yLgorCitcYmVnaW57dmVyYmF0aW19CitkZWYgaXNfaW1hZ2VfZmlsZSAoZmlsZW5hbWUpOgorICAgIHJldHVybiBmaWxlbmFtZS5lbmRzd2l0aCgoJy5naWYnLCAnLmpwZycsICcudGlmZicpKQorXGVuZHt2ZXJiYXRpbX0KKworKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbCBmb2xsb3dpbmcgYSBzdWdnZXN0aW9uIGJ5IFRvbSBMeW5uLikKKyUgUkZFICMxNDkxNDg1CisKIFxpdGVtIFRoZSBcZnVuY3Rpb257bWluKCl9IGFuZCBcZnVuY3Rpb257bWF4KCl9IGJ1aWx0LWluIGZ1bmN0aW9ucwogZ2FpbmVkIGEgXGNvZGV7a2V5fSBrZXl3b3JkIHBhcmFtZXRlciBhbmFsb2dvdXMgdG8gdGhlIFxjb2Rle2tleX0KIGFyZ3VtZW50IGZvciBcbWV0aG9ke3NvcnQoKX0uICBUaGlzIHBhcmFtZXRlciBzdXBwbGllcyBhIGZ1bmN0aW9uIHRoYXQKQEAgLTEwOTUsOCArMTE2MSwxNyBAQAogZmFsc2UgdmFsdWVzLiAgXGZ1bmN0aW9ue2FueSgpfSByZXR1cm5zIFxjb25zdGFudHtUcnVlfSBpZiBhbnkgdmFsdWUKIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBpcyB0cnVlOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4KIFxjb25zdGFudHtGYWxzZX0uICBcZnVuY3Rpb257YWxsKCl9IHJldHVybnMgXGNvbnN0YW50e1RydWV9IG9ubHkgaWYKLWFsbCBvZiB0aGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoZSBpdGVyYXRvciBldmFsdWF0ZSBhcyBiZWluZyB0cnVlLgotKFN1Z2dlc3RlZCBieSBHdlIsIGFuZCBpbXBsZW1lbnRlZCBieSBSYXltb25kIEhldHRpbmdlci4pCithbGwgb2YgdGhlIHZhbHVlcyByZXR1cm5lZCBieSB0aGUgaXRlcmF0b3IgZXZhbHVhdGUgYXMgdHJ1ZS4KKyhTdWdnZXN0ZWQgYnkgR3VpZG8gdmFuflJvc3N1bSwgYW5kIGltcGxlbWVudGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKKworXGl0ZW0gVGhlIHJlc3VsdCBvZiBhIGNsYXNzJ3MgXG1ldGhvZHtfX2hhc2hfXygpfSBtZXRob2QgY2FuIG5vdyAKK2JlIGVpdGhlciBhIGxvbmcgaW50ZWdlciBvciBhIHJlZ3VsYXIgaW50ZWdlci4gIElmIGEgbG9uZyBpbnRlZ2VyIGlzCityZXR1cm5lZCwgdGhlIGhhc2ggb2YgdGhhdCB2YWx1ZSBpcyB0YWtlbi4gIEluIGVhcmxpZXIgdmVyc2lvbnMgdGhlCitoYXNoIHZhbHVlIHdhcyByZXF1aXJlZCB0byBiZSBhIHJlZ3VsYXIgaW50ZWdlciwgYnV0IGluIDIuNSB0aGUKK1xmdW5jdGlvbntpZCgpfSBidWlsdC1pbiB3YXMgY2hhbmdlZCB0byBhbHdheXMgcmV0dXJuIG5vbi1uZWdhdGl2ZQorbnVtYmVycywgYW5kIHVzZXJzIG9mdGVuIHNlZW0gdG8gdXNlIFxjb2Rle2lkKHNlbGYpfSBpbgorXG1ldGhvZHtfX2hhc2hfXygpfSBtZXRob2RzICh0aG91Z2ggdGhpcyBpcyBkaXNjb3VyYWdlZCkuCislIEJ1ZyAjMTUzNjAyMQogCiBcaXRlbSBBU0NJSSBpcyBub3cgdGhlIGRlZmF1bHQgZW5jb2RpbmcgZm9yIG1vZHVsZXMuICBJdCdzIG5vdyAKIGEgc3ludGF4IGVycm9yIGlmIGEgbW9kdWxlIGNvbnRhaW5zIHN0cmluZyBsaXRlcmFscyB3aXRoIDgtYml0CkBAIC0xMTEzLDkgKzExODgsMTIgQEAKIHRvIGluY2x1ZGUgYW4gXGZpbGV7X19pbml0X18ucHl9IG1vZHVsZSBpbiBhIHBhY2thZ2UgZGlyZWN0b3J5LgogRGVidWdnaW5nIHRoaXMgbWlzdGFrZSBjYW4gYmUgY29uZnVzaW5nLCBhbmQgdXN1YWxseSByZXF1aXJlcyBydW5uaW5nCiBQeXRob24gd2l0aCB0aGUgXHByb2dyYW1vcHR7LXZ9IHN3aXRjaCB0byBsb2cgYWxsIHRoZSBwYXRocyBzZWFyY2hlZC4KLUluIFB5dGhvbiAyLjUsIGEgbmV3IFxleGNlcHRpb257SW1wb3J0V2FybmluZ30gd2FybmluZyBpcyByYWlzZWQgd2hlbgorSW4gUHl0aG9uIDIuNSwgYSBuZXcgXGV4Y2VwdGlvbntJbXBvcnRXYXJuaW5nfSB3YXJuaW5nIGlzIHRyaWdnZXJlZCB3aGVuCiBhbiBpbXBvcnQgd291bGQgaGF2ZSBwaWNrZWQgdXAgYSBkaXJlY3RvcnkgYXMgYSBwYWNrYWdlIGJ1dCBubwotXGZpbGV7X19pbml0X18ucHl9IHdhcyBmb3VuZC4gIChJbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4pCitcZmlsZXtfX2luaXRfXy5weX0gd2FzIGZvdW5kLiAgVGhpcyB3YXJuaW5nIGlzIHNpbGVudGx5IGlnbm9yZWQgYnkgZGVmYXVsdDsKK3Byb3ZpZGUgdGhlIFxwcm9ncmFtb3B0ey1XZH0gb3B0aW9uIHdoZW4gcnVubmluZyB0aGUgUHl0aG9uIGV4ZWN1dGFibGUKK3RvIGRpc3BsYXkgdGhlIHdhcm5pbmcgbWVzc2FnZS4KKyhJbXBsZW1lbnRlZCBieSBUaG9tYXMgV291dGVycy4pCiAKIFxpdGVtIFRoZSBsaXN0IG9mIGJhc2UgY2xhc3NlcyBpbiBhIGNsYXNzIGRlZmluaXRpb24gY2FuIG5vdyBiZSBlbXB0eS4gIAogQXMgYW4gZXhhbXBsZSwgdGhpcyBpcyBub3cgbGVnYWw6CkBAIC0xMTQ2LDYgKzEyMjQsMTEgQEAKIE5ld2JpZXMgd2hvIHRyeSBcY29kZXtxdWl0KCl9IG9yIFxjb2Rle2V4aXQoKX0gd2lsbCBub3cgZXhpdCB0aGUKIGludGVycHJldGVyIGFzIHRoZXkgZXhwZWN0LiAgKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbC4pCiAKK1RoZSBQeXRob24gZXhlY3V0YWJsZSBub3cgYWNjZXB0cyB0aGUgc3RhbmRhcmQgbG9uZyBvcHRpb25zIAorXGxvbmdwcm9ncmFtb3B0e2hlbHB9IGFuZCBcbG9uZ3Byb2dyYW1vcHR7dmVyc2lvbn07IG9uIFdpbmRvd3MsIAoraXQgYWxzbyBhY2NlcHRzIHRoZSBccHJvZ3JhbW9wdHsvP30gb3B0aW9uIGZvciBkaXNwbGF5aW5nIGEgaGVscCBtZXNzYWdlLgorKEltcGxlbWVudGVkIGJ5IEdlb3JnIEJyYW5kbC4pCisKIAogJT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzdWJzZWN0aW9ue09wdGltaXphdGlvbnNcbGFiZWx7b3B0c319CkBAIC0xMTk0LDcgKzEyNzcsOCBAQAogXGl0ZW0gVGhlIGNvZGUgZ2VuZXJhdG9yJ3MgcGVlcGhvbGUgb3B0aW1pemVyIG5vdyBwZXJmb3Jtcwogc2ltcGxlIGNvbnN0YW50IGZvbGRpbmcgaW4gZXhwcmVzc2lvbnMuICBJZiB5b3Ugd3JpdGUgc29tZXRoaW5nIGxpa2UKIFxjb2Rle2EgPSAyKzN9LCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBkbyB0aGUgYXJpdGhtZXRpYyBhbmQgcHJvZHVjZQotY29kZSBjb3JyZXNwb25kaW5nIHRvIFxjb2Rle2EgPSA1fS4KK2NvZGUgY29ycmVzcG9uZGluZyB0byBcY29kZXthID0gNX0uICAoUHJvcG9zZWQgYW5kIGltcGxlbWVudGVkIAorYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCiBcaXRlbSBGdW5jdGlvbiBjYWxscyBhcmUgbm93IGZhc3RlciBiZWNhdXNlIGNvZGUgb2JqZWN0cyBub3cga2VlcCAKIHRoZSBtb3N0IHJlY2VudGx5IGZpbmlzaGVkIGZyYW1lIChhIGBgem9tYmllIGZyYW1lJycpIGluIGFuIGludGVybmFsCkBAIC0xMjg4LDEwICsxMzcyLDEzIEBACiAgICAgICAgICdyJzogWydyaXRyb3ZhaSddLCAndSc6IFsndW5hJ10sICd2JzogWyd2aXRhJywgJ3ZpYSddfQogXGVuZHt2ZXJiYXRpbX0KIAotVGhlIFxjbGFzc3tkZXF1ZX0gZG91YmxlLWVuZGVkIHF1ZXVlIHR5cGUgc3VwcGxpZWQgYnkgdGhlCisoQ29udHJpYnV0ZWQgYnkgR3VpZG8gdmFuflJvc3N1bS4pCisKK1xpdGVtIFRoZSBcY2xhc3N7ZGVxdWV9IGRvdWJsZS1lbmRlZCBxdWV1ZSB0eXBlIHN1cHBsaWVkIGJ5IHRoZQogXG1vZHVsZXtjb2xsZWN0aW9uc30gbW9kdWxlIG5vdyBoYXMgYSBcbWV0aG9ke3JlbW92ZShcdmFye3ZhbHVlfSl9CiBtZXRob2QgdGhhdCByZW1vdmVzIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIFx2YXJ7dmFsdWV9IGluIHRoZSBxdWV1ZSwKIHJhaXNpbmcgXGV4Y2VwdGlvbntWYWx1ZUVycm9yfSBpZiB0aGUgdmFsdWUgaXNuJ3QgZm91bmQuCisoQ29udHJpYnV0ZWQgYnkgUmF5bW9uZCBIZXR0aW5nZXIuKQogCiBcaXRlbSBOZXcgbW9kdWxlOiBUaGUgXG1vZHVsZXtjb250ZXh0bGlifSBtb2R1bGUgY29udGFpbnMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgdXNlIAogd2l0aCB0aGUgbmV3ICdca2V5d29yZHt3aXRofScgc3RhdGVtZW50LiAgU2VlCkBAIC0xMzIwLDYgKzE0MDcsMTcgQEAKIFxtZW1iZXJ7bGluZV9udW19IGF0dHJpYnV0ZSB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGxpbmVzCiByZWFkIGZyb20gdGhlIHNvdXJjZTsgcmVjb3JkcyBjYW4gc3BhbiBtdWx0aXBsZSBwaHlzaWNhbCBsaW5lcywgc28KIFxtZW1iZXJ7bGluZV9udW19IGlzIG5vdCB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZC4KKworVGhlIENTViBwYXJzZXIgaXMgbm93IHN0cmljdGVyIGFib3V0IG11bHRpLWxpbmUgcXVvdGVkCitmaWVsZHMuIFByZXZpb3VzbHksIGlmIGEgbGluZSBlbmRlZCB3aXRoaW4gYSBxdW90ZWQgZmllbGQgd2l0aG91dCBhCit0ZXJtaW5hdGluZyBuZXdsaW5lIGNoYXJhY3RlciwgYSBuZXdsaW5lIHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlCityZXR1cm5lZCBmaWVsZC4gVGhpcyBiZWhhdmlvciBjYXVzZWQgcHJvYmxlbXMgd2hlbiByZWFkaW5nIGZpbGVzIHRoYXQKK2NvbnRhaW5lZCBjYXJyaWFnZSByZXR1cm4gY2hhcmFjdGVycyB3aXRoaW4gZmllbGRzLCBzbyB0aGUgY29kZSB3YXMKK2NoYW5nZWQgdG8gcmV0dXJuIHRoZSBmaWVsZCB3aXRob3V0IGluc2VydGluZyBuZXdsaW5lcy4gQXMgYQorY29uc2VxdWVuY2UsIGlmIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMgYXJlIGltcG9ydGFudCwgdGhlCitpbnB1dCBzaG91bGQgYmUgc3BsaXQgaW50byBsaW5lcyBpbiBhIG1hbm5lciB0aGF0IHByZXNlcnZlcyB0aGUKK25ld2xpbmUgY2hhcmFjdGVycy4KKwogKENvbnRyaWJ1dGVkIGJ5IFNraXAgTW9udGFuYXJvIGFuZCBBbmRyZXcgTWNOYW1hcmEuKQogCiBcaXRlbSBUaGUgXGNsYXNze2RhdGV0aW1lfSBjbGFzcyBpbiB0aGUgXG1vZHVsZXtkYXRldGltZX0gCkBAIC0xMzM1LDExICsxNDMzLDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICclSDolTTolUyAlWS0lbS0lZCcpCiBcZW5ke3ZlcmJhdGltfQogCitcaXRlbSBUaGUgXG1ldGhvZHtTZXF1ZW5jZU1hdGNoZXIuZ2V0X21hdGNoaW5nX2Jsb2NrcygpfSBtZXRob2QKK2luIHRoZSBcbW9kdWxle2RpZmZsaWJ9IG1vZHVsZSBub3cgZ3VhcmFudGVlcyB0byByZXR1cm4gYSBtaW5pbWFsIGxpc3QKK29mIGJsb2NrcyBkZXNjcmliaW5nIG1hdGNoaW5nIHN1YnNlcXVlbmNlcy4gIFByZXZpb3VzbHksIHRoZSBhbGdvcml0aG0gd291bGQKK29jY2FzaW9uYWxseSBicmVhayBhIGJsb2NrIG9mIG1hdGNoaW5nIGVsZW1lbnRzIGludG8gdHdvIGxpc3QgZW50cmllcy4KKyhFbmhhbmNlbWVudCBieSBUaW0gUGV0ZXJzLikKKwogXGl0ZW0gVGhlIFxtb2R1bGV7ZG9jdGVzdH0gbW9kdWxlIGdhaW5lZCBhIFxjb2Rle1NLSVB9IG9wdGlvbiB0aGF0CiBrZWVwcyBhbiBleGFtcGxlIGZyb20gYmVpbmcgZXhlY3V0ZWQgYXQgYWxsLiAgVGhpcyBpcyBpbnRlbmRlZCBmb3IKIGNvZGUgc25pcHBldHMgdGhhdCBhcmUgdXNhZ2UgZXhhbXBsZXMgaW50ZW5kZWQgZm9yIHRoZSByZWFkZXIgYW5kCiBhcmVuJ3QgYWN0dWFsbHkgdGVzdCBjYXNlcy4KIAorQW4gXHZhcntlbmNvZGluZ30gcGFyYW1ldGVyIHdhcyBhZGRlZCB0byB0aGUgXGZ1bmN0aW9ue3Rlc3RmaWxlKCl9CitmdW5jdGlvbiBhbmQgdGhlIFxjbGFzc3tEb2NGaWxlU3VpdGV9IGNsYXNzIHRvIHNwZWNpZnkgdGhlIGZpbGUncworZW5jb2RpbmcuICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2Ugbm9uLUFTQ0lJIGNoYXJhY3RlcnMgaW4gCit0ZXN0cyBjb250YWluZWQgd2l0aGluIGEgZG9jc3RyaW5nLiAgKENvbnRyaWJ1dGVkIGJ5IEJqb3JuIFRpbGxlbml1cy4pCislIFBhdGNoIDEwODA3MjcKKworXGl0ZW0gVGhlIFxtb2R1bGV7ZW1haWx9IHBhY2thZ2UgaGFzIGJlZW4gdXBkYXRlZCB0byB2ZXJzaW9uIDQuMC4KKyUgWFhYIG5lZWQgdG8gcHJvdmlkZSBzb21lIG1vcmUgZGV0YWlsIGhlcmUKKyhDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXtmaWxlaW5wdXR9IG1vZHVsZSB3YXMgbWFkZSBtb3JlIGZsZXhpYmxlLgogVW5pY29kZSBmaWxlbmFtZXMgYXJlIG5vdyBzdXBwb3J0ZWQsIGFuZCBhIFx2YXJ7bW9kZX0gcGFyYW1ldGVyIHRoYXQKIGRlZmF1bHRzIHRvIFxjb2RleyJyIn0gd2FzIGFkZGVkIHRvIHRoZQpAQCAtMTM1OCw2ICsxNDcyLDcgQEAKIGNvbGxlY3Rpb24gc3dlZXAgd2lsbCBiZSBtYWRlLiAgVGhlIGV4aXN0aW5nIFxmdW5jdGlvbntnYy5jb2xsZWN0KCl9CiBmdW5jdGlvbiBub3cgdGFrZXMgYW4gb3B0aW9uYWwgXHZhcntnZW5lcmF0aW9ufSBhcmd1bWVudCBvZiAwLCAxLCBvciAyCiB0byBzcGVjaWZ5IHdoaWNoIGdlbmVyYXRpb24gdG8gY29sbGVjdC4KKyhDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQogCiBcaXRlbSBUaGUgXGZ1bmN0aW9ue25zbWFsbGVzdCgpfSBhbmQgCiBcZnVuY3Rpb257bmxhcmdlc3QoKX0gZnVuY3Rpb25zIGluIHRoZSBcbW9kdWxle2hlYXBxfSBtb2R1bGUgCkBAIC0xMzg4LDYgKzE1MDMsMjkgQEAKIAogKENvbnRyaWJ1dGVkIGJ5IFJheW1vbmQgSGV0dGluZ2VyLikKIAorXGl0ZW0gVGhlIFxmdW5jdGlvbntmb3JtYXQoKX0gZnVuY3Rpb24gaW4gdGhlIFxtb2R1bGV7bG9jYWxlfSBtb2R1bGUKK2hhcyBiZWVuIG1vZGlmaWVkIGFuZCB0d28gbmV3IGZ1bmN0aW9ucyB3ZXJlIGFkZGVkLAorXGZ1bmN0aW9ue2Zvcm1hdF9zdHJpbmcoKX0gYW5kIFxmdW5jdGlvbntjdXJyZW5jeSgpfS4KKworVGhlIFxmdW5jdGlvbntmb3JtYXQoKX0gZnVuY3Rpb24ncyBcdmFye3ZhbH0gcGFyYW1ldGVyIGNvdWxkCitwcmV2aW91c2x5IGJlIGEgc3RyaW5nIGFzIGxvbmcgYXMgbm8gbW9yZSB0aGFuIG9uZSBcJWNoYXIgc3BlY2lmaWVyCithcHBlYXJlZDsgbm93IHRoZSBwYXJhbWV0ZXIgbXVzdCBiZSBleGFjdGx5IG9uZSBcJWNoYXIgc3BlY2lmaWVyIHdpdGgKK25vIHN1cnJvdW5kaW5nIHRleHQuICBBbiBvcHRpb25hbCBcdmFye21vbmV0YXJ5fSBwYXJhbWV0ZXIgd2FzIGFsc28KK2FkZGVkIHdoaWNoLCBpZiBcY29kZXtUcnVlfSwgd2lsbCB1c2UgdGhlIGxvY2FsZSdzIHJ1bGVzIGZvcgorZm9ybWF0dGluZyBjdXJyZW5jeSBpbiBwbGFjaW5nIGEgc2VwYXJhdG9yIGJldHdlZW4gZ3JvdXBzIG9mIHRocmVlCitkaWdpdHMuCisKK1RvIGZvcm1hdCBzdHJpbmdzIHdpdGggbXVsdGlwbGUgXCVjaGFyIHNwZWNpZmllcnMsIHVzZSB0aGUgbmV3CitcZnVuY3Rpb257Zm9ybWF0X3N0cmluZygpfSBmdW5jdGlvbiB0aGF0IHdvcmtzIGxpa2UgXGZ1bmN0aW9ue2Zvcm1hdCgpfQorYnV0IGFsc28gc3VwcG9ydHMgbWl4aW5nIFwlY2hhciBzcGVjaWZpZXJzIHdpdGgKK2FyYml0cmFyeSB0ZXh0LgorCitBIG5ldyBcZnVuY3Rpb257Y3VycmVuY3koKX0gZnVuY3Rpb24gd2FzIGFsc28gYWRkZWQgdGhhdCBmb3JtYXRzIGEKK251bWJlciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbG9jYWxlJ3Mgc2V0dGluZ3MuCisKKyhDb250cmlidXRlZCBieSBHZW9yZyBCcmFuZGwuKQorJSBQYXRjaCAxMTgwMjk2CisKIFxpdGVtIFRoZSBcbW9kdWxle21haWxib3h9IG1vZHVsZSB1bmRlcndlbnQgYSBtYXNzaXZlIHJld3JpdGUgdG8gYWRkCiB0aGUgY2FwYWJpbGl0eSB0byBtb2RpZnkgbWFpbGJveGVzIGluIGFkZGl0aW9uIHRvIHJlYWRpbmcgdGhlbS4gIEEgbmV3CiBzZXQgb2YgY2xhc3NlcyB0aGF0IGluY2x1ZGUgXGNsYXNze21ib3h9LCBcY2xhc3N7TUh9LCBhbmQKQEAgLTE0OTYsNiArMTYzNCw5IEBACiBwZXJmb3JtaW5nIG1hbnkgZGlmZmVyZW50IG9wZXJhdGlvbnMgYW5kIHJlZHVjaW5nIHRoZSByZXN1bHQgdG8gYQogc2luZ2xlIG51bWJlciBhcyBcZmlsZXtweXN0b25lLnB5fSBkb2VzLgogCitcaXRlbSBUaGUgXG1vZHVsZXtweWV4cGF0fSBtb2R1bGUgbm93IHVzZXMgdmVyc2lvbiAyLjAgb2YgdGhlIEV4cGF0IHBhcnNlci4KKyhDb250cmlidXRlZCBieSBUcmVudCBNaWNrLikKKwogXGl0ZW0gVGhlIG9sZCBcbW9kdWxle3JlZ2V4fSBhbmQgXG1vZHVsZXtyZWdzdWJ9IG1vZHVsZXMsIHdoaWNoIGhhdmUgYmVlbiAKIGRlcHJlY2F0ZWQgZXZlciBzaW5jZSBQeXRob24gMi4wLCBoYXZlIGZpbmFsbHkgYmVlbiBkZWxldGVkLiAgCiBPdGhlciBkZWxldGVkIG1vZHVsZXM6IFxtb2R1bGV7c3RhdGNhY2hlfSwgXG1vZHVsZXt0enBhcnNlfSwKQEAgLTE1NjAsNyArMTcwMSw3IEBACiBcZW5ke3ZlcmJhdGltfQogCiBZb3UgY2FuIGFsc28gcGFjayBhbmQgdW5wYWNrIGRhdGEgdG8gYW5kIGZyb20gYnVmZmVyIG9iamVjdHMgZGlyZWN0bHkKLXVzaW5nIHRoZSBcbWV0aG9ke3BhY2tfdG8oXHZhcntidWZmZXJ9LCBcdmFye29mZnNldH0sIFx2YXJ7djF9LAordXNpbmcgdGhlIFxtZXRob2R7cGFja19pbnRvKFx2YXJ7YnVmZmVyfSwgXHZhcntvZmZzZXR9LCBcdmFye3YxfSwKIFx2YXJ7djJ9LCAuLi4pfSBhbmQgXG1ldGhvZHt1bnBhY2tfZnJvbShcdmFye2J1ZmZlcn0sIFx2YXJ7b2Zmc2V0fSl9CiBtZXRob2RzLiAgVGhpcyBsZXRzIHlvdSBzdG9yZSBkYXRhIGRpcmVjdGx5IGludG8gYW4gYXJyYXkgb3IgYQogbWVtb3J5LW1hcHBlZCBmaWxlLgpAQCAtMTU4MiwyMiArMTcyMyw3NiBAQAogXGNvZGV7InRydW5rOjQ1MzU1OjQ1MzU2TSwgQXByIDEzIDIwMDYsIDA3OjQyOjE5In0uICAKIChDb250cmlidXRlZCBieSBCYXJyeSBXYXJzYXcuKQogCitcaXRlbSBBbm90aGVyIG5ldyBmdW5jdGlvbiwgXGZ1bmN0aW9ue3N5cy5fY3VycmVudF9mcmFtZXMoKX0sIHJldHVybnMKK3RoZSBjdXJyZW50IHN0YWNrIGZyYW1lcyBmb3IgYWxsIHJ1bm5pbmcgdGhyZWFkcyBhcyBhIGRpY3Rpb25hcnkKK21hcHBpbmcgdGhyZWFkIGlkZW50aWZpZXJzIHRvIHRoZSB0b3Btb3N0IHN0YWNrIGZyYW1lIGN1cnJlbnRseSBhY3RpdmUKK2luIHRoYXQgdGhyZWFkIGF0IHRoZSB0aW1lIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuICAoQ29udHJpYnV0ZWQgYnkKK1RpbSBQZXRlcnMuKQorCiBcaXRlbSBUaGUgXGNsYXNze1RhckZpbGV9IGNsYXNzIGluIHRoZSBcbW9kdWxle3RhcmZpbGV9IG1vZHVsZSBub3cgaGFzCiBhbiBcbWV0aG9ke2V4dHJhY3RhbGwoKX0gbWV0aG9kIHRoYXQgZXh0cmFjdHMgYWxsIG1lbWJlcnMgZnJvbSB0aGUKIGFyY2hpdmUgaW50byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIEl0J3MgYWxzbyBwb3NzaWJsZSB0byBzZXQKIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBhcyB0aGUgZXh0cmFjdGlvbiB0YXJnZXQsIGFuZCB0byB1bnBhY2sgb25seSBhCi1zdWJzZXQgb2YgdGhlIGFyY2hpdmUncyBtZW1iZXJzLiAgCitzdWJzZXQgb2YgdGhlIGFyY2hpdmUncyBtZW1iZXJzLgogCi1BIHRhcmZpbGUncyBjb21wcmVzc2lvbiBjYW4gYmUgYXV0b2RldGVjdGVkIGJ5IAotdXNpbmcgdGhlIG1vZGUgXGNvZGV7J3J8Kid9LgorVGhlIGNvbXByZXNzaW9uIHVzZWQgZm9yIGEgdGFyZmlsZSBvcGVuZWQgaW4gc3RyZWFtIG1vZGUgY2FuIG5vdyBiZQorYXV0b2RldGVjdGVkIHVzaW5nIHRoZSBtb2RlIFxjb2RleydyfConfS4KICUgcGF0Y2ggOTE4MTAxCiAoQ29udHJpYnV0ZWQgYnkgTGFycyBHdXN0XCJhYmVsLikKIAorXGl0ZW0gVGhlIFxtb2R1bGV7dGhyZWFkaW5nfSBtb2R1bGUgbm93IGxldHMgeW91IHNldCB0aGUgc3RhY2sgc2l6ZQordXNlZCB3aGVuIG5ldyB0aHJlYWRzIGFyZSBjcmVhdGVkLiBUaGUKK1xmdW5jdGlvbntzdGFja19zaXplKFxvcHRpb25hbHtcdmFye3NpemV9fSl9IGZ1bmN0aW9uIHJldHVybnMgdGhlCitjdXJyZW50bHkgY29uZmlndXJlZCBzdGFjayBzaXplLCBhbmQgc3VwcGx5aW5nIHRoZSBvcHRpb25hbCBcdmFye3NpemV9CitwYXJhbWV0ZXIgc2V0cyBhIG5ldyB2YWx1ZS4gIE5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgY2hhbmdpbmcgdGhlCitzdGFjayBzaXplLCBidXQgV2luZG93cywgUE9TSVggdGhyZWFkaW5nLCBhbmQgT1MvMiBhbGwgZG8uCisoQ29udHJpYnV0ZWQgYnkgQW5kcmV3IE1hY0ludHlyZS4pCislIFBhdGNoIDE0NTQ0ODEKKwogXGl0ZW0gVGhlIFxtb2R1bGV7dW5pY29kZWRhdGF9IG1vZHVsZSBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSB2ZXJzaW9uIDQuMS4wCiBvZiB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgZGF0YWJhc2UuICBWZXJzaW9uIDMuMi4wIGlzIHJlcXVpcmVkIAogYnkgc29tZSBzcGVjaWZpY2F0aW9ucywgc28gaXQncyBzdGlsbCBhdmFpbGFibGUgYXMgCiBcbWVtYmVye3VuaWNvZGVkYXRhLnVjZF8zXzJfMH0uCiAKK1xpdGVtIE5ldyBtb2R1bGU6IHRoZSAgXG1vZHVsZXt1dWlkfSBtb2R1bGUgZ2VuZXJhdGVzIAordW5pdmVyc2FsbHkgdW5pcXVlIGlkZW50aWZpZXJzIChVVUlEcykgYWNjb3JkaW5nIHRvIFxyZmN7NDEyMn0uICBUaGUKK1JGQyBkZWZpbmVzIHNldmVyYWwgZGlmZmVyZW50IFVVSUQgdmVyc2lvbnMgdGhhdCBhcmUgZ2VuZXJhdGVkIGZyb20gYQorc3RhcnRpbmcgc3RyaW5nLCBmcm9tIHN5c3RlbSBwcm9wZXJ0aWVzLCBvciBwdXJlbHkgcmFuZG9tbHkuICBUaGlzCittb2R1bGUgY29udGFpbnMgYSBcY2xhc3N7VVVJRH0gY2xhc3MgYW5kIAorZnVuY3Rpb25zIG5hbWVkIFxmdW5jdGlvbnt1dWlkMSgpfSwKK1xmdW5jdGlvbnt1dWlkMygpfSwgXGZ1bmN0aW9ue3V1aWQ0KCl9LCAgYW5kIAorXGZ1bmN0aW9ue3V1aWQ1KCl9IHRvIGdlbmVyYXRlIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBVVUlELiAgKFZlcnNpb24gMiBVVUlEcyAKK2FyZSBub3Qgc3BlY2lmaWVkIGluIFxyZmN7NDEyMn0gYW5kIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbW9kdWxlLikKKworXGJlZ2lue3ZlcmJhdGltfQorPj4+IGltcG9ydCB1dWlkCis+Pj4gIyBtYWtlIGEgVVVJRCBiYXNlZCBvbiB0aGUgaG9zdCBJRCBhbmQgY3VycmVudCB0aW1lCis+Pj4gdXVpZC51dWlkMSgpCitVVUlEKCdhODA5OGMxYS1mODZlLTExZGEtYmQxYS0wMDExMjQ0NGJlMWUnKQorCis+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhbiBNRDUgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKz4+PiB1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX0ROUywgJ3B5dGhvbi5vcmcnKQorVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworPj4+ICMgbWFrZSBhIHJhbmRvbSBVVUlECis+Pj4gdXVpZC51dWlkNCgpCitVVUlEKCcxNmZkMjcwNi04YmFmLTQzM2ItODJlYi04YzdmYWRhODQ3ZGEnKQorCis+Pj4gIyBtYWtlIGEgVVVJRCB1c2luZyBhIFNIQS0xIGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCis+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKK1VVSUQoJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpCitcZW5ke3ZlcmJhdGltfQorCisoQ29udHJpYnV0ZWQgYnkgS2EtUGluZyBZZWUuKQorCitcaXRlbSBUaGUgXG1vZHVsZXt3ZWFrcmVmfSBtb2R1bGUncyBcY2xhc3N7V2Vha0tleURpY3Rpb25hcnl9IGFuZAorXGNsYXNze1dlYWtWYWx1ZURpY3Rpb25hcnl9IHR5cGVzIGdhaW5lZCBuZXcgbWV0aG9kcyBmb3IgaXRlcmF0aW5nCitvdmVyIHRoZSB3ZWFrIHJlZmVyZW5jZXMgY29udGFpbmVkIGluIHRoZSBkaWN0aW9uYXJ5LiAKK1xtZXRob2R7aXRlcmtleXJlZnMoKX0gYW5kIFxtZXRob2R7a2V5cmVmcygpfSBtZXRob2RzIHdlcmUKK2FkZGVkIHRvIFxjbGFzc3tXZWFrS2V5RGljdGlvbmFyeX0sIGFuZAorXG1ldGhvZHtpdGVydmFsdWVyZWZzKCl9IGFuZCBcbWV0aG9ke3ZhbHVlcmVmcygpfSB3ZXJlIGFkZGVkIHRvCitcY2xhc3N7V2Vha1ZhbHVlRGljdGlvbmFyeX0uICAoQ29udHJpYnV0ZWQgYnkgRnJlZCBMLn5EcmFrZSwgSnIuKQorCiBcaXRlbSBUaGUgXG1vZHVsZXt3ZWJicm93c2VyfSBtb2R1bGUgcmVjZWl2ZWQgYSBudW1iZXIgb2YKIGVuaGFuY2VtZW50cy4KIEl0J3Mgbm93IHVzYWJsZSBhcyBhIHNjcmlwdCB3aXRoIFxjb2Rle3B5dGhvbiAtbSB3ZWJicm93c2VyfSwgdGFraW5nIGEKQEAgLTE2MDksMTEgKzE4MDQsMTAgQEAKIGFkZGl0aW9uYWwgZmVhdHVyZSwgYW4gXHZhcnthdXRvcmFpc2V9IHBhcmFtZXRlciB0aGF0IHNpZ25hbHMgd2hldGhlcgogdG8gcmFpc2UgdGhlIG9wZW4gd2luZG93IHdoZW4gcG9zc2libGUuIEEgbnVtYmVyIG9mIGFkZGl0aW9uYWwKIGJyb3dzZXJzIHdlcmUgYWRkZWQgdG8gdGhlIHN1cHBvcnRlZCBsaXN0IHN1Y2ggYXMgRmlyZWZveCwgT3BlcmEsCi1Lb25xdWVyb3IsIGFuZCBlbGlua3MuICAoQ29udHJpYnV0ZWQgYnkgT2xlZyBCcm95dG1hbm4gYW5kIEdlb3JnZQorS29ucXVlcm9yLCBhbmQgZWxpbmtzLiAgKENvbnRyaWJ1dGVkIGJ5IE9sZWcgQnJveXRtYW5uIGFuZCBHZW9yZwogQnJhbmRsLikKICUgUGF0Y2ggIzc1NDAyMgogCi0KIFxpdGVtIFRoZSBcbW9kdWxle3htbHJwY2xpYn0gbW9kdWxlIG5vdyBzdXBwb3J0cyByZXR1cm5pbmcgCiAgICAgICBcY2xhc3N7ZGF0ZXRpbWV9IG9iamVjdHMgZm9yIHRoZSBYTUwtUlBDIGRhdGUgdHlwZS4gIFN1cHBseSAKICAgICAgIFxjb2Rle3VzZV9kYXRldGltZT1UcnVlfSB0byB0aGUgXGZ1bmN0aW9ue2xvYWRzKCl9IGZ1bmN0aW9uCkBAIC0xNjIxLDYgKzE4MTUsMTIgQEAKICAgICAgIChDb250cmlidXRlZCBieSBTa2lwIE1vbnRhbmFyby4pCiAlIFBhdGNoIDExMjAzNTMKIAorXGl0ZW0gVGhlIFxtb2R1bGV7emlwZmlsZX0gbW9kdWxlIG5vdyBzdXBwb3J0cyB0aGUgWklQNjQgdmVyc2lvbiBvZiB0aGUgCitmb3JtYXQsIG1lYW5pbmcgdGhhdCBhIC56aXAgYXJjaGl2ZSBjYW4gbm93IGJlIGxhcmdlciB0aGFuIDR+R2lCIGFuZAorY2FuIGNvbnRhaW4gaW5kaXZpZHVhbCBmaWxlcyBsYXJnZXIgdGhhbiA0fkdpQi4gIChDb250cmlidXRlZCBieQorUm9uYWxkIE91c3NvcmVuLikKKyUgUGF0Y2ggMTQ0NjQ4OQorCiBcaXRlbSBUaGUgXG1vZHVsZXt6bGlifSBtb2R1bGUncyBcY2xhc3N7Q29tcHJlc3N9IGFuZCBcY2xhc3N7RGVjb21wcmVzc30KIG9iamVjdHMgbm93IHN1cHBvcnQgYSBcbWV0aG9ke2NvcHkoKX0gbWV0aG9kIHRoYXQgbWFrZXMgYSBjb3B5IG9mIHRoZSAKIG9iamVjdCdzIGludGVybmFsIHN0YXRlIGFuZCByZXR1cm5zIGEgbmV3IApAQCAtMTcxMSw2ICsxOTExLDkgQEAKIFxzZWV1cmx7aHR0cDovL3N0YXJzaGlwLnB5dGhvbi5uZXQvY3Jldy90aGVsbGVyL2N0eXBlcy99CiB7VGhlIGN0eXBlcyB3ZWIgcGFnZSwgd2l0aCBhIHR1dG9yaWFsLCByZWZlcmVuY2UsIGFuZCBGQVEufQogCitcc2VldXJsey4uL2xpYi9tb2R1bGUtY3R5cGVzLmh0bWx9e1RoZSBkb2N1bWVudGF0aW9uIAorZm9yIHRoZSBcbW9kdWxle2N0eXBlc30gbW9kdWxlLn0KKwogXGVuZHtzZWVhbHNvfQogCiAKQEAgLTE4MjIsNyArMjAyNSw2IEBACiBcc2VldXJse2h0dHA6Ly9lZmZib3Qub3JnL3pvbmUvZWxlbWVudC1pbmRleC5odG19CiB7T2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBmb3IgRWxlbWVudFRyZWUufQogCi0KIFxlbmR7c2VlYWxzb30KIAogCkBAIC0xODczLDYgKzIwNzUsMTMgQEAKIHJldHVybiB0aGUgZGlnZXN0IHZhbHVlIGFzIGEgYmluYXJ5IHN0cmluZyBvciBhIHN0cmluZyBvZiBoZXggZGlnaXRzLAogYW5kIFxtZXRob2R7Y29weSgpfSByZXR1cm5zIGEgbmV3IGhhc2hpbmcgb2JqZWN0IHdpdGggdGhlIHNhbWUgZGlnZXN0IHN0YXRlLgogCitcYmVnaW57c2VlYWxzb30KKworXHNlZXVybHsuLi9saWIvbW9kdWxlLWhhc2hsaWIuaHRtbH17VGhlIGRvY3VtZW50YXRpb24gCitmb3IgdGhlIFxtb2R1bGV7aGFzaGxpYn0gbW9kdWxlLn0KKworXGVuZHtzZWVhbHNvfQorCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBcc3Vic2VjdGlvbntUaGUgc3FsaXRlMyBwYWNrYWdlXGxhYmVse21vZHVsZS1zcWxpdGV9fQpAQCAtMTk4MywxMiArMjE5Miw1MyBAQAoge1RoZSBTUUxpdGUgd2ViIHBhZ2U7IHRoZSBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyB0aGUgc3ludGF4IGFuZCB0aGUKIGF2YWlsYWJsZSBkYXRhIHR5cGVzIGZvciB0aGUgc3VwcG9ydGVkIFNRTCBkaWFsZWN0Ln0KIAorXHNlZXVybHsuLi9saWIvbW9kdWxlLXNxbGl0ZTMuaHRtbH17VGhlIGRvY3VtZW50YXRpb24gCitmb3IgdGhlIFxtb2R1bGV7c3FsaXRlM30gbW9kdWxlLn0KKwogXHNlZXBlcHsyNDl9e0RhdGFiYXNlIEFQSSBTcGVjaWZpY2F0aW9uIDIuMH17UEVQIHdyaXR0ZW4gYnkKIE1hcmMtQW5kclwnZSBMZW1idXJnLn0KIAogXGVuZHtzZWVhbHNvfQogCiAKKyU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Citcc3Vic2VjdGlvbntUaGUgd3NnaXJlZiBwYWNrYWdlXGxhYmVse21vZHVsZS13c2dpcmVmfX0KKworJSBYWFggc2hvdWxkIHRoaXMgYmUgaW4gYSBQRVAgMzMzIHNlY3Rpb24gaW5zdGVhZD8KKworVGhlIFdlYiBTZXJ2ZXIgR2F0ZXdheSBJbnRlcmZhY2UgKFdTR0kpIHYxLjAgZGVmaW5lcyBhIHN0YW5kYXJkCitpbnRlcmZhY2UgYmV0d2VlbiB3ZWIgc2VydmVycyBhbmQgUHl0aG9uIHdlYiBhcHBsaWNhdGlvbnMgYW5kIGlzCitkZXNjcmliZWQgaW4gXHBlcHszMzN9LiAgVGhlIFxtb2R1bGV7d3NnaXJlZn0gcGFja2FnZSBpcyBhIHJlZmVyZW5jZQoraW1wbGVtZW50YXRpb24gb2YgdGhlIFdTR0kgc3BlY2lmaWNhdGlvbi4KKworVGhlIHBhY2thZ2UgaW5jbHVkZXMgYSBiYXNpYyBIVFRQIHNlcnZlciB0aGF0IHdpbGwgcnVuIGEgV1NHSQorYXBwbGljYXRpb247IHRoaXMgc2VydmVyIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGJ1dCBpc24ndCBpbnRlbmRlZCBmb3IgCitwcm9kdWN0aW9uIHVzZS4gIFNldHRpbmcgdXAgYSBzZXJ2ZXIgdGFrZXMgb25seSBhIGZldyBsaW5lcyBvZiBjb2RlOgorCitcYmVnaW57dmVyYmF0aW19Citmcm9tIHdzZ2lyZWYgaW1wb3J0IHNpbXBsZV9zZXJ2ZXIKKword3NnaV9hcHAgPSAuLi4KKworaG9zdCA9ICcnCitwb3J0ID0gODAwMAoraHR0cGQgPSBzaW1wbGVfc2VydmVyLm1ha2Vfc2VydmVyKGhvc3QsIHBvcnQsIHdzZ2lfYXBwKQoraHR0cGQuc2VydmVfZm9yZXZlcigpCitcZW5ke3ZlcmJhdGltfQorCislIFhYWCBkaXNjdXNzIHN0cnVjdHVyZSBvZiBXU0dJIGFwcGxpY2F0aW9ucz8gIAorJSBYWFggcHJvdmlkZSBhbiBleGFtcGxlIHVzaW5nIERqYW5nbyBvciBzb21lIG90aGVyIGZyYW1ld29yaz8KKworXGJlZ2lue3NlZWFsc299CisKK1xzZWV1cmx7aHR0cDovL3d3dy53c2dpLm9yZ317QSBjZW50cmFsIHdlYiBzaXRlIGZvciBXU0dJLXJlbGF0ZWQgcmVzb3VyY2VzLn0KKworXHNlZXBlcHszMzN9e1B5dGhvbiBXZWIgU2VydmVyIEdhdGV3YXkgSW50ZXJmYWNlIHYxLjB9e1BFUCB3cml0dGVuIGJ5CitQaGlsbGlwIEouIEVieS59CisKK1xlbmR7c2VlYWxzb30KKworCiAlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIFxzZWN0aW9ue0J1aWxkIGFuZCBDIEFQSSBDaGFuZ2VzXGxhYmVse2J1aWxkLWFwaX19CiAKQEAgLTE5OTYsMTMgKzIyNDYsMjUgQEAKIAogXGJlZ2lue2l0ZW1pemV9CiAKK1xpdGVtIFRoZSBQeXRob24gc291cmNlIHRyZWUgd2FzIGNvbnZlcnRlZCBmcm9tIENWUyB0byBTdWJ2ZXJzaW9uLCAKK2luIGEgY29tcGxleCBtaWdyYXRpb24gcHJvY2VkdXJlIHRoYXQgd2FzIHN1cGVydmlzZWQgYW5kIGZsYXdsZXNzbHkKK2NhcnJpZWQgb3V0IGJ5IE1hcnRpbiB2b25+TFwib3dpcy4gIFRoZSBwcm9jZWR1cmUgd2FzIGRldmVsb3BlZCBhcworXHBlcHszNDd9LgorCitcaXRlbSBDb3Zlcml0eSwgYSBjb21wYW55IHRoYXQgbWFya2V0cyBhIHNvdXJjZSBjb2RlIGFuYWx5c2lzIHRvb2wKK2NhbGxlZCBQcmV2ZW50LCBwcm92aWRlZCB0aGUgcmVzdWx0cyBvZiB0aGVpciBleGFtaW5hdGlvbiBvZiB0aGUgUHl0aG9uCitzb3VyY2UgY29kZS4gIFRoZSBhbmFseXNpcyBmb3VuZCBhYm91dCA2MCBidWdzIHRoYXQgCit3ZXJlIHF1aWNrbHkgZml4ZWQuICBNYW55IG9mIHRoZSBidWdzIHdlcmUgcmVmY291bnRpbmcgcHJvYmxlbXMsIG9mdGVuCitvY2N1cnJpbmcgaW4gZXJyb3ItaGFuZGxpbmcgY29kZS4gIFNlZQorXHVybHtodHRwOi8vc2Nhbi5jb3Zlcml0eS5jb219IGZvciB0aGUgc3RhdGlzdGljcy4KKwogXGl0ZW0gVGhlIGxhcmdlc3QgY2hhbmdlIHRvIHRoZSBDIEFQSSBjYW1lIGZyb20gXHBlcHszNTN9LAogd2hpY2ggbW9kaWZpZXMgdGhlIGludGVycHJldGVyIHRvIHVzZSBhIFxjdHlwZXtQeV9zc2l6ZV90fSB0eXBlCiBkZWZpbml0aW9uIGluc3RlYWQgb2YgXGN0eXBle2ludH0uICBTZWUgdGhlIGVhcmxpZXIKIHNlY3Rpb25+XHJlZntwZXAtMzUzfSBmb3IgYSBkaXNjdXNzaW9uIG9mIHRoaXMgY2hhbmdlLgogCi1caXRlbSBUaGUgZGVzaWduIG9mIHRoZSBieXRlY29kZSBjb21waWxlciBoYXMgY2hhbmdlZCBhIGdyZWF0IGRlYWwsIHRvCi1ubyBsb25nZXIgZ2VuZXJhdGUgYnl0ZWNvZGUgYnkgdHJhdmVyc2luZyB0aGUgcGFyc2UgdHJlZS4gIEluc3RlYWQKK1xpdGVtIFRoZSBkZXNpZ24gb2YgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGhhcyBjaGFuZ2VkIGEgZ3JlYXQgZGVhbCwgCitubyBsb25nZXIgZ2VuZXJhdGluZyBieXRlY29kZSBieSB0cmF2ZXJzaW5nIHRoZSBwYXJzZSB0cmVlLiAgSW5zdGVhZAogdGhlIHBhcnNlIHRyZWUgaXMgY29udmVydGVkIHRvIGFuIGFic3RyYWN0IHN5bnRheCB0cmVlIChvciBBU1QpLCBhbmQgaXQgaXMgCiB0aGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUgdGhhdCdzIHRyYXZlcnNlZCB0byBwcm9kdWNlIHRoZSBieXRlY29kZS4KIApAQCAtMjAyMiwxMiArMjI4NCwxMyBAQAogZm9yX2xvb3AgPSBhc3QuYm9keVsxXQogXGVuZHt2ZXJiYXRpbX0KIAotTm8gZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB3cml0dGVuIGZvciB0aGUgQVNUIGNvZGUgeWV0LiAgVG8gc3RhcnQKLWxlYXJuaW5nIGFib3V0IGl0LCByZWFkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIEFTVCBub2RlcyBpbgotXGZpbGV7UGFyc2VyL1B5dGhvbi5hc2RsfS4gIEEgUHl0aG9uIHNjcmlwdCByZWFkcyB0aGlzIGZpbGUgYW5kCi1nZW5lcmF0ZXMgYSBzZXQgb2YgQyBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgaW4KLVxmaWxle0luY2x1ZGUvUHl0aG9uLWFzdC5ofS4gIFRoZSBcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21TdHJpbmcoKX0KLWFuZCBcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21GaWxlKCl9LCBkZWZpbmVkIGluCitObyBvZmZpY2lhbCBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHdyaXR0ZW4gZm9yIHRoZSBBU1QgY29kZSB5ZXQsIGJ1dAorXHBlcHszMzl9IGRpc2N1c3NlcyB0aGUgZGVzaWduLiAgVG8gc3RhcnQgbGVhcm5pbmcgYWJvdXQgdGhlIGNvZGUsIHJlYWQgdGhlCitkZWZpbml0aW9uIG9mIHRoZSB2YXJpb3VzIEFTVCBub2RlcyBpbiBcZmlsZXtQYXJzZXIvUHl0aG9uLmFzZGx9LiAgQQorUHl0aG9uIHNjcmlwdCByZWFkcyB0aGlzIGZpbGUgYW5kIGdlbmVyYXRlcyBhIHNldCBvZiBDIHN0cnVjdHVyZQorZGVmaW5pdGlvbnMgaW4gXGZpbGV7SW5jbHVkZS9QeXRob24tYXN0Lmh9LiAgVGhlCitcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21TdHJpbmcoKX0gYW5kCitcY2Z1bmN0aW9ue1B5UGFyc2VyX0FTVEZyb21GaWxlKCl9LCBkZWZpbmVkIGluCiBcZmlsZXtJbmNsdWRlL3B5dGhvbnJ1bi5ofSwgdGFrZSBQeXRob24gc291cmNlIGFzIGlucHV0IGFuZCByZXR1cm4gdGhlCiByb290IG9mIGFuIEFTVCByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnRzLiAgVGhpcyBBU1QgY2FuIHRoZW4gYmUgdHVybmVkCiBpbnRvIGEgY29kZSBvYmplY3QgYnkgXGNmdW5jdGlvbntQeUFTVF9Db21waWxlKCl9LiAgRm9yIG1vcmUKQEAgLTIwNDIsNiArMjMwNSwzMiBAQAogQXJtaW4gUmlnbywgYW5kIE5laWwgU2NoZW1lbmF1ZXIsIHBsdXMgdGhlIHBhcnRpY2lwYW50cyBpbiBhIG51bWJlciBvZgogQVNUIHNwcmludHMgYXQgY29uZmVyZW5jZXMgc3VjaCBhcyBQeUNvbi4KICAKK1xpdGVtIEV2YW4gSm9uZXMncyBwYXRjaCB0byBvYm1hbGxvYywgZmlyc3QgZGVzY3JpYmVkIGluIGEgdGFsaworYXQgUHlDb24gREMgMjAwNSwgd2FzIGFwcGxpZWQuICBQeXRob24gMi40IGFsbG9jYXRlZCBzbWFsbCBvYmplY3RzIGluCisyNTZLLXNpemVkIGFyZW5hcywgYnV0IG5ldmVyIGZyZWVkIGFyZW5hcy4gIFdpdGggdGhpcyBwYXRjaCwgUHl0aG9uCit3aWxsIGZyZWUgYXJlbmFzIHdoZW4gdGhleSdyZSBlbXB0eS4gIFRoZSBuZXQgZWZmZWN0IGlzIHRoYXQgb24gc29tZQorcGxhdGZvcm1zLCB3aGVuIHlvdSBhbGxvY2F0ZSBtYW55IG9iamVjdHMsIFB5dGhvbidzIG1lbW9yeSB1c2FnZSBtYXkKK2FjdHVhbGx5IGRyb3Agd2hlbiB5b3UgZGVsZXRlIHRoZW0gYW5kIHRoZSBtZW1vcnkgbWF5IGJlIHJldHVybmVkIHRvCit0aGUgb3BlcmF0aW5nIHN5c3RlbS4gIChJbXBsZW1lbnRlZCBieSBFdmFuIEpvbmVzLCBhbmQgcmV3b3JrZWQgYnkgVGltCitQZXRlcnMuKQorCitOb3RlIHRoYXQgdGhpcyBjaGFuZ2UgbWVhbnMgZXh0ZW5zaW9uIG1vZHVsZXMgbXVzdCBiZSBtb3JlIGNhcmVmdWwKK3doZW4gYWxsb2NhdGluZyBtZW1vcnkuICBQeXRob24ncyBBUEkgaGFzIG1hbnkgZGlmZmVyZW50CitmdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRoYXQgYXJlIGdyb3VwZWQgaW50byBmYW1pbGllcy4gIEZvcgorZXhhbXBsZSwgXGNmdW5jdGlvbntQeU1lbV9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfSwgYW5kCitcY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gYXJlIG9uZSBmYW1pbHkgdGhhdCBhbGxvY2F0ZXMgcmF3IG1lbW9yeSwKK3doaWxlIFxjZnVuY3Rpb257UHlPYmplY3RfTWFsbG9jKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlYWxsb2MoKX0sCithbmQgXGNmdW5jdGlvbntQeU9iamVjdF9GcmVlKCl9IGFyZSBhbm90aGVyIGZhbWlseSB0aGF0J3Mgc3VwcG9zZWQgdG8KK2JlIHVzZWQgZm9yIGNyZWF0aW5nIFB5dGhvbiBvYmplY3RzLiAgCisKK1ByZXZpb3VzbHkgdGhlc2UgZGlmZmVyZW50IGZhbWlsaWVzIGFsbCByZWR1Y2VkIHRvIHRoZSBwbGF0Zm9ybSdzCitcY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgXGNmdW5jdGlvbntmcmVlKCl9IGZ1bmN0aW9ucy4gIFRoaXMgbWVhbnQgCitpdCBkaWRuJ3QgbWF0dGVyIGlmIHlvdSBnb3QgdGhpbmdzIHdyb25nIGFuZCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggdGhlCitcY2Z1bmN0aW9ue1B5TWVtfSBmdW5jdGlvbiBidXQgZnJlZWQgaXQgd2l0aCB0aGUgXGNmdW5jdGlvbntQeU9iamVjdH0KK2Z1bmN0aW9uLiAgV2l0aCAyLjUncyBjaGFuZ2VzIHRvIG9ibWFsbG9jLCB0aGVzZSBmYW1pbGllcyBub3cgZG8gZGlmZmVyZW50Cit0aGluZ3MgYW5kIG1pc21hdGNoZXMgd2lsbCBwcm9iYWJseSByZXN1bHQgaW4gYSBzZWdmYXVsdC4gIFlvdSBzaG91bGQKK2NhcmVmdWxseSB0ZXN0IHlvdXIgQyBleHRlbnNpb24gbW9kdWxlcyB3aXRoIFB5dGhvbiAyLjUuCisKIFxpdGVtIFRoZSBidWlsdC1pbiBzZXQgdHlwZXMgbm93IGhhdmUgYW4gb2ZmaWNpYWwgQyBBUEkuICBDYWxsCiBcY2Z1bmN0aW9ue1B5U2V0X05ldygpfSBhbmQgXGNmdW5jdGlvbntQeUZyb3plblNldF9OZXcoKX0gdG8gY3JlYXRlIGEKIG5ldyBzZXQsIFxjZnVuY3Rpb257UHlTZXRfQWRkKCl9IGFuZCBcY2Z1bmN0aW9ue1B5U2V0X0Rpc2NhcmQoKX0gdG8KQEAgLTIwNzIsMTMgKzIzNjEsMjUgQEAKIFx2YXJ7ZGljdH0pfSBjYW4gbm93IGFjY2VwdCBhIHR1cGxlIG9mIGJhc2UgY2xhc3NlcyBhcyBpdHMgXHZhcntiYXNlfQogYXJndW1lbnQuICAoQ29udHJpYnV0ZWQgYnkgR2VvcmcgQnJhbmRsLikKIAorXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlFcnJfV2FybigpfSBmdW5jdGlvbiBmb3IgaXNzdWluZyB3YXJuaW5ncworaXMgbm93IGRlcHJlY2F0ZWQgaW4gZmF2b3VyIG9mIFxjZnVuY3Rpb257UHlFcnJfV2FybkV4KGNhdGVnb3J5LAorbWVzc2FnZSwgc3RhY2tsZXZlbCl9IHdoaWNoIGxldHMgeW91IHNwZWNpZnkgdGhlIG51bWJlciBvZiBzdGFjaworZnJhbWVzIHNlcGFyYXRpbmcgdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNhbGxlci4gIEEgXHZhcntzdGFja2xldmVsfSBvZgorMSBpcyB0aGUgZnVuY3Rpb24gY2FsbGluZyBcY2Z1bmN0aW9ue1B5RXJyX1dhcm5FeCgpfSwgMiBpcyB0aGUKK2Z1bmN0aW9uIGFib3ZlIHRoYXQsIGFuZCBzbyBmb3J0aC4gIChBZGRlZCBieSBOZWFsIE5vcndpdHouKQorCiBcaXRlbSBUaGUgQ1B5dGhvbiBpbnRlcnByZXRlciBpcyBzdGlsbCB3cml0dGVuIGluIEMsIGJ1dCAKIHRoZSBjb2RlIGNhbiBub3cgYmUgY29tcGlsZWQgd2l0aCBhIHtcQ3BwfSBjb21waWxlciB3aXRob3V0IGVycm9ycy4gIAogKEltcGxlbWVudGVkIGJ5IEFudGhvbnkgQmF4dGVyLCBNYXJ0aW4gdm9ufkxcIm93aXMsIFNraXAgTW9udGFuYXJvLikKIAogXGl0ZW0gVGhlIFxjZnVuY3Rpb257UHlSYW5nZV9OZXcoKX0gZnVuY3Rpb24gd2FzIHJlbW92ZWQuICBJdCB3YXMKIG5ldmVyIGRvY3VtZW50ZWQsIG5ldmVyIHVzZWQgaW4gdGhlIGNvcmUgY29kZSwgYW5kIGhhZCBkYW5nZXJvdXNseSBsYXgKLWVycm9yIGNoZWNraW5nLgorZXJyb3IgY2hlY2tpbmcuICBJbiB0aGUgdW5saWtlbHkgY2FzZSB0aGF0IHlvdXIgZXh0ZW5zaW9ucyB3ZXJlIHVzaW5nCitpdCwgeW91IGNhbiByZXBsYWNlIGl0IGJ5IHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmc6CitcYmVnaW57dmVyYmF0aW19CityYW5nZSA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbigoUHlPYmplY3QqKSAmUHlSYW5nZV9UeXBlLCAibGxsIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgc3RlcCk7CitcZW5ke3ZlcmJhdGltfQogCiBcZW5ke2l0ZW1pemV9CiAKQEAgLTIxMDUsNTQgKzI0MDYsNiBAQAogCiAKICU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1cc2VjdGlvbntPdGhlciBDaGFuZ2VzIGFuZCBGaXhlcyBcbGFiZWx7c2VjdGlvbi1vdGhlcn19Ci0KLUFzIHVzdWFsLCB0aGVyZSB3ZXJlIGEgYnVuY2ggb2Ygb3RoZXIgaW1wcm92ZW1lbnRzIGFuZCBidWdmaXhlcwotc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIHNvdXJjZSB0cmVlLiAgQSBzZWFyY2ggdGhyb3VnaCB0aGUgU1ZOIGNoYW5nZQotbG9ncyBmaW5kcyB0aGVyZSB3ZXJlIFhYWCBwYXRjaGVzIGFwcGxpZWQgYW5kIFlZWSBidWdzIGZpeGVkIGJldHdlZW4KLVB5dGhvbiAyLjQgYW5kIDIuNS4gIEJvdGggZmlndXJlcyBhcmUgbGlrZWx5IHRvIGJlIHVuZGVyZXN0aW1hdGVzLgotCi1Tb21lIG9mIHRoZSBtb3JlIG5vdGFibGUgY2hhbmdlcyBhcmU6Ci0KLVxiZWdpbntpdGVtaXplfQotCi1caXRlbSBFdmFuIEpvbmVzJ3MgcGF0Y2ggdG8gb2JtYWxsb2MsIGZpcnN0IGRlc2NyaWJlZCBpbiBhIHRhbGsKLWF0IFB5Q29uIERDIDIwMDUsIHdhcyBhcHBsaWVkLiAgUHl0aG9uIDIuNCBhbGxvY2F0ZWQgc21hbGwgb2JqZWN0cyBpbgotMjU2Sy1zaXplZCBhcmVuYXMsIGJ1dCBuZXZlciBmcmVlZCBhcmVuYXMuICBXaXRoIHRoaXMgcGF0Y2gsIFB5dGhvbgotd2lsbCBmcmVlIGFyZW5hcyB3aGVuIHRoZXkncmUgZW1wdHkuICBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IG9uIHNvbWUKLXBsYXRmb3Jtcywgd2hlbiB5b3UgYWxsb2NhdGUgbWFueSBvYmplY3RzLCBQeXRob24ncyBtZW1vcnkgdXNhZ2UgbWF5Ci1hY3R1YWxseSBkcm9wIHdoZW4geW91IGRlbGV0ZSB0aGVtLCBhbmQgdGhlIG1lbW9yeSBtYXkgYmUgcmV0dXJuZWQgdG8KLXRoZSBvcGVyYXRpbmcgc3lzdGVtLiAgKEltcGxlbWVudGVkIGJ5IEV2YW4gSm9uZXMsIGFuZCByZXdvcmtlZCBieSBUaW0KLVBldGVycy4pCi0KLU5vdGUgdGhhdCB0aGlzIGNoYW5nZSBtZWFucyBleHRlbnNpb24gbW9kdWxlcyBuZWVkIHRvIGJlIG1vcmUgY2FyZWZ1bAotd2l0aCBob3cgdGhleSBhbGxvY2F0ZSBtZW1vcnkuICBQeXRob24ncyBBUEkgaGFzIG1hbnkgZGlmZmVyZW50Ci1mdW5jdGlvbnMgZm9yIGFsbG9jYXRpbmcgbWVtb3J5IHRoYXQgYXJlIGdyb3VwZWQgaW50byBmYW1pbGllcy4gIEZvcgotZXhhbXBsZSwgXGNmdW5jdGlvbntQeU1lbV9NYWxsb2MoKX0sIFxjZnVuY3Rpb257UHlNZW1fUmVhbGxvYygpfSwgYW5kCi1cY2Z1bmN0aW9ue1B5TWVtX0ZyZWUoKX0gYXJlIG9uZSBmYW1pbHkgdGhhdCBhbGxvY2F0ZXMgcmF3IG1lbW9yeSwKLXdoaWxlIFxjZnVuY3Rpb257UHlPYmplY3RfTWFsbG9jKCl9LCBcY2Z1bmN0aW9ue1B5T2JqZWN0X1JlYWxsb2MoKX0sCi1hbmQgXGNmdW5jdGlvbntQeU9iamVjdF9GcmVlKCl9IGFyZSBhbm90aGVyIGZhbWlseSB0aGF0J3Mgc3VwcG9zZWQgdG8KLWJlIHVzZWQgZm9yIGNyZWF0aW5nIFB5dGhvbiBvYmplY3RzLiAgCi0KLVByZXZpb3VzbHkgdGhlc2UgZGlmZmVyZW50IGZhbWlsaWVzIGFsbCByZWR1Y2VkIHRvIHRoZSBwbGF0Zm9ybSdzCi1cY2Z1bmN0aW9ue21hbGxvYygpfSBhbmQgXGNmdW5jdGlvbntmcmVlKCl9IGZ1bmN0aW9ucy4gIFRoaXMgbWVhbnQgCi1pdCBkaWRuJ3QgbWF0dGVyIGlmIHlvdSBnb3QgdGhpbmdzIHdyb25nIGFuZCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggdGhlCi1cY2Z1bmN0aW9ue1B5TWVtfSBmdW5jdGlvbiBidXQgZnJlZWQgaXQgd2l0aCB0aGUgXGNmdW5jdGlvbntQeU9iamVjdH0KLWZ1bmN0aW9uLiAgV2l0aCB0aGUgb2JtYWxsb2MgY2hhbmdlLCB0aGVzZSBmYW1pbGllcyBub3cgZG8gZGlmZmVyZW50Ci10aGluZ3MsIGFuZCBtaXNtYXRjaGVzIHdpbGwgcHJvYmFibHkgcmVzdWx0IGluIGEgc2VnZmF1bHQuICBZb3Ugc2hvdWxkCi1jYXJlZnVsbHkgdGVzdCB5b3VyIEMgZXh0ZW5zaW9uIG1vZHVsZXMgd2l0aCBQeXRob24gMi41LgotCi1caXRlbSBDb3Zlcml0eSwgYSBjb21wYW55IHRoYXQgbWFya2V0cyBhIHNvdXJjZSBjb2RlIGFuYWx5c2lzIHRvb2wKLSAgY2FsbGVkIFByZXZlbnQsIHByb3ZpZGVkIHRoZSByZXN1bHRzIG9mIHRoZWlyIGV4YW1pbmF0aW9uIG9mIHRoZSBQeXRob24KLSAgc291cmNlIGNvZGUuICBUaGUgYW5hbHlzaXMgZm91bmQgYWJvdXQgNjAgYnVncyB0aGF0IAotICB3ZXJlIHF1aWNrbHkgZml4ZWQuICBNYW55IG9mIHRoZSBidWdzIHdlcmUgcmVmY291bnRpbmcgcHJvYmxlbXMsIG9mdGVuCi0gIG9jY3VycmluZyBpbiBlcnJvci1oYW5kbGluZyBjb2RlLiAgU2VlCi0gIFx1cmx7aHR0cDovL3NjYW4uY292ZXJpdHkuY29tfSBmb3IgdGhlIHN0YXRpc3RpY3MuCi0KLVxlbmR7aXRlbWl6ZX0KLQotCi0lPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogXHNlY3Rpb257UG9ydGluZyB0byBQeXRob24gMi41XGxhYmVse3BvcnRpbmd9fQogCiBUaGlzIHNlY3Rpb24gbGlzdHMgcHJldmlvdXNseSBkZXNjcmliZWQgY2hhbmdlcyB0aGF0IG1heSByZXF1aXJlCkBAIC0yMTcwLDYgKzI0MjMsMTYgQEAKIGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7cGVwLTM0Mn0sIGl0J3Mgbm93IHBvc3NpYmxlCiBmb3IgXG1lbWJlcntnaV9mcmFtZX0gdG8gYmUgXGNvZGV7Tm9uZX0uCiAKK1xpdGVtIExpYnJhcnk6IHRoZSBcbW9kdWxle2Nzdn0gbW9kdWxlIGlzIG5vdyBzdHJpY3RlciBhYm91dCBtdWx0aS1saW5lIHF1b3RlZAorZmllbGRzLiAgSWYgeW91ciBmaWxlcyBjb250YWluIG5ld2xpbmVzIGVtYmVkZGVkIHdpdGhpbiBmaWVsZHMsIHRoZQoraW5wdXQgc2hvdWxkIGJlIHNwbGl0IGludG8gbGluZXMgaW4gYSBtYW5uZXIgd2hpY2ggcHJlc2VydmVzIHRoZQorbmV3bGluZSBjaGFyYWN0ZXJzLgorCitcaXRlbSBMaWJyYXJ5OiB0aGUgXG1vZHVsZXtsb2NhbGV9IG1vZHVsZSdzIAorXGZ1bmN0aW9ue2Zvcm1hdCgpfSBmdW5jdGlvbidzIHdvdWxkIHByZXZpb3VzbHkgCithY2NlcHQgYW55IHN0cmluZyBhcyBsb25nIGFzIG5vIG1vcmUgdGhhbiBvbmUgXCVjaGFyIHNwZWNpZmllcgorYXBwZWFyZWQuICBJbiBQeXRob24gMi41LCB0aGUgYXJndW1lbnQgbXVzdCBiZSBleGFjdGx5IG9uZSBcJWNoYXIKK3NwZWNpZmllciB3aXRoIG5vIHN1cnJvdW5kaW5nIHRleHQuIAogCiBcaXRlbSBMaWJyYXJ5OiBUaGUgXG1vZHVsZXtwaWNrbGV9IGFuZCBcbW9kdWxle2NQaWNrbGV9IG1vZHVsZXMgbm8KIGxvbmdlciBhY2NlcHQgYSByZXR1cm4gdmFsdWUgb2YgXGNvZGV7Tm9uZX0gZnJvbSB0aGUKQEAgLTIyMDYsNyArMjQ2OSwxMCBAQAogCiBUaGUgYXV0aG9yIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIGZvbGxvd2luZyBwZW9wbGUgZm9yIG9mZmVyaW5nCiBzdWdnZXN0aW9ucywgY29ycmVjdGlvbnMgYW5kIGFzc2lzdGFuY2Ugd2l0aCB2YXJpb3VzIGRyYWZ0cyBvZiB0aGlzCi1hcnRpY2xlOiBQaGlsbGlwIEouIEVieSwgS2VudCBKb2huc29uLCBNYXJ0aW4gdm9ufkxcIm93aXMsIEZyZWRyaWsgTHVuZGgsIAotR3VzdGF2byBOaWVtZXllciwgSmFtZXMgUHJ5b3IsIE1pa2UgUm92bmVyLCBTY290dCBXZWlrYXJ0LCBUaG9tYXMgV291dGVycy4KK2FydGljbGU6IEdlb3JnIEJyYW5kbCwgTmljayBDb2dobGFuLCBQaGlsbGlwIEouIEVieSwgTGFycyBHdXN0XCJhYmVsLAorUmF5bW9uZCBIZXR0aW5nZXIsIFJhbGYgVy4gR3Jvc3NlLUt1bnN0bGV2ZSwgS2VudCBKb2huc29uLCBJYWluIExvd2UsCitNYXJ0aW4gdm9ufkxcIm93aXMsIEZyZWRyaWsgTHVuZGgsIEFuZHJldyBNY05hbWFyYSwgU2tpcCBNb250YW5hcm8sCitHdXN0YXZvIE5pZW1leWVyLCBQYXVsIFByZXNjb2QsIEphbWVzIFByeW9yLCBNaWtlIFJvdm5lciwgU2NvdHQKK1dlaWthcnQsIEJhcnJ5IFdhcnNhdywgVGhvbWFzIFdvdXRlcnMuCiAKIFxlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9JbmNsdWRlL1B5dGhvbi5oIGIvSW5jbHVkZS9QeXRob24uaAppbmRleCBjYTE2YzY0Li5iYmI5YTA4IDEwMDY0NAotLS0gYS9JbmNsdWRlL1B5dGhvbi5oCisrKyBiL0luY2x1ZGUvUHl0aG9uLmgKQEAgLTM1LDcgKzM1LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWZuZGVmIERPTlRfSEFWRV9FUlJOT19ICisjaWZkZWYgSEFWRV9FUlJOT19ICiAjaW5jbHVkZSA8ZXJybm8uaD4KICNlbmRpZgogI2luY2x1ZGUgPHN0ZGxpYi5oPgpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9mcmFtZW9iamVjdC5oIGIvSW5jbHVkZS9mcmFtZW9iamVjdC5oCmluZGV4IGNjZTU5OGIuLjc5NGY2NTEgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvZnJhbWVvYmplY3QuaAorKysgYi9JbmNsdWRlL2ZyYW1lb2JqZWN0LmgKQEAgLTQxLDggKzQxLDYgQEAKICAgICAvKiBBcyBvZiAyLjMgZl9saW5lbm8gaXMgb25seSB2YWxpZCB3aGVuIHRyYWNpbmcgaXMgYWN0aXZlIChpLmUuIHdoZW4KICAgICAgICBmX3RyYWNlIGlzIHNldCkgLS0gYXQgb3RoZXIgdGltZXMgdXNlIFB5Q29kZV9BZGRyMkxpbmUgaW5zdGVhZC4gKi8KICAgICBpbnQgZl9saW5lbm87CQkvKiBDdXJyZW50IGxpbmUgbnVtYmVyICovCi0gICAgaW50IGZfcmVzdHJpY3RlZDsJCS8qIEZsYWcgc2V0IGlmIHJlc3RyaWN0ZWQgb3BlcmF0aW9ucwotCQkJCSAgIGluIHRoaXMgc2NvcGUgKi8KICAgICBpbnQgZl9pYmxvY2s7CQkvKiBpbmRleCBpbiBmX2Jsb2Nrc3RhY2sgKi8KICAgICBQeVRyeUJsb2NrIGZfYmxvY2tzdGFja1tDT19NQVhCTE9DS1NdOyAvKiBmb3IgdHJ5IGFuZCBsb29wIGJsb2NrcyAqLwogICAgIFB5T2JqZWN0ICpmX2xvY2Fsc3BsdXNbMV07CS8qIGxvY2FscytzdGFjaywgZHluYW1pY2FsbHkgc2l6ZWQgKi8KQEAgLTU0LDYgKzUyLDggQEAKIFB5QVBJX0RBVEEoUHlUeXBlT2JqZWN0KSBQeUZyYW1lX1R5cGU7CiAKICNkZWZpbmUgUHlGcmFtZV9DaGVjayhvcCkgKChvcCktPm9iX3R5cGUgPT0gJlB5RnJhbWVfVHlwZSkKKyNkZWZpbmUgUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoZikgXAorCSgoZiktPmZfYnVpbHRpbnMgIT0gKGYpLT5mX3RzdGF0ZS0+aW50ZXJwLT5idWlsdGlucykKIAogUHlBUElfRlVOQyhQeUZyYW1lT2JqZWN0ICopIFB5RnJhbWVfTmV3KFB5VGhyZWFkU3RhdGUgKiwgUHlDb2RlT2JqZWN0ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqLCBQeU9iamVjdCAqKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHllcnJvcnMuaCBiL0luY2x1ZGUvcHllcnJvcnMuaAppbmRleCA2MDA2YWM3Li41ZGYzMzRiIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXJyb3JzLmgKKysrIGIvSW5jbHVkZS9weWVycm9ycy5oCkBAIC0yMTgsMTAgKzIxOCwxNCBAQAogUHlBUElfRlVOQyh2b2lkKSBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlPYmplY3QgKik7CiAKIC8qIElzc3VlIGEgd2FybmluZyBvciBleGNlcHRpb24gKi8KLVB5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuKFB5T2JqZWN0ICosIGNoYXIgKik7CitQeUFQSV9GVU5DKGludCkgUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqbXNnLAorCQkJICAgICBQeV9zc2l6ZV90IHN0YWNrX2xldmVsKTsKIFB5QVBJX0ZVTkMoaW50KSBQeUVycl9XYXJuRXhwbGljaXQoUHlPYmplY3QgKiwgY29uc3QgY2hhciAqLAogCQkJCSAgIGNvbnN0IGNoYXIgKiwgaW50LCAKIAkJCQkgICBjb25zdCBjaGFyICosIFB5T2JqZWN0ICopOworLyogUHlFcnJfV2FybiBpcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBhbmQgd2lsbCBiZSByZW1vdmVkLgorICAgVXNlIFB5RXJyX1dhcm5FeCBpbnN0ZWFkLiAqLworI2RlZmluZSBQeUVycl9XYXJuKGNhdGVnb3J5LCBtc2cpIFB5RXJyX1dhcm5FeChjYXRlZ29yeSwgbXNnLCAxKQogCiAvKiBJbiBzaWdjaGVjay5jIG9yIHNpZ25hbG1vZHVsZS5jICovCiBQeUFQSV9GVU5DKGludCkgUHlFcnJfQ2hlY2tTaWduYWxzKHZvaWQpOwpkaWZmIC0tZ2l0IGEvSW5jbHVkZS9weWV4cGF0LmggYi9JbmNsdWRlL3B5ZXhwYXQuaAppbmRleCA1MGVkNDlmLi4xZTc5ZjRlIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5ZXhwYXQuaAorKysgYi9JbmNsdWRlL3B5ZXhwYXQuaApAQCAtMTYsOCArMTYsOCBAQAogICAgICAgIHRoZSBlbmQsIGlmIG5lZWRlZCAqLwogICAgIGNvbnN0IFhNTF9MQ2hhciAqICgqRXJyb3JTdHJpbmcpKGVudW0gWE1MX0Vycm9yIGNvZGUpOwogICAgIGVudW0gWE1MX0Vycm9yICgqR2V0RXJyb3JDb2RlKShYTUxfUGFyc2VyIHBhcnNlcik7Ci0gICAgaW50ICgqR2V0RXJyb3JDb2x1bW5OdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKLSAgICBpbnQgKCpHZXRFcnJvckxpbmVOdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKKyAgICBYTUxfU2l6ZSAoKkdldEVycm9yQ29sdW1uTnVtYmVyKShYTUxfUGFyc2VyIHBhcnNlcik7CisgICAgWE1MX1NpemUgKCpHZXRFcnJvckxpbmVOdW1iZXIpKFhNTF9QYXJzZXIgcGFyc2VyKTsKICAgICBlbnVtIFhNTF9TdGF0dXMgKCpQYXJzZSkoCiAgICAgICAgIFhNTF9QYXJzZXIgcGFyc2VyLCBjb25zdCBjaGFyICpzLCBpbnQgbGVuLCBpbnQgaXNGaW5hbCk7CiAgICAgWE1MX1BhcnNlciAoKlBhcnNlckNyZWF0ZV9NTSkoCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5cG9ydC5oIGIvSW5jbHVkZS9weXBvcnQuaAppbmRleCA0N2I5ZjcwLi5iZTZjNTFmIDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5cG9ydC5oCisrKyBiL0luY2x1ZGUvcHlwb3J0LmgKQEAgLTI0MCwxMCArMjQwLDEwIEBACiAgKiB0byB5b3VyIHB5Y29uZmlnLmguIFB5dGhvbiBjb2RlIGJleW9uZCB0aGlzIHNob3VsZCBjaGVjayBIQVZFX1NUQVQgYW5kCiAgKiBIQVZFX0ZTVEFUIGluc3RlYWQuCiAgKiBBbHNvCi0gKiAgICAgICNkZWZpbmUgRE9OVF9IQVZFX1NZU19TVEFUX0gKLSAqIGlmIDxzeXMvc3RhdC5oPiBkb2Vzbid0IGV4aXN0IG9uIHlvdXIgcGxhdGZvcm0sIGFuZAorICogICAgICAjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSAorICogaWYgPHN5cy9zdGF0Lmg+IGV4aXN0cyBvbiB5b3VyIHBsYXRmb3JtLCBhbmQKICAqICAgICAgI2RlZmluZSBIQVZFX1NUQVRfSAotICogaWYgPHN0YXQuaD4gZG9lcyAoZG9uJ3QgbG9vayBhdCBtZSAtLSB0aHMgbWVzcyBpcyBpbmhlcml0ZWQpLgorICogaWYgPHN0YXQuaD4gZG9lcy4KICAqLwogI2lmbmRlZiBET05UX0hBVkVfU1RBVAogI2RlZmluZSBIQVZFX1NUQVQKQEAgLTI1OCw3ICsyNTgsNyBAQAogI2luY2x1ZGUgInVuaXhzdHVmZi5oIgogI2VuZGlmCiAKLSNpZm5kZWYgRE9OVF9IQVZFX1NZU19TVEFUX0gKKyNpZmRlZiBIQVZFX1NZU19TVEFUX0gKICNpZiBkZWZpbmVkKFBZT1NfT1MyKSAmJiBkZWZpbmVkKFBZQ0NfR0NDKQogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2VuZGlmCmRpZmYgLS1naXQgYS9JbmNsdWRlL3B5c3RhdGUuaCBiL0luY2x1ZGUvcHlzdGF0ZS5oCmluZGV4IGJmZDM1NDguLmNmMjk2OTUgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvcHlzdGF0ZS5oCisrKyBiL0luY2x1ZGUvcHlzdGF0ZS5oCkBAIC0xNzEsNiArMTcxLDExIEBACiAqLwogUHlBUElfRlVOQyhQeVRocmVhZFN0YXRlICopIFB5R0lMU3RhdGVfR2V0VGhpc1RocmVhZFN0YXRlKHZvaWQpOwogCisvKiBUaGUgaW1wbGVtZW50YXRpb24gb2Ygc3lzLl9jdXJyZW50X2ZyYW1lcygpICBSZXR1cm5zIGEgZGljdCBtYXBwaW5nCisgICB0aHJlYWQgaWQgdG8gdGhhdCB0aHJlYWQncyBjdXJyZW50IGZyYW1lLgorKi8KK1B5QVBJX0ZVTkMoUHlPYmplY3QgKikgX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXModm9pZCk7CisKIC8qIFJvdXRpbmVzIGZvciBhZHZhbmNlZCBkZWJ1Z2dlcnMsIHJlcXVlc3RlZCBieSBEYXZpZCBCZWF6bGV5LgogICAgRG9uJ3QgdXNlIHVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchICovCiBQeUFQSV9GVU5DKFB5SW50ZXJwcmV0ZXJTdGF0ZSAqKSBQeUludGVycHJldGVyU3RhdGVfSGVhZCh2b2lkKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvcHl0aHJlYWQuaCBiL0luY2x1ZGUvcHl0aHJlYWQuaAppbmRleCAwZmE4ZGIwLi5mMjZkYjE2IDEwMDY0NAotLS0gYS9JbmNsdWRlL3B5dGhyZWFkLmgKKysrIGIvSW5jbHVkZS9weXRocmVhZC5oCkBAIC0yNSw2ICsyNSw5IEBACiAjZGVmaW5lIE5PV0FJVF9MT0NLCTAKIFB5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKFB5VGhyZWFkX3R5cGVfbG9jayk7CiAKK1B5QVBJX0ZVTkMoc2l6ZV90KSBQeVRocmVhZF9nZXRfc3RhY2tzaXplKHZvaWQpOworUHlBUElfRlVOQyhpbnQpIFB5VGhyZWFkX3NldF9zdGFja3NpemUoc2l6ZV90KTsKKwogI2lmbmRlZiBOT19FWElUX1BST0cKIFB5QVBJX0ZVTkModm9pZCkgUHlUaHJlYWRfZXhpdF9wcm9nKGludCk7CiBQeUFQSV9GVU5DKHZvaWQpIFB5VGhyZWFkX19QeVRocmVhZF9leGl0X3Byb2coaW50KTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvc2V0b2JqZWN0LmggYi9JbmNsdWRlL3NldG9iamVjdC5oCmluZGV4IGNjOTM5NjguLmExNmMyZjcgMTAwNjQ0Ci0tLSBhL0luY2x1ZGUvc2V0b2JqZWN0LmgKKysrIGIvSW5jbHVkZS9zZXRvYmplY3QuaApAQCAtMzUsMTQgKzM1LDE0IEBACiBzdHJ1Y3QgX3NldG9iamVjdCB7CiAJUHlPYmplY3RfSEVBRAogCi0JaW50IGZpbGw7ICAvKiAjIEFjdGl2ZSArICMgRHVtbXkgKi8KLQlpbnQgdXNlZDsgIC8qICMgQWN0aXZlICovCisJUHlfc3NpemVfdCBmaWxsOyAgLyogIyBBY3RpdmUgKyAjIER1bW15ICovCisJUHlfc3NpemVfdCB1c2VkOyAgLyogIyBBY3RpdmUgKi8KIAogCS8qIFRoZSB0YWJsZSBjb250YWlucyBtYXNrICsgMSBzbG90cywgYW5kIHRoYXQncyBhIHBvd2VyIG9mIDIuCiAJICogV2Ugc3RvcmUgdGhlIG1hc2sgaW5zdGVhZCBvZiB0aGUgc2l6ZSBiZWNhdXNlIHRoZSBtYXNrIGlzIG1vcmUKIAkgKiBmcmVxdWVudGx5IG5lZWRlZC4KIAkgKi8KLQlpbnQgbWFzazsKKwlQeV9zc2l6ZV90IG1hc2s7CiAKIAkvKiB0YWJsZSBwb2ludHMgdG8gc21hbGx0YWJsZSBmb3Igc21hbGwgdGFibGVzLCBlbHNlIHRvCiAJICogYWRkaXRpb25hbCBtYWxsb2MnZWQgbWVtb3J5LiAgdGFibGUgaXMgbmV2ZXIgTlVMTCEgIFRoaXMgcnVsZQpkaWZmIC0tZ2l0IGEvSW5jbHVkZS91bmljb2Rlb2JqZWN0LmggYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAppbmRleCAzMTc3MDUxLi5jN2UwN2E4IDEwMDY0NAotLS0gYS9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaAorKysgYi9JbmNsdWRlL3VuaWNvZGVvYmplY3QuaApAQCAtOTM4LDYgKzkzOCwxMyBAQAogICAgIGNvbnN0IGNoYXIgKmVycm9ycyAgICAgICAgICAvKiBlcnJvciBoYW5kbGluZyAqLwogICAgICk7CiAKK1B5QVBJX0ZVTkMoUHlPYmplY3QqKSBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKAorICAgIGNvbnN0IGNoYXIgKnN0cmluZywgICAgICAgICAvKiBNQkNTIGVuY29kZWQgc3RyaW5nICovCisgICAgUHlfc3NpemVfdCBsZW5ndGgsICAgICAgICAgIC8qIHNpemUgb2Ygc3RyaW5nICovCisgICAgY29uc3QgY2hhciAqZXJyb3JzLCAgICAgICAgIC8qIGVycm9yIGhhbmRsaW5nICovCisgICAgUHlfc3NpemVfdCAqY29uc3VtZWQgICAgICAgIC8qIGJ5dGVzIGNvbnN1bWVkICovCisgICAgKTsKKwogUHlBUElfRlVOQyhQeU9iamVjdCopIFB5VW5pY29kZV9Bc01CQ1NTdHJpbmcoCiAgICAgUHlPYmplY3QgKnVuaWNvZGUgICAgICAgICAgIC8qIFVuaWNvZGUgb2JqZWN0ICovCiAgICAgKTsKZGlmZiAtLWdpdCBhL0luY2x1ZGUvd2Vha3JlZm9iamVjdC5oIGIvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKaW5kZXggZGFmNDkwZi4uMGE2NTliMCAxMDA2NDQKLS0tIGEvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKKysrIGIvSW5jbHVkZS93ZWFrcmVmb2JqZWN0LmgKQEAgLTYyLDcgKzYyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjayk7CiBQeUFQSV9GVU5DKFB5T2JqZWN0ICopIFB5V2Vha3JlZl9HZXRPYmplY3QoUHlPYmplY3QgKnJlZik7CiAKLVB5QVBJX0ZVTkMobG9uZykgX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKTsKK1B5QVBJX0ZVTkMoUHlfc3NpemVfdCkgX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKTsKIAogUHlBUElfRlVOQyh2b2lkKSBfUHlXZWFrcmVmX0NsZWFyUmVmKFB5V2Vha1JlZmVyZW5jZSAqc2VsZik7CiAKZGlmZiAtLWdpdCBhL0xpYi9RdWV1ZS5weSBiL0xpYi9RdWV1ZS5weQppbmRleCA1MWFkMzU0Li4wZjgwNTg0IDEwMDY0NAotLS0gYS9MaWIvUXVldWUucHkKKysrIGIvTGliL1F1ZXVlLnB5CkBAIC0xNCwxMSArMTQsMTEgQEAKICAgICBwYXNzCiAKIGNsYXNzIFF1ZXVlOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXhzaXplPTApOgotICAgICAgICAiIiJJbml0aWFsaXplIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCisgICAgIiIiQ3JlYXRlIGEgcXVldWUgb2JqZWN0IHdpdGggYSBnaXZlbiBtYXhpbXVtIHNpemUuCiAKLSAgICAgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KLSAgICAgICAgIiIiCisgICAgSWYgbWF4c2l6ZSBpcyA8PSAwLCB0aGUgcXVldWUgc2l6ZSBpcyBpbmZpbml0ZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWF4c2l6ZT0wKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0IHRocmVhZGluZwogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CmRpZmYgLS1naXQgYS9MaWIvU2ltcGxlSFRUUFNlcnZlci5weSBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CmluZGV4IDA4OTkzNmYuLmZhZTU1MWEgMTAwNjQ0Ci0tLSBhL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CisrKyBiL0xpYi9TaW1wbGVIVFRQU2VydmVyLnB5CkBAIC0xOTIsNiArMTkyLDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmV4dGVuc2lvbnNfbWFwWycnXQogCisgICAgaWYgbm90IG1pbWV0eXBlcy5pbml0ZWQ6CisgICAgICAgIG1pbWV0eXBlcy5pbml0KCkgIyB0cnkgdG8gcmVhZCBzeXN0ZW0gbWltZS50eXBlcwogICAgIGV4dGVuc2lvbnNfbWFwID0gbWltZXR5cGVzLnR5cGVzX21hcC5jb3B5KCkKICAgICBleHRlbnNpb25zX21hcC51cGRhdGUoewogICAgICAgICAnJzogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsICMgRGVmYXVsdApkaWZmIC0tZ2l0IGEvTGliL1VzZXJTdHJpbmcucHkgYi9MaWIvVXNlclN0cmluZy5weQppbmRleCA0NzNlZTg4Li42MGRjMzRiIDEwMDc1NQotLS0gYS9MaWIvVXNlclN0cmluZy5weQorKysgYi9MaWIvVXNlclN0cmluZy5weQpAQCAtNSwxNCArNSwxMyBAQAogTm90ZTogc3RyaW5nIG9iamVjdHMgaGF2ZSBncm93biBtZXRob2RzIGluIFB5dGhvbiAxLjYKIFRoaXMgbW9kdWxlIHJlcXVpcmVzIFB5dGhvbiAxLjYgb3IgbGF0ZXIuCiAiIiIKLWZyb20gdHlwZXMgaW1wb3J0IFN0cmluZ1R5cGVzCiBpbXBvcnQgc3lzCiAKIF9fYWxsX18gPSBbIlVzZXJTdHJpbmciLCJNdXRhYmxlU3RyaW5nIl0KIAogY2xhc3MgVXNlclN0cmluZzoKICAgICBkZWYgX19pbml0X18oc2VsZiwgc2VxKToKLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIFN0cmluZ1R5cGVzKToKKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZXEsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxCiAgICAgICAgIGVsaWYgaXNpbnN0YW5jZShzZXEsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gc2VxLmRhdGFbOl0KQEAgLTQzLDEyICs0MiwxMiBAQAogICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShvdGhlciwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIuZGF0YSkKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgb3RoZXIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oc2VsZi5kYXRhICsgc3RyKG90aGVyKSkKICAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKG90aGVyICsgc2VsZi5kYXRhKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKHN0cihvdGhlcikgKyBzZWxmLmRhdGEpCkBAIC0xNjMsNyArMTYyLDcgQEAKICAgICAgICAgc3RhcnQgPSBtYXgoc3RhcnQsIDApOyBlbmQgPSBtYXgoZW5kLCAwKQogICAgICAgICBpZiBpc2luc3RhbmNlKHN1YiwgVXNlclN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOnN0YXJ0XStzdWIuZGF0YStzZWxmLmRhdGFbZW5kOl0KLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKHN1YiwgU3RyaW5nVHlwZXMpOgorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uoc3ViLCBiYXNlc3RyaW5nKToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9IHNlbGYuZGF0YVs6c3RhcnRdK3N1YitzZWxmLmRhdGFbZW5kOl0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSA9ICBzZWxmLmRhdGFbOnN0YXJ0XStzdHIoc3ViKStzZWxmLmRhdGFbZW5kOl0KQEAgLTE3NSw3ICsxNzQsNyBAQAogICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIFVzZXJTdHJpbmcpOgogICAgICAgICAgICAgc2VsZi5kYXRhICs9IG90aGVyLmRhdGEKLSAgICAgICAgZWxpZiBpc2luc3RhbmNlKG90aGVyLCBTdHJpbmdUeXBlcyk6CisgICAgICAgIGVsaWYgaXNpbnN0YW5jZShvdGhlciwgYmFzZXN0cmluZyk6CiAgICAgICAgICAgICBzZWxmLmRhdGEgKz0gb3RoZXIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZGF0YSArPSBzdHIob3RoZXIpCmRpZmYgLS1naXQgYS9MaWIvX01vemlsbGFDb29raWVKYXIucHkgYi9MaWIvX01vemlsbGFDb29raWVKYXIucHkKaW5kZXggMTc3NmI5My4uNGZkNmRlMyAxMDA2NDQKLS0tIGEvTGliL19Nb3ppbGxhQ29va2llSmFyLnB5CisrKyBiL0xpYi9fTW96aWxsYUNvb2tpZUphci5weQpAQCAtNjMsOCArNjMsNyBAQAogICAgICAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIlxuIik6IGxpbmUgPSBsaW5lWzotMV0KIAogICAgICAgICAgICAgICAgICMgc2tpcCBjb21tZW50cyBhbmQgYmxhbmsgbGluZXMgWFhYIHdoYXQgaXMgJCBmb3I/Ci0gICAgICAgICAgICAgICAgaWYgKGxpbmUuc3RyaXAoKS5zdGFydHN3aXRoKCIjIikgb3IKLSAgICAgICAgICAgICAgICAgICAgbGluZS5zdHJpcCgpLnN0YXJ0c3dpdGgoIiQiKSBvcgorICAgICAgICAgICAgICAgIGlmIChsaW5lLnN0cmlwKCkuc3RhcnRzd2l0aCgoIiMiLCAiJCIpKSBvcgogICAgICAgICAgICAgICAgICAgICBsaW5lLnN0cmlwKCkgPT0gIiIpOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQogCmRpZmYgLS1naXQgYS9MaWIvYmluaGV4LnB5IGIvTGliL2JpbmhleC5weQppbmRleCA0ZjM4ODJhLi4wZjNlM2M0IDEwMDY0NAotLS0gYS9MaWIvYmluaGV4LnB5CisrKyBiL0xpYi9iaW5oZXgucHkKQEAgLTQ0LDIyICs0NCwxNCBAQAogCiAjCiAjIFdvcmthcm91bmRzIGZvciBub24tbWFjIG1hY2hpbmVzLgotaWYgb3MubmFtZSA9PSAnbWFjJzoKLSAgICBpbXBvcnQgbWFjZnMKLSAgICBpbXBvcnQgTWFjT1MKLSAgICB0cnk6Ci0gICAgICAgIG9wZW5yZiA9IE1hY09TLm9wZW5yZgotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgIyBCYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIG9wZW5yZiA9IG9wZW4KLQotICAgIGRlZiBGSW5mbygpOgotICAgICAgICByZXR1cm4gbWFjZnMuRkluZm8oKQordHJ5OgorICAgIGZyb20gQ2FyYm9uLkZpbGUgaW1wb3J0IEZTU3BlYywgRkluZm8KKyAgICBmcm9tIE1hY09TIGltcG9ydCBvcGVucmYKIAogICAgIGRlZiBnZXRmaWxlaW5mbyhuYW1lKToKLSAgICAgICAgZmluZm8gPSBtYWNmcy5GU1NwZWMobmFtZSkuR2V0RkluZm8oKQorICAgICAgICBmaW5mbyA9IEZTU3BlYyhuYW1lKS5GU3BHZXRGSW5mbygpCiAgICAgICAgIGRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQobmFtZSkKLSAgICAgICAgIyBYWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCisgICAgICAgICMgWFhYIEdldCByZXNvdXJjZS9kYXRhIHNpemVzCiAgICAgICAgIGZwID0gb3BlbihuYW1lLCAncmInKQogICAgICAgICBmcC5zZWVrKDAsIDIpCiAgICAgICAgIGRsZW4gPSBmcC50ZWxsKCkKQEAgLTc1LDcgKzY3LDcgQEAKICAgICAgICAgICAgIG1vZGUgPSAnKicgKyBtb2RlWzBdCiAgICAgICAgIHJldHVybiBvcGVucmYobmFtZSwgbW9kZSkKIAotZWxzZToKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjCiAgICAgIyBHbHVlIGNvZGUgZm9yIG5vbi1tYWNpbnRvc2ggdXNhZ2UKICAgICAjCkBAIC0xODMsNyArMTc1LDcgQEAKICAgICAgICAgICAgIG9mbmFtZSA9IG9mcAogICAgICAgICAgICAgb2ZwID0gb3BlbihvZm5hbWUsICd3JykKICAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgICAgICAgICAgZnNzID0gbWFjZnMuRlNTcGVjKG9mbmFtZSkKKyAgICAgICAgICAgICAgICBmc3MgPSBGU1NwZWMob2ZuYW1lKQogICAgICAgICAgICAgICAgIGZzcy5TZXRDcmVhdG9yVHlwZSgnQm5IcScsICdURVhUJykKICAgICAgICAgb2ZwLndyaXRlKCcoVGhpcyBmaWxlIG11c3QgYmUgY29udmVydGVkIHdpdGggQmluSGV4IDQuMClcblxuOicpCiAgICAgICAgIGhxeGVyID0gX0hxeGNvZGVyZW5naW5lKG9mcCkKQEAgLTQ4Niw3ICs0NzgsNyBAQAogICAgIGlmIG5vdCBvdXQ6CiAgICAgICAgIG91dCA9IGlmcC5GTmFtZQogICAgIGlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0gICAgICAgIG9mc3MgPSBtYWNmcy5GU1NwZWMob3V0KQorICAgICAgICBvZnNzID0gRlNTcGVjKG91dCkKICAgICAgICAgb3V0ID0gb2Zzcy5hc19wYXRobmFtZSgpCiAKICAgICBvZnAgPSBvcGVuKG91dCwgJ3diJykKQEAgLTUxOSw2ICs1MTEsNyBAQAogCiBkZWYgX3Rlc3QoKToKICAgICBpZiBvcy5uYW1lID09ICdtYWMnOgorICAgICAgICBpbXBvcnQgbWFjZnMKICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoJ0ZpbGUgdG8gY29udmVydDonKQogICAgICAgICBpZiBub3Qgb2s6CiAgICAgICAgICAgICBzeXMuZXhpdCgwKQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL19faW5pdF9fLnB5IGIvTGliL2JzZGRiL19faW5pdF9fLnB5CmluZGV4IDkwZWQzNjIuLmNmMzI2NjggMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9fX2luaXRfXy5weQorKysgYi9MaWIvYnNkZGIvX19pbml0X18ucHkKQEAgLTMzLDcgKzMzLDEwIEBACiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKLSIiIlN1cHBvcnQgZm9yIEJlcmtlbGV5REIgMy4yIHRocm91Z2ggNC4yLgorIiIiU3VwcG9ydCBmb3IgQmVya2VsZXlEQiAzLjMgdGhyb3VnaCA0LjQgd2l0aCBhIHNpbXBsZSBpbnRlcmZhY2UuCisKK0ZvciB0aGUgZnVsbCBmZWF0dXJlZCBvYmplY3Qgb3JpZW50ZWQgaW50ZXJmYWNlIHVzZSB0aGUgYnNkZGIuZGIgbW9kdWxlCitpbnN0ZWFkLiAgSXQgbWlycm9ycyB0aGUgU2xlZXB5Y2F0IEJlcmtlbGV5REIgQyBBUEkuCiAiIiIKIAogdHJ5OgpAQCAtNDMsOCArNDYsMTAgQEAKICAgICAgICAgIyBweXRob24gYXMgYnNkZGIuX2JzZGRiLgogICAgICAgICBpbXBvcnQgX3B5YnNkZGIKICAgICAgICAgX2JzZGRiID0gX3B5YnNkZGIKKyAgICAgICAgZnJvbSBic2RkYjMuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKICAgICBlbHNlOgogICAgICAgICBpbXBvcnQgX2JzZGRiCisgICAgICAgIGZyb20gYnNkZGIuZGJ1dGlscyBpbXBvcnQgRGVhZGxvY2tXcmFwIGFzIF9EZWFkbG9ja1dyYXAKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAjIFJlbW92ZSBvdXJzZWx2ZXMgZnJvbSBzeXMubW9kdWxlcwogICAgIGltcG9ydCBzeXMKQEAgLTcwLDcgKzc1LDcgQEAKICAgICBleGVjICIiIgogY2xhc3MgX2l0ZXJfbWl4aW4oVXNlckRpY3QuRGljdE1peGluKToKICAgICBkZWYgX21ha2VfaXRlcl9jdXJzb3Ioc2VsZik6Ci0gICAgICAgIGN1ciA9IHNlbGYuZGIuY3Vyc29yKCkKKyAgICAgICAgY3VyID0gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmN1cnNvcikKICAgICAgICAga2V5ID0gaWQoY3VyKQogICAgICAgICBzZWxmLl9jdXJzb3JfcmVmc1trZXldID0gcmVmKGN1ciwgc2VsZi5fZ2VuX2NyZWZfY2xlYW5lcihrZXkpKQogICAgICAgICByZXR1cm4gY3VyCkBAIC05MCwxOSArOTUsMTkgQEAKIAogICAgICAgICAgICAgIyBzaW5jZSB3ZSdyZSBvbmx5IHJldHVybmluZyBrZXlzLCB3ZSBjYWxsIHRoZSBjdXJzb3IKICAgICAgICAgICAgICMgbWV0aG9kcyB3aXRoIGZsYWdzPTAsIGRsZW49MCwgZG9mcz0wCi0gICAgICAgICAgICBrZXkgPSBjdXIuZmlyc3QoMCwwLDApWzBdCisgICAgICAgICAgICBrZXkgPSBfRGVhZGxvY2tXcmFwKGN1ci5maXJzdCwgMCwwLDApWzBdCiAgICAgICAgICAgICB5aWVsZCBrZXkKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga2V5ID0gbmV4dCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAga2V5ID0gX0RlYWRsb2NrV3JhcChuZXh0LCAwLDAsMClbMF0KICAgICAgICAgICAgICAgICAgICAgeWllbGQga2V5CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTE5LDIxICsxMjQsMjEgQEAKICAgICAgICAgICAgICMgRklYTUUtMjAwMzExMDItZ3JlZzogcmFjZSBjb25kaXRpb24uICBjdXJzb3IgY291bGQKICAgICAgICAgICAgICMgYmUgY2xvc2VkIGJ5IGFub3RoZXIgdGhyZWFkIGJlZm9yZSB0aGlzIGNhbGwuCiAKLSAgICAgICAgICAgIGt2ID0gY3VyLmZpcnN0KCkKKyAgICAgICAgICAgIGt2ID0gX0RlYWRsb2NrV3JhcChjdXIuZmlyc3QpCiAgICAgICAgICAgICBrZXkgPSBrdlswXQogICAgICAgICAgICAgeWllbGQga3YKIAogICAgICAgICAgICAgbmV4dCA9IGN1ci5uZXh0CiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAga3YgPSBuZXh0KCkKKyAgICAgICAgICAgICAgICAgICAga3YgPSBfRGVhZGxvY2tXcmFwKG5leHQpCiAgICAgICAgICAgICAgICAgICAgIGtleSA9IGt2WzBdCiAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGt2CiAgICAgICAgICAgICAgICAgZXhjZXB0IF9ic2RkYi5EQkN1cnNvckNsb3NlZEVycm9yOgogICAgICAgICAgICAgICAgICAgICBjdXIgPSBzZWxmLl9tYWtlX2l0ZXJfY3Vyc29yKCkKICAgICAgICAgICAgICAgICAgICAgIyBGSVhNRS0yMDAzMTEwMS1ncmVnOiByYWNlIGNvbmRpdGlvbi4gIGN1cnNvciBjb3VsZAogICAgICAgICAgICAgICAgICAgICAjIGJlIGNsb3NlZCBieSBhbm90aGVyIHRocmVhZCBiZWZvcmUgdGhpcyBjYWxsLgotICAgICAgICAgICAgICAgICAgICBjdXIuc2V0KGtleSwwLDAsMCkKKyAgICAgICAgICAgICAgICAgICAgX0RlYWRsb2NrV3JhcChjdXIuc2V0LCBrZXksMCwwLDApCiAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBjdXIubmV4dAogICAgICAgICBleGNlcHQgX2JzZGRiLkRCTm90Rm91bmRFcnJvcjoKICAgICAgICAgICAgIHJldHVybgpAQCAtMTc3LDkgKzE4Miw5IEBACiAKICAgICBkZWYgX2NoZWNrQ3Vyc29yKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmRiYyBpcyBOb25lOgotICAgICAgICAgICAgc2VsZi5kYmMgPSBzZWxmLmRiLmN1cnNvcigpCisgICAgICAgICAgICBzZWxmLmRiYyA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jdXJzb3IpCiAgICAgICAgICAgICBpZiBzZWxmLnNhdmVkX2RiY19rZXkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5kYmMuc2V0KHNlbGYuc2F2ZWRfZGJjX2tleSkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnNldCwgc2VsZi5zYXZlZF9kYmNfa2V5KQogICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IE5vbmUKIAogICAgICMgVGhpcyBtZXRob2QgaXMgbmVlZGVkIGZvciBhbGwgbm9uLWN1cnNvciBEQiBjYWxscyB0byBhdm9pZApAQCAtMTkyLDE1ICsxOTcsMTUgQEAKICAgICAgICAgICAgIHNlbGYuZGJjID0gTm9uZQogICAgICAgICAgICAgaWYgc2F2ZToKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2F2ZWRfZGJjX2tleSA9IGMuY3VycmVudCgwLDAsMClbMF0KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zYXZlZF9kYmNfa2V5ID0gX0RlYWRsb2NrV3JhcChjLmN1cnJlbnQsIDAsMCwwKVswXQogICAgICAgICAgICAgICAgIGV4Y2VwdCBkYi5EQkVycm9yOgogICAgICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgIF9EZWFkbG9ja1dyYXAoYy5jbG9zZSkKICAgICAgICAgICAgIGRlbCBjCiAgICAgICAgIGZvciBjcmVmIGluIHNlbGYuX2N1cnNvcl9yZWZzLnZhbHVlcygpOgogICAgICAgICAgICAgYyA9IGNyZWYoKQogICAgICAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBjLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKGMuY2xvc2UpCiAKICAgICBkZWYgX2NoZWNrT3BlbihzZWxmKToKICAgICAgICAgaWYgc2VsZi5kYiBpcyBOb25lOgpAQCAtMjExLDczICsyMTYsNzcgQEAKIAogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gbGVuKHNlbGYuZGIpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogbGVuKHNlbGYuZGIpKSAgIyBsZW4oc2VsZi5kYikKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQotICAgICAgICByZXR1cm4gc2VsZi5kYltrZXldCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKGxhbWJkYTogc2VsZi5kYltrZXldKSAgIyBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKCkKLSAgICAgICAgc2VsZi5kYltrZXldID0gdmFsdWUKKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBzZWxmLmRiW2tleV0gPSB2YWx1ZQorICAgICAgICBfRGVhZGxvY2tXcmFwKHdyYXBGKSAgIyBzZWxmLmRiW2tleV0gPSB2YWx1ZQogCiAgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2Nsb3NlQ3Vyc29ycygpCi0gICAgICAgIGRlbCBzZWxmLmRiW2tleV0KKyAgICAgICAgZGVmIHdyYXBGKCk6CisgICAgICAgICAgICBkZWwgc2VsZi5kYltrZXldCisgICAgICAgIF9EZWFkbG9ja1dyYXAod3JhcEYpICAjIGRlbCBzZWxmLmRiW2tleV0KIAogICAgIGRlZiBjbG9zZShzZWxmKToKICAgICAgICAgc2VsZi5fY2xvc2VDdXJzb3JzKHNhdmU9MCkKICAgICAgICAgaWYgc2VsZi5kYmMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmRiYy5jbG9zZSgpCisgICAgICAgICAgICBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmNsb3NlKQogICAgICAgICB2ID0gMAogICAgICAgICBpZiBzZWxmLmRiIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgdiA9IHNlbGYuZGIuY2xvc2UoKQorICAgICAgICAgICAgdiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYi5jbG9zZSkKICAgICAgICAgc2VsZi5kYmMgPSBOb25lCiAgICAgICAgIHNlbGYuZGIgPSBOb25lCiAgICAgICAgIHJldHVybiB2CiAKICAgICBkZWYga2V5cyhzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKLSAgICAgICAgcmV0dXJuIHNlbGYuZGIua2V5cygpCisgICAgICAgIHJldHVybiBfRGVhZGxvY2tXcmFwKHNlbGYuZGIua2V5cykKIAogICAgIGRlZiBoYXNfa2V5KHNlbGYsIGtleSk6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLmhhc19rZXkoa2V5KQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLmhhc19rZXksIGtleSkKIAogICAgIGRlZiBzZXRfbG9jYXRpb24oc2VsZiwga2V5KToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICByZXR1cm4gc2VsZi5kYmMuc2V0X3JhbmdlKGtleSkKKyAgICAgICAgcmV0dXJuIF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuc2V0X3JhbmdlLCBrZXkpCiAKICAgICBkZWYgbmV4dChzZWxmKToKICAgICAgICAgc2VsZi5fY2hlY2tPcGVuKCkKICAgICAgICAgc2VsZi5fY2hlY2tDdXJzb3IoKQotICAgICAgICBydiA9IHNlbGYuZGJjLm5leHQoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMubmV4dCkKICAgICAgICAgcmV0dXJuIHJ2CiAKICAgICBkZWYgcHJldmlvdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5wcmV2KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLnByZXYpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGZpcnN0KHNlbGYpOgogICAgICAgICBzZWxmLl9jaGVja09wZW4oKQogICAgICAgICBzZWxmLl9jaGVja0N1cnNvcigpCi0gICAgICAgIHJ2ID0gc2VsZi5kYmMuZmlyc3QoKQorICAgICAgICBydiA9IF9EZWFkbG9ja1dyYXAoc2VsZi5kYmMuZmlyc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIGxhc3Qoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCiAgICAgICAgIHNlbGYuX2NoZWNrQ3Vyc29yKCkKLSAgICAgICAgcnYgPSBzZWxmLmRiYy5sYXN0KCkKKyAgICAgICAgcnYgPSBfRGVhZGxvY2tXcmFwKHNlbGYuZGJjLmxhc3QpCiAgICAgICAgIHJldHVybiBydgogCiAgICAgZGVmIHN5bmMoc2VsZik6CiAgICAgICAgIHNlbGYuX2NoZWNrT3BlbigpCi0gICAgICAgIHJldHVybiBzZWxmLmRiLnN5bmMoKQorICAgICAgICByZXR1cm4gX0RlYWRsb2NrV3JhcChzZWxmLmRiLnN5bmMpCiAKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NSw1ICszOTQsNCBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGRiLkRCX1RIUkVBRCA9IDAKIAotCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL2RicmVjaW8ucHkgYi9MaWIvYnNkZGIvZGJyZWNpby5weQppbmRleCAyMmUzODJhLi5kNDM5ZjMyIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvZGJyZWNpby5weQorKysgYi9MaWIvYnNkZGIvZGJyZWNpby5weQpAQCAtNzUsNyArNzUsNyBAQAogCiAgICAgICAgIGRsZW4gPSBuZXdwb3MgLSBzZWxmLnBvcwogCi0gICAgICAgIHIgPSBzZWxmLmRiLmdldChrZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQorICAgICAgICByID0gc2VsZi5kYi5nZXQoc2VsZi5rZXksIHR4bj1zZWxmLnR4biwgZGxlbj1kbGVuLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogICAgICAgICByZXR1cm4gcgogCkBAIC0xMjEsNyArMTIxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5lZ2F0aXZlIHNpemUgbm90IGFsbG93ZWQiKQogICAgICAgICBlbGlmIHNpemUgPCBzZWxmLnBvczoKICAgICAgICAgICAgIHNlbGYucG9zID0gc2l6ZQotICAgICAgICBzZWxmLmRiLnB1dChrZXksICIiLCB0eG49c2VsZi50eG4sIGRsZW49c2VsZi5sZW4tc2l6ZSwgZG9mZj1zaXplKQorICAgICAgICBzZWxmLmRiLnB1dChzZWxmLmtleSwgIiIsIHR4bj1zZWxmLnR4biwgZGxlbj1zZWxmLmxlbi1zaXplLCBkb2ZmPXNpemUpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgcyk6CiAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICAgICBzZWxmLmJ1Zmxpc3QuYXBwZW5kKCdcMCcqKHNlbGYucG9zIC0gc2VsZi5sZW4pKQogICAgICAgICAgICAgc2VsZi5sZW4gPSBzZWxmLnBvcwogICAgICAgICBuZXdwb3MgPSBzZWxmLnBvcyArIGxlbihzKQotICAgICAgICBzZWxmLmRiLnB1dChrZXksIHMsIHR4bj1zZWxmLnR4biwgZGxlbj1sZW4ocyksIGRvZmY9c2VsZi5wb3MpCisgICAgICAgIHNlbGYuZGIucHV0KHNlbGYua2V5LCBzLCB0eG49c2VsZi50eG4sIGRsZW49bGVuKHMpLCBkb2ZmPXNlbGYucG9zKQogICAgICAgICBzZWxmLnBvcyA9IG5ld3BvcwogCiAgICAgZGVmIHdyaXRlbGluZXMoc2VsZiwgbGlzdCk6CmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ0YWJsZXMucHkgYi9MaWIvYnNkZGIvZGJ0YWJsZXMucHkKaW5kZXggMzY5ZGI0My4uNDkyZDVmZCAxMDA2NDQKLS0tIGEvTGliL2JzZGRiL2RidGFibGVzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnRhYmxlcy5weQpAQCAtMzIsNiArMzIsMTIgQEAKICAgICAjIEZvciBQeXRob24gMi4zCiAgICAgZnJvbSBic2RkYi5kYiBpbXBvcnQgKgogCisjIFhYWChubm9yd2l0eik6IGlzIHRoaXMgY29ycmVjdD8gREJJbmNvbXBsZXRlRXJyb3IgaXMgY29uZGl0aW9uYWwgaW4gX2JzZGRiLmMKK3RyeToKKyAgICBEQkluY29tcGxldGVFcnJvcgorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBjbGFzcyBEQkluY29tcGxldGVFcnJvcihFeGNlcHRpb24pOgorICAgICAgICBwYXNzCiAKIGNsYXNzIFRhYmxlREJFcnJvcihTdGFuZGFyZEVycm9yKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvYnNkZGIvZGJ1dGlscy5weSBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CmluZGV4IDNmNjM4NDIuLjZkY2ZkZDUgMTAwNjQ0Ci0tLSBhL0xpYi9ic2RkYi9kYnV0aWxzLnB5CisrKyBiL0xpYi9ic2RkYi9kYnV0aWxzLnB5CkBAIC0yMiwxNCArMjIsMTQgQEAKIAogIwogIyBpbXBvcnQgdGhlIHRpbWUuc2xlZXAgZnVuY3Rpb24gaW4gYSBuYW1lc3BhY2Ugc2FmZSB3YXkgdG8gYWxsb3cKLSMgImZyb20gYnNkZGIuZGIgaW1wb3J0ICoiCisjICJmcm9tIGJzZGRiLmRidXRpbHMgaW1wb3J0ICoiCiAjCiBmcm9tIHRpbWUgaW1wb3J0IHNsZWVwIGFzIF9zbGVlcAogCiBpbXBvcnQgZGIKIAogIyBhbHdheXMgc2xlZXAgYXQgbGVhc3QgTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCi1fZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzY0CitfZGVhZGxvY2tfTWluU2xlZXBUaW1lID0gMS4wLzEyOAogIyBuZXZlciBzbGVlcCBtb3JlIHRoYW4gTiBzZWNvbmRzIGJldHdlZW4gcmV0cnlzCiBfZGVhZGxvY2tfTWF4U2xlZXBUaW1lID0gMy4xNDE1OQogCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgbWF4X3JldHJpZXMgPSBfa3dhcmdzLmdldCgnbWF4X3JldHJpZXMnLCAtMSkKICAgICBpZiBfa3dhcmdzLmhhc19rZXkoJ21heF9yZXRyaWVzJyk6CiAgICAgICAgIGRlbCBfa3dhcmdzWydtYXhfcmV0cmllcyddCi0gICAgd2hpbGUgMToKKyAgICB3aGlsZSBUcnVlOgogICAgICAgICB0cnk6CiAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKl9hcmdzLCAqKl9rd2FyZ3MpCiAgICAgICAgIGV4Y2VwdCBkYi5EQkxvY2tEZWFkbG9ja0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9iYXNpY3MucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQppbmRleCBiZWM1ZGEzLi5kNmQ1MDdmIDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2Jhc2ljcy5weQpAQCAtNTYyLDYgKzU2Miw5IEBACiAgICAgICAgIG51bSA9IGQudHJ1bmNhdGUoKQogICAgICAgICBhc3NlcnQgbnVtID09IDAsICJ0cnVuY2F0ZSBvbiBlbXB0eSBEQiByZXR1cm5lZCBub256ZXJvICglcikiICUgKG51bSwpCiAKKyAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIApAQCAtNTgzLDE4ICs1ODYsNDAgQEAKICAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAogCiAKLWNsYXNzIEJhc2ljQlRyZWVXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY1dpdGhFbnZUZXN0Q2FzZShCYXNpY1Rlc3RDYXNlKToKKyAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAorICAgIHVzZUVudiA9IDEKKyAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKKworICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBkZWYgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZW52OgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICdcbicsICctPScgKiAzMAorICAgICAgICAgICAgcHJpbnQgIlJ1bm5pbmcgJXMudGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZS4uLiIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgICAgICMgY2FuJ3QgcmVuYW1lIG9yIHJlbW92ZSBhbiBvcGVuIERCCisgICAgICAgIHNlbGYuZC5jbG9zZSgpCisKKyAgICAgICAgbmV3bmFtZSA9IHNlbGYuZmlsZW5hbWUgKyAnLnJlbmFtZWQnCisgICAgICAgIHNlbGYuZW52LmRicmVuYW1lKHNlbGYuZmlsZW5hbWUsIE5vbmUsIG5ld25hbWUpCisgICAgICAgIHNlbGYuZW52LmRicmVtb3ZlKG5ld25hbWUpCisKKyAgICAjIGRicmVtb3ZlIGFuZCBkYnJlbmFtZSBhcmUgaW4gNC4xIGFuZCBsYXRlcgorICAgIGlmIGRiLnZlcnNpb24oKSA8ICg0LDEpOgorICAgICAgICBkZWwgdGVzdDA3X0VudlJlbW92ZUFuZFJlbmFtZQorCisgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworY2xhc3MgQmFzaWNCVHJlZVdpdGhFbnZUZXN0Q2FzZShCYXNpY1dpdGhFbnZUZXN0Q2FzZSk6CiAgICAgZGJ0eXBlID0gZGIuREJfQlRSRUUKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCi1jbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNUZXN0Q2FzZSk6CitjbGFzcyBCYXNpY0hhc2hXaXRoRW52VGVzdENhc2UoQmFzaWNXaXRoRW52VGVzdENhc2UpOgogICAgIGRidHlwZSA9IGRiLkRCX0hBU0gKLSAgICBkYm9wZW5mbGFncyA9IGRiLkRCX1RIUkVBRAotICAgIHVzZUVudiA9IDEKLSAgICBlbnZmbGFncyA9IGRiLkRCX1RIUkVBRCB8IGRiLkRCX0lOSVRfTVBPT0wgfCBkYi5EQl9JTklUX0xPQ0sKIAogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weSBiL0xpYi9jb21waWxlci9mdXR1cmUucHkKaW5kZXggMzljM2JiOS4uZmVmMTg5ZSAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL2Z1dHVyZS5weQorKysgYi9MaWIvY29tcGlsZXIvZnV0dXJlLnB5CkBAIC0yMywxNCArMjMsNyBAQAogCiAgICAgZGVmIHZpc2l0TW9kdWxlKHNlbGYsIG5vZGUpOgogICAgICAgICBzdG10ID0gbm9kZS5ub2RlCi0gICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IEZhbHNlCiAgICAgICAgIGZvciBzIGluIHN0bXQubm9kZXM6Ci0gICAgICAgICAgICAjIFNraXAgb3ZlciBkb2NzdHJpbmdzCi0gICAgICAgICAgICBpZiBub3QgZm91bmRfZG9jc3RyaW5nIGFuZCBpc2luc3RhbmNlKHMsIGFzdC5EaXNjYXJkKSBcCi0gICAgICAgICAgICAgICBhbmQgaXNpbnN0YW5jZShzLmV4cHIsIGFzdC5Db25zdCkgXAotICAgICAgICAgICAgICAgYW5kIGlzaW5zdGFuY2Uocy5leHByLnZhbHVlLCBzdHIpOgotICAgICAgICAgICAgICAgIGZvdW5kX2RvY3N0cmluZyA9IFRydWUKLSAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICAgaWYgbm90IHNlbGYuY2hlY2tfc3RtdChzKToKICAgICAgICAgICAgICAgICBicmVhawogCmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5IGIvTGliL2NvbXBpbGVyL3B5Y29kZWdlbi5weQppbmRleCBjMDkzMTI4Li5jOGE5Nzc5IDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvcHljb2RlZ2VuLnB5CisrKyBiL0xpYi9jb21waWxlci9weWNvZGVnZW4ucHkKQEAgLTM4MCwxNiArMzgwLDcgQEAKICAgICAgICAgc2VsZi5zZXRfbGluZW5vKG5vZGUpCiAgICAgICAgIGZvciBkZWZhdWx0IGluIG5vZGUuZGVmYXVsdHM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGRlZmF1bHQpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIGZvciBuYW1lIGluIGZyZWVzOgotICAgICAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICAgICAgc2VsZi5lbWl0KCdNQUtFX0ZVTkNUSU9OJywgbGVuKG5vZGUuZGVmYXVsdHMpKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgbGVuKG5vZGUuZGVmYXVsdHMpKQogICAgICAgICBmb3IgaSBpbiByYW5nZShuZGVjb3JhdG9ycyk6CiAgICAgICAgICAgICBzZWxmLmVtaXQoJ0NBTExfRlVOQ1RJT04nLCAxKQogCkBAIC00MDMsMTQgKzM5NCw3IEBACiAgICAgICAgIGZvciBiYXNlIGluIG5vZGUuYmFzZXM6CiAgICAgICAgICAgICBzZWxmLnZpc2l0KGJhc2UpCiAgICAgICAgIHNlbGYuZW1pdCgnQlVJTERfVFVQTEUnLCBsZW4obm9kZS5iYXNlcykpCi0gICAgICAgIGZyZWVzID0gZ2VuLnNjb3BlLmdldF9mcmVlX3ZhcnMoKQotICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DTE9TVVJFJywgbmFtZSkKLSAgICAgICAgc2VsZi5lbWl0KCdMT0FEX0NPTlNUJywgZ2VuKQotICAgICAgICBpZiBmcmVlczoKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgMCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIDApCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgc2VsZi5lbWl0KCdDQUxMX0ZVTkNUSU9OJywgMCkKICAgICAgICAgc2VsZi5lbWl0KCdCVUlMRF9DTEFTUycpCiAgICAgICAgIHNlbGYuc3RvcmVOYW1lKG5vZGUubmFtZSkKQEAgLTY0MiwyMiArNjI2LDI1IEBACiAgICAgICAgIHNlbGYubmV3QmxvY2soKQogICAgICAgICBzZWxmLmVtaXQoJ1BPUF9UT1AnKQogCisgICAgZGVmIF9tYWtlQ2xvc3VyZShzZWxmLCBnZW4sIGFyZ3MpOgorICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKKyAgICAgICAgaWYgZnJlZXM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKKyAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCisgICAgICAgICAgICBzZWxmLmVtaXQoJ0JVSUxEX1RVUExFJywgbGVuKGZyZWVzKSkKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9DTE9TVVJFJywgYXJncykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTE9BRF9DT05TVCcsIGdlbikKKyAgICAgICAgICAgIHNlbGYuZW1pdCgnTUFLRV9GVU5DVElPTicsIGFyZ3MpCisKICAgICBkZWYgdmlzaXRHZW5FeHByKHNlbGYsIG5vZGUpOgogICAgICAgICBnZW4gPSBHZW5FeHByQ29kZUdlbmVyYXRvcihub2RlLCBzZWxmLnNjb3Blcywgc2VsZi5jbGFzc19uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmdldF9tb2R1bGUoKSkKICAgICAgICAgd2Fsayhub2RlLmNvZGUsIGdlbikKICAgICAgICAgZ2VuLmZpbmlzaCgpCiAgICAgICAgIHNlbGYuc2V0X2xpbmVubyhub2RlKQotICAgICAgICBmcmVlcyA9IGdlbi5zY29wZS5nZXRfZnJlZV92YXJzKCkKLSAgICAgICAgaWYgZnJlZXM6Ci0gICAgICAgICAgICBmb3IgbmFtZSBpbiBmcmVlczoKLSAgICAgICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ0xPU1VSRScsIG5hbWUpCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfQ0xPU1VSRScsIDApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmVtaXQoJ0xPQURfQ09OU1QnLCBnZW4pCi0gICAgICAgICAgICBzZWxmLmVtaXQoJ01BS0VfRlVOQ1RJT04nLCAwKQotCisgICAgICAgIHNlbGYuX21ha2VDbG9zdXJlKGdlbiwgMCkKICAgICAgICAgIyBwcmVjb21wdXRhdGlvbiBvZiBvdXRtb3N0IGl0ZXJhYmxlCiAgICAgICAgIHNlbGYudmlzaXQobm9kZS5jb2RlLnF1YWxzWzBdLml0ZXIpCiAgICAgICAgIHNlbGYuZW1pdCgnR0VUX0lURVInKQpkaWZmIC0tZ2l0IGEvTGliL2NvbXBpbGVyL3N5bWJvbHMucHkgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQppbmRleCBjNjA4ZjY0Li44ZWI1ZmNlIDEwMDY0NAotLS0gYS9MaWIvY29tcGlsZXIvc3ltYm9scy5weQorKysgYi9MaWIvY29tcGlsZXIvc3ltYm9scy5weQpAQCAtMTkxLDcgKzE5MSw3IEBACiAgICAgICAgIHNlbGYuYWRkX3BhcmFtKCdbb3V0bW9zdC1pdGVyYWJsZV0nKQogCiAgICAgZGVmIGdldF9uYW1lcyhzZWxmKToKLSAgICAgICAga2V5cyA9IFNjb3BlLmdldF9uYW1lcygpCisgICAgICAgIGtleXMgPSBTY29wZS5nZXRfbmFtZXMoc2VsZikKICAgICAgICAgcmV0dXJuIGtleXMKIAogY2xhc3MgTGFtYmRhU2NvcGUoRnVuY3Rpb25TY29wZSk6CmRpZmYgLS1naXQgYS9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkgYi9MaWIvY29tcGlsZXIvdHJhbnNmb3JtZXIucHkKaW5kZXggOTZiY2NlMy4uOGQyNTZlZCAxMDA2NDQKLS0tIGEvTGliL2NvbXBpbGVyL3RyYW5zZm9ybWVyLnB5CisrKyBiL0xpYi9jb21waWxlci90cmFuc2Zvcm1lci5weQpAQCAtNTM2LDEyICs1MzYsNyBAQAogICAgICAgICAgICAgICAgICAgIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKIAogICAgIGRlZiB0cnlfc3RtdChzZWxmLCBub2RlbGlzdCk6Ci0gICAgICAgICMgJ3RyeScgJzonIHN1aXRlIChleGNlcHRfY2xhdXNlICc6JyBzdWl0ZSkrIFsnZWxzZScgJzonIHN1aXRlXQotICAgICAgICAjIHwgJ3RyeScgJzonIHN1aXRlICdmaW5hbGx5JyAnOicgc3VpdGUKLSAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gIT0gc3ltYm9sLmV4Y2VwdF9jbGF1c2U6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5jb21fdHJ5X2ZpbmFsbHkobm9kZWxpc3QpCi0KLSAgICAgICAgcmV0dXJuIHNlbGYuY29tX3RyeV9leGNlcHQobm9kZWxpc3QpCisgICAgICAgIHJldHVybiBzZWxmLmNvbV90cnlfZXhjZXB0X2ZpbmFsbHkobm9kZWxpc3QpCiAKICAgICBkZWYgd2l0aF9zdG10KHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgcmV0dXJuIHNlbGYuY29tX3dpdGgobm9kZWxpc3QpCkBAIC03MjksMjIgKzcyNCwyMCBAQAogCiAgICAgZGVmIGF0b20oc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICByZXR1cm4gc2VsZi5fYXRvbV9kaXNwYXRjaFtub2RlbGlzdFswXVswXV0obm9kZWxpc3QpCi0gICAgICAgIG4ubGluZW5vID0gbm9kZWxpc3RbMF1bMl0KLSAgICAgICAgcmV0dXJuIG4KIAogICAgIGRlZiBhdG9tX2xwYXIoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICBpZiBub2RlbGlzdFsxXVswXSA9PSB0b2tlbi5SUEFSOgotICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpKQorICAgICAgICAgICAgcmV0dXJuIFR1cGxlKCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbHNxYihzZWxmLCBub2RlbGlzdCk6CiAgICAgICAgIGlmIG5vZGVsaXN0WzFdWzBdID09IHRva2VuLlJTUUI6Ci0gICAgICAgICAgICByZXR1cm4gTGlzdCgoKSkKKyAgICAgICAgICAgIHJldHVybiBMaXN0KCgpLCBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCiAgICAgICAgIHJldHVybiBzZWxmLmNvbV9saXN0X2NvbnN0cnVjdG9yKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fbGJyYWNlKHNlbGYsIG5vZGVsaXN0KToKICAgICAgICAgaWYgbm9kZWxpc3RbMV1bMF0gPT0gdG9rZW4uUkJSQUNFOgotICAgICAgICAgICAgcmV0dXJuIERpY3QoKCkpCisgICAgICAgICAgICByZXR1cm4gRGljdCgoKSwgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQogICAgICAgICByZXR1cm4gc2VsZi5jb21fZGljdG1ha2VyKG5vZGVsaXN0WzFdKQogCiAgICAgZGVmIGF0b21fYmFja3F1b3RlKHNlbGYsIG5vZGVsaXN0KToKQEAgLTkxOSwxOCArOTEyLDIxIEBACiAgICAgICAgICAgICBiYXNlcy5hcHBlbmQoc2VsZi5jb21fbm9kZShub2RlW2ldKSkKICAgICAgICAgcmV0dXJuIGJhc2VzCiAKLSAgICBkZWYgY29tX3RyeV9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZmluX3N0bXQ6ICJ0cnkiICI6IiBzdWl0ZSAiZmluYWxseSIgIjoiIHN1aXRlCi0gICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzVdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vPW5vZGVsaXN0WzBdWzJdKQorICAgIGRlZiBjb21fdHJ5X2V4Y2VwdF9maW5hbGx5KHNlbGYsIG5vZGVsaXN0KToKKyAgICAgICAgIyAoJ3RyeScgJzonIHN1aXRlCisgICAgICAgICMgICgoZXhjZXB0X2NsYXVzZSAnOicgc3VpdGUpKyBbJ2Vsc2UnICc6JyBzdWl0ZV0gWydmaW5hbGx5JyAnOicgc3VpdGVdCisgICAgICAgICMgICB8ICdmaW5hbGx5JyAnOicgc3VpdGUpKQogCi0gICAgZGVmIGNvbV90cnlfZXhjZXB0KHNlbGYsIG5vZGVsaXN0KToKLSAgICAgICAgIyB0cnlfZXhjZXB0OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSogWydlbHNlJyBzdWl0ZV0KKyAgICAgICAgaWYgbm9kZWxpc3RbM11bMF0gPT0gdG9rZW4uTkFNRToKKyAgICAgICAgICAgICMgZmlyc3QgY2xhdXNlIGlzIGEgZmluYWxseSBjbGF1c2U6IG9ubHkgdHJ5LWZpbmFsbHkKKyAgICAgICAgICAgIHJldHVybiBUcnlGaW5hbGx5KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFs1XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisKICAgICAgICAgI3RyeWV4Y2VwdDogIFtUcnlOb2RlLCBbZXhjZXB0X2NsYXVzZXNdLCBlbHNlTm9kZSldCi0gICAgICAgIHN0bXQgPSBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0WzJdKQogICAgICAgICBjbGF1c2VzID0gW10KICAgICAgICAgZWxzZU5vZGUgPSBOb25lCisgICAgICAgIGZpbmFsbHlOb2RlID0gTm9uZQogICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBsZW4obm9kZWxpc3QpLCAzKToKICAgICAgICAgICAgIG5vZGUgPSBub2RlbGlzdFtpXQogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSBzeW1ib2wuZXhjZXB0X2NsYXVzZToKQEAgLTk0Niw5ICs5NDIsMTYgQEAKICAgICAgICAgICAgICAgICBjbGF1c2VzLmFwcGVuZCgoZXhwcjEsIGV4cHIyLCBzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2krMl0pKSkKIAogICAgICAgICAgICAgaWYgbm9kZVswXSA9PSB0b2tlbi5OQU1FOgotICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQotICAgICAgICByZXR1cm4gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgICAgICAgICAgaWYgbm9kZVsxXSA9PSAnZWxzZSc6CisgICAgICAgICAgICAgICAgICAgIGVsc2VOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICAgICAgICAgIGVsaWYgbm9kZVsxXSA9PSAnZmluYWxseSc6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsbHlOb2RlID0gc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKQorICAgICAgICB0cnlfZXhjZXB0ID0gVHJ5RXhjZXB0KHNlbGYuY29tX25vZGUobm9kZWxpc3RbMl0pLCBjbGF1c2VzLCBlbHNlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm89bm9kZWxpc3RbMF1bMl0pCisgICAgICAgIGlmIGZpbmFsbHlOb2RlOgorICAgICAgICAgICAgcmV0dXJuIFRyeUZpbmFsbHkodHJ5X2V4Y2VwdCwgZmluYWxseU5vZGUsIGxpbmVubz1ub2RlbGlzdFswXVsyXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiB0cnlfZXhjZXB0CiAKICAgICBkZWYgY29tX3dpdGgoc2VsZiwgbm9kZWxpc3QpOgogICAgICAgICAjIHdpdGhfc3RtdDogJ3dpdGgnIGV4cHIgW3dpdGhfdmFyXSAnOicgc3VpdGUKQEAgLTExMzgsNyArMTE0MSw3IEBACiAgICAgICAgICAgICB2YWx1ZXMgPSBbXQogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKG5vZGVsaXN0KSwgMik6CiAgICAgICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSkKLSAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcykKKyAgICAgICAgICAgIHJldHVybiBMaXN0KHZhbHVlcywgbGluZW5vPXZhbHVlc1swXS5saW5lbm8pCiAKICAgICBpZiBoYXNhdHRyKHN5bWJvbCwgJ2dlbl9mb3InKToKICAgICAgICAgZGVmIGNvbV9nZW5lcmF0b3JfZXhwcmVzc2lvbihzZWxmLCBleHByLCBub2RlKToKQEAgLTExODUsNyArMTE4OCw3IEBACiAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihub2RlbGlzdCksIDQpOgogICAgICAgICAgICAgaXRlbXMuYXBwZW5kKChzZWxmLmNvbV9ub2RlKG5vZGVsaXN0W2ldKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21fbm9kZShub2RlbGlzdFtpKzJdKSkpCi0gICAgICAgIHJldHVybiBEaWN0KGl0ZW1zKQorICAgICAgICByZXR1cm4gRGljdChpdGVtcywgbGluZW5vPWl0ZW1zWzBdWzBdLmxpbmVubykKIAogICAgIGRlZiBjb21fYXBwbHlfdHJhaWxlcihzZWxmLCBwcmltYXJ5Tm9kZSwgbm9kZWxpc3QpOgogICAgICAgICB0ID0gbm9kZWxpc3RbMV1bMF0KQEAgLTEzNzksNiArMTM4Miw3IEBACiAgICAgc3ltYm9sLnRlc3RsaXN0LAogICAgIHN5bWJvbC50ZXN0bGlzdF9zYWZlLAogICAgIHN5bWJvbC50ZXN0LAorICAgIHN5bWJvbC5vcl90ZXN0LAogICAgIHN5bWJvbC5hbmRfdGVzdCwKICAgICBzeW1ib2wubm90X3Rlc3QsCiAgICAgc3ltYm9sLmNvbXBhcmlzb24sCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5IGIvTGliL2N0eXBlcy9fX2luaXRfXy5weQppbmRleCBmMmRkYmFhLi5hNGUzYzM2IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19faW5pdF9fLnB5CisrKyBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKQEAgLTEsOSArMSwxMSBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiY3JlYXRlIGFuZCBtYW5pcHVsYXRlIEMgZGF0YSB0eXBlcyBpbiBQeXRob24iIiIKIAogaW1wb3J0IG9zIGFzIF9vcywgc3lzIGFzIF9zeXMKLWZyb20gaXRlcnRvb2xzIGltcG9ydCBjaGFpbiBhcyBfY2hhaW4KIAotX192ZXJzaW9uX18gPSAiMC45LjkuNiIKK19fdmVyc2lvbl9fID0gIjEuMC4wIgogCiBmcm9tIF9jdHlwZXMgaW1wb3J0IFVuaW9uLCBTdHJ1Y3R1cmUsIEFycmF5CiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9Qb2ludGVyCkBAIC0yMCw2ICsyMiwyMyBAQAogaWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgRm9ybWF0RXJyb3IKIAorREVGQVVMVF9NT0RFID0gUlRMRF9MT0NBTAoraWYgX29zLm5hbWUgPT0gInBvc2l4IiBhbmQgX3N5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICBpbXBvcnQgZ2VzdGFsdAorCisgICAgIyBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSByZXR1cm5zIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUKKyAgICAjIGN1cnJlbnRseSBhY3RpdmUgc3lzdGVtIGZpbGUgYXMgQkNELgorICAgICMgT24gT1MgWCAxMC40LjYgLT4gMHgxMDQ2CisgICAgIyBPbiBPUyBYIDEwLjIuOCAtPiAweDEwMjgKKyAgICAjIFNlZSBhbHNvIGh0dHA6Ly93d3cucmdhcm9zLm5sL2dlc3RhbHQvCisgICAgIworICAgICMgT24gT1MgWCAxMC4zLCB3ZSB1c2UgUlRMRF9HTE9CQUwgYXMgZGVmYXVsdCBtb2RlCisgICAgIyBiZWNhdXNlIFJUTERfTE9DQUwgZG9lcyBub3Qgd29yayBhdCBsZWFzdCBvbiBzb21lCisgICAgIyBsaWJyYXJpZXMuCisKKyAgICBpZiBnZXN0YWx0Lmdlc3RhbHQoInN5c3YiKSA8IDB4MTA0MDoKKyAgICAgICAgREVGQVVMVF9NT0RFID0gUlRMRF9HTE9CQUwKKwogZnJvbSBfY3R5cGVzIGltcG9ydCBGVU5DRkxBR19DREVDTCBhcyBfRlVOQ0ZMQUdfQ0RFQ0wsIFwKICAgICAgRlVOQ0ZMQUdfUFlUSE9OQVBJIGFzIF9GVU5DRkxBR19QWVRIT05BUEkKIApAQCAtNjcsNyArODYsNyBAQAogICAgIHJlc3R5cGU6IHRoZSByZXN1bHQgdHlwZQogICAgIGFyZ3R5cGVzOiBhIHNlcXVlbmNlIHNwZWNpZnlpbmcgdGhlIGFyZ3VtZW50IHR5cGVzCiAKLSAgICBUaGUgZnVuY3Rpb24gcHJvdG90eXBlIGNhbiBiZSBjYWxsZWQgaW4gdGhyZWUgd2F5cyB0byBjcmVhdGUgYQorICAgIFRoZSBmdW5jdGlvbiBwcm90b3R5cGUgY2FuIGJlIGNhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cyB0byBjcmVhdGUgYQogICAgIGNhbGxhYmxlIG9iamVjdDoKIAogICAgIHByb3RvdHlwZShpbnRlZ2VyIGFkZHJlc3MpIC0+IGZvcmVpZ24gZnVuY3Rpb24KQEAgLTExMSw3ICsxMzAsNyBAQAogZWxpZiBfb3MubmFtZSA9PSAicG9zaXgiOgogICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuIGFzIF9kbG9wZW4KIAotZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudAorZnJvbSBfY3R5cGVzIGltcG9ydCBzaXplb2YsIGJ5cmVmLCBhZGRyZXNzb2YsIGFsaWdubWVudCwgcmVzaXplCiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQogCiBjbGFzcyBweV9vYmplY3QoX1NpbXBsZUNEYXRhKToKQEAgLTI4Miw3ICszMDEsNyBAQAogICAgICAgICBfZmxhZ3NfID0gX0ZVTkNGTEFHX0NERUNMCiAgICAgICAgIF9yZXN0eXBlXyA9IGNfaW50ICMgZGVmYXVsdCwgY2FuIGJlIG92ZXJyaWRkZW4gaW4gaW5zdGFuY2VzCiAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgbW9kZT1SVExEX0xPQ0FMLCBoYW5kbGU9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIG1vZGU9REVGQVVMVF9NT0RFLCBoYW5kbGU9Tm9uZSk6CiAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCiAgICAgICAgIGlmIGhhbmRsZSBpcyBOb25lOgogICAgICAgICAgICAgc2VsZi5faGFuZGxlID0gX2Rsb3BlbihzZWxmLl9uYW1lLCBtb2RlKQpAQCAtMjkzLDE4ICszMTIsMTkgQEAKICAgICAgICAgcmV0dXJuICI8JXMgJyVzJywgaGFuZGxlICV4IGF0ICV4PiIgJSBcCiAgICAgICAgICAgICAgICAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYuX25hbWUsCiAgICAgICAgICAgICAgICAgKHNlbGYuX2hhbmRsZSAmIChfc3lzLm1heGludCoyICsgMSkpLAotICAgICAgICAgICAgICAgIGlkKHNlbGYpKQorICAgICAgICAgICAgICAgIGlkKHNlbGYpICYgKF9zeXMubWF4aW50KjIgKyAxKSkKIAogICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKICAgICAgICAgaWYgbmFtZS5zdGFydHN3aXRoKCdfXycpIGFuZCBuYW1lLmVuZHN3aXRoKCdfXycpOgogICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgZnVuYyA9IHNlbGYuX19nZXRpdGVtX18obmFtZSkKKyAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgICAgICByZXR1cm4gZnVuYwogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCk6CiAgICAgICAgIGZ1bmMgPSBzZWxmLl9GdW5jUHRyKChuYW1lX29yX29yZGluYWwsIHNlbGYpKQogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShuYW1lX29yX29yZGluYWwsIChpbnQsIGxvbmcpKToKICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18gPSBuYW1lX29yX29yZGluYWwKLSAgICAgICAgICAgIHNldGF0dHIoc2VsZiwgbmFtZV9vcl9vcmRpbmFsLCBmdW5jKQogICAgICAgICByZXR1cm4gZnVuYwogCiBjbGFzcyBQeURMTChDRExMKToKQEAgLTQxOSwxMiArNDM5LDEwIEBACiAgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKICAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKICAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQotX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCkoX2Nhc3RfYWRkcikKIAorX2Nhc3QgPSBQWUZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIHB5X29iamVjdCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQogZGVmIGNhc3Qob2JqLCB0eXApOgotICAgIHJlc3VsdCA9IF9jYXN0KG9iaiwgdHlwKQotICAgIHJlc3VsdC5fX2tlZXByZWYgPSBvYmoKLSAgICByZXR1cm4gcmVzdWx0CisgICAgcmV0dXJuIF9jYXN0KG9iaiwgb2JqLCB0eXApCiAKIF9zdHJpbmdfYXQgPSBDRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgY19pbnQpKF9zdHJpbmdfYXRfYWRkcikKIGRlZiBzdHJpbmdfYXQocHRyLCBzaXplPTApOgpAQCAtNDQ2LDUyICs0NjQsMjEgQEAKICAgICAgICAgcmV0dXJuIF93c3RyaW5nX2F0KHB0ciwgc2l6ZSkKIAogCi1pZiBfb3MubmFtZSA9PSAibnQiOiAjIENPTSBzdHVmZgoraWYgX29zLm5hbWUgaW4gKCJudCIsICJjZSIpOiAjIENPTSBzdHVmZgogICAgIGRlZiBEbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdik6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGZvciB0aGUKLSAgICAgICAgIyBjbGFzcyBvYmplY3QuCi0KLSAgICAgICAgIyB0cmljayBweTJleGUgYnkgZG9pbmcgZHluYW1pYyBpbXBvcnRzCi0gICAgICAgIHJlc3VsdCA9IC0yMTQ3MjIxMjMxICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBjdGNvbSA9IF9faW1wb3J0X18oImN0eXBlcy5jb20uc2VydmVyIiwgZ2xvYmFscygpLCBsb2NhbHMoKSwgWycqJ10pCisgICAgICAgICAgICBjY29tID0gX19pbXBvcnRfXygiY29tdHlwZXMuc2VydmVyLmlucHJvY3NlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBwYXNzCisgICAgICAgICAgICByZXR1cm4gLTIxNDcyMjEyMzEgIyBDTEFTU19FX0NMQVNTTk9UQVZBSUxBQkxFCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXN1bHQgPSBjdGNvbS5EbGxHZXRDbGFzc09iamVjdChyY2xzaWQsIHJpaWQsIHBwdikKLQotICAgICAgICBpZiByZXN1bHQgPT0gLTIxNDcyMjEyMzE6ICMgQ0xBU1NfRV9DTEFTU05PVEFWQUlMQUJMRQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGNjb20gPSBfX2ltcG9ydF9fKCJjb210eXBlcy5zZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKLSAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCi0KLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIGNjb20uRGxsR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpCiAKICAgICBkZWYgRGxsQ2FuVW5sb2FkTm93KCk6Ci0gICAgICAgICMgRmlyc3QgYXNrIGN0eXBlcy5jb20uc2VydmVyIHRoYW4gY29tdHlwZXMuc2VydmVyIGlmIHdlIGNhbiB1bmxvYWQgb3Igbm90LgotICAgICAgICAjIHRyaWNrIHB5MmV4ZSBieSBkb2luZyBkeW5hbWljIGltcG9ydHMKLSAgICAgICAgcmVzdWx0ID0gMCAjIFNfT0sKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgY3Rjb20gPSBfX2ltcG9ydF9fKCJjdHlwZXMuY29tLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQorICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlci5pbnByb2NzZXJ2ZXIiLCBnbG9iYWxzKCksIGxvY2FscygpLCBbJyonXSkKICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmVzdWx0ID0gY3Rjb20uRGxsQ2FuVW5sb2FkTm93KCkKLSAgICAgICAgICAgIGlmIHJlc3VsdCAhPSAwOiAjICE9IFNfT0sKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgY2NvbSA9IF9faW1wb3J0X18oImNvbXR5cGVzLnNlcnZlciIsIGdsb2JhbHMoKSwgbG9jYWxzKCksIFsnKiddKQotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgcmV0dXJuIHJlc3VsdAorICAgICAgICAgICAgcmV0dXJuIDAgIyBTX09LCisgICAgICAgIHJldHVybiBjY29tLkRsbENhblVubG9hZE5vdygpCiAKIGZyb20gY3R5cGVzLl9lbmRpYW4gaW1wb3J0IEJpZ0VuZGlhblN0cnVjdHVyZSwgTGl0dGxlRW5kaWFuU3RydWN0dXJlCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2VuZGlhbi5weSBiL0xpYi9jdHlwZXMvX2VuZGlhbi5weQppbmRleCA1ODE4YWUxLi42ZGUwZDQ3IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19lbmRpYW4ucHkKKysrIGIvTGliL2N0eXBlcy9fZW5kaWFuLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaW1wb3J0IHN5cwogZnJvbSBjdHlwZXMgaW1wb3J0ICoKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvX19pbml0X18ucHkKaW5kZXggNTYyMWRlZi4uMzYxNDlkMiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9tYWNob2xpYi9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL19faW5pdF9fLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBFbm91Z2ggTWFjaC1PIHRvIG1ha2UgeW91ciBoZWFkIHNwaW4uCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weSBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsZC5weQppbmRleCBhMzM2ZmQwLi4xNGUyMTM5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGQucHkKKysrIGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxkLnB5CkBAIC0xLDMgKzEsNiBAQAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4gIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIiIiCiBkeWxkIGVtdWxhdGlvbgogIiIiCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5IGIvTGliL2N0eXBlcy9tYWNob2xpYi9keWxpYi5weQppbmRleCBhYTEwNzUwLi5lYTNkZDM4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2R5bGliLnB5CisrKyBiL0xpYi9jdHlwZXMvbWFjaG9saWIvZHlsaWIucHkKQEAgLTEsMyArMSw2IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLiAjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAiIiIKIEdlbmVyaWMgZHlsaWIgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9tYWNob2xpYi9mcmFtZXdvcmsucHkgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQppbmRleCBhZDZlZDU1Li5kZDdmYjJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQorKysgYi9MaWIvY3R5cGVzL21hY2hvbGliL2ZyYW1ld29yay5weQpAQCAtMSwzICsxLDYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICIiIgogR2VuZXJpYyBmcmFtZXdvcmsgcGF0aCBtYW5pcHVsYXRpb24KICIiIgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTllMDJjYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKQEAgLTAsMCArMSw2MCBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitjbGFzcyBBbm9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9hbm9uKHNlbGYpOgorICAgICAgICBjbGFzcyBBTk9OKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50KV0KKworICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8iLCBBTk9OKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYS5vZmZzZXQsIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKEFOT04uYi5vZmZzZXQsIDApCisKKyAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKKyAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhOiB0eXBlKFN0cnVjdHVyZSkoIk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cnVjdHVyZSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJfZmllbGRzXyI6IFtdLCAiX2Fub255bW91c18iOiA0Mn0pKQorCisgICAgZGVmIHRlc3RfYW5vbl9ub25tZW1iZXIoc2VsZik6CisgICAgICAgICMgQXR0cmlidXRlRXJyb3I6IHR5cGUgb2JqZWN0ICdOYW1lJyBoYXMgbm8gYXR0cmlidXRlICd4JworICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9hbm9ueW1vdXNfIjogWyJ4Il19KSkKKworICAgIGRlZiB0ZXN0X25lc3RlZChzZWxmKToKKyAgICAgICAgY2xhc3MgQU5PTl9TKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2ludCldCisKKyAgICAgICAgY2xhc3MgQU5PTl9VKFVuaW9uKToKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiXyIsIEFOT05fUyksCisgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2ludCldCisgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCisKKyAgICAgICAgY2xhc3MgWShTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJfIiwgQU5PTl9VKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KKyAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDgyMWNlM2YuLjA5ZTkyOGYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtMzAsMTcgKzMwLDMyIEBACiAgICAgICAgIHB0ciA9IGNhc3QoYWRkcmVzcywgUE9JTlRFUihjX2ludCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKIAorICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgorICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIGFycmF5WzBdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQogCi0gICAgZGVmIHRlc3RfcHRyMmFycmF5KHNlbGYpOgotICAgICAgICBhcnJheSA9IChjX2ludCAqIDMpKDQyLCAxNywgMikKKyAgICAgICAgcCA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19jaGFyX3ApKQorICAgICAgICAjIGFycmF5IGFuZCBwIHNoYXJlIGEgY29tbW9uIF9vYmplY3RzIGF0dHJpYnV0ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIHsnMCc6ICJmb28gYmFyIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHBbMF0gPSAic3BhbSBzcGFtIgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLl9vYmplY3RzLCB7JzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQorICAgICAgICBwWzFdID0gImZvbyBiYXIiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuX29iamVjdHMsIHsnMSc6ICdmb28gYmFyJywgJzAnOiAic3BhbSBzcGFtIiwgaWQoYXJyYXkpOiBhcnJheX0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcnJheS5fb2JqZWN0cyBpcyBwLl9vYmplY3RzKQogCi0gICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudAotCi0gICAgICAgIGJlZm9yZSA9IGdldHJlZmNvdW50KGFycmF5KQotICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0cmVmY291bnQoYXJyYXkpLCBiZWZvcmUgKyAxKQotICAgICAgICBkZWwgcHRyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldHJlZmNvdW50KGFycmF5KSwgYmVmb3JlKQorICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgorICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgY19pbnQoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBwWzJdID0gOTYKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIGNfaW50KCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CmluZGV4IDczMThmMjkuLjgwYjZjYTIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5CkBAIC02MSw2ICs2MSw4IEBACiAgICAgICAgIHIudWwueCA9IDIyCiAgICAgICAgIHIudWwueSA9IDQ0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHIuX29iamVjdHMsIHsnMCc6IHt9fSkKKyAgICAgICAgci5sciA9IFBPSU5UKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5fb2JqZWN0cywgeycwJzoge30sICcxJzoge319KQogCiBjbGFzcyBBcnJheVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jaW50X2FycmF5KHNlbGYpOgpAQCAtODYsOSArODgsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5fb2JqZWN0cywgeycxJzoge319KQogCiBjbGFzcyBQb2ludGVyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiBYX3Rlc3RfcF9jaW50KHNlbGYpOgotICAgICAgICB4ID0gcG9pbnRlcihjX2ludCg0MikpCi0gICAgICAgIHByaW50IHguX29iamVjdHMKKyAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CisgICAgICAgIGkgPSBjX2ludCg0MikKKyAgICAgICAgeCA9IHBvaW50ZXIoaSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIFhfdGVzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CmluZGV4IDQ1NTg1YWUuLjI4YzgzZmQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQpAQCAtOSwxOCArOSwxMCBAQAogICAgIGxpYmNfbmFtZSA9ICJtc3ZjcnQiCiBlbGlmIG9zLm5hbWUgPT0gImNlIjoKICAgICBsaWJjX25hbWUgPSAiY29yZWRsbCIKLWVsaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotICAgIGxpYmNfbmFtZSA9ICJsaWJjLmR5bGliIgogZWxpZiBzeXMucGxhdGZvcm0gPT0gImN5Z3dpbiI6CiAgICAgbGliY19uYW1lID0gImN5Z3dpbjEuZGxsIgogZWxzZToKLSAgICBmb3IgbGluZSBpbiBvcy5wb3BlbigibGRkICVzIiAlIHN5cy5leGVjdXRhYmxlKToKLSAgICAgICAgaWYgImxpYmMuc28iIGluIGxpbmU6Ci0gICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIm9wZW5ic2QzIjoKLSAgICAgICAgICAgICAgICBsaWJjX25hbWUgPSBsaW5lLnNwbGl0KClbNF0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbGliY19uYW1lID0gbGluZS5zcGxpdCgpWzJdCi0gICAgICAgICAgICBicmVhaworICAgIGxpYmNfbmFtZSA9IGZpbmRfbGlicmFyeSgiYyIpCiAKIGlmIGlzX3Jlc291cmNlX2VuYWJsZWQoInByaW50aW5nIik6CiAgICAgcHJpbnQgImxpYmNfbmFtZSBpcyIsIGxpYmNfbmFtZQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfb2JqZWN0cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5MjFkMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X29iamVjdHMucHkKQEAgLTAsMCArMSw3MCBAQAorcicnJworVGhpcyB0ZXN0cyB0aGUgJ19vYmplY3RzJyBhdHRyaWJ1dGUgb2YgY3R5cGVzIGluc3RhbmNlcy4gICdfb2JqZWN0cycKK2hvbGRzIHJlZmVyZW5jZXMgdG8gb2JqZWN0cyB0aGF0IG11c3QgYmUga2VwdCBhbGl2ZSBhcyBsb25nIGFzIHRoZQorY3R5cGVzIGluc3RhbmNlLCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbWVtb3J5IGJ1ZmZlciBpcyB2YWxpZC4KKworV0FSTklORzogVGhlICdfb2JqZWN0cycgYXR0cmlidXRlIGlzIGV4cG9zZWQgT05MWSBmb3IgZGVidWdnaW5nIGN0eXBlcyBpdHNlbGYsCitpdCBNVVNUIE5FVkVSIEJFIE1PRElGSUVEIQorCisnX29iamVjdHMnIGlzIGluaXRpYWxpemVkIHRvIGEgZGljdGlvbmFyeSBvbiBmaXJzdCB1c2UsIGJlZm9yZSB0aGF0IGl0CitpcyBOb25lLgorCitIZXJlIGlzIGFuIGFycmF5IG9mIHN0cmluZyBwb2ludGVyczoKKworPj4+IGZyb20gY3R5cGVzIGltcG9ydCAqCis+Pj4gYXJyYXkgPSAoY19jaGFyX3AgKiA1KSgpCis+Pj4gcHJpbnQgYXJyYXkuX29iamVjdHMKK05vbmUKKz4+PgorCitUaGUgbWVtb3J5IGJsb2NrIHN0b3JlcyBwb2ludGVycyB0byBzdHJpbmdzLCBhbmQgdGhlIHN0cmluZ3MgaXRzZWxmCithc3NpZ25lZCBmcm9tIFB5dGhvbiBtdXN0IGJlIGtlcHQuCisKKz4+PiBhcnJheVs0XSA9ICdmb28gYmFyJworPj4+IGFycmF5Ll9vYmplY3RzCit7JzQnOiAnZm9vIGJhcid9Cis+Pj4gYXJyYXlbNF0KKydmb28gYmFyJworPj4+CisKK0l0IGdldHMgbW9yZSBjb21wbGljYXRlZCB3aGVuIHRoZSBjdHlwZXMgaW5zdGFuY2UgaXRzZWxmIGlzIGNvbnRhaW5lZAoraW4gYSAnYmFzZScgb2JqZWN0LgorCis+Pj4gY2xhc3MgWChTdHJ1Y3R1cmUpOgorLi4uICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KSwgKCJhcnJheSIsIGNfY2hhcl9wICogNSldCisuLi4KKz4+PiB4ID0gWCgpCis+Pj4gcHJpbnQgeC5fb2JqZWN0cworTm9uZQorPj4+CisKK1RoZSdhcnJheScgYXR0cmlidXRlIG9mIHRoZSAneCcgb2JqZWN0IHNoYXJlcyBwYXJ0IG9mIHRoZSBtZW1vcnkgYnVmZmVyCitvZiAneCcgKCdfYl9iYXNlXycgaXMgZWl0aGVyIE5vbmUsIG9yIHRoZSByb290IG9iamVjdCBvd25pbmcgdGhlIG1lbW9yeSBibG9jayk6CisKKz4+PiBwcmludCB4LmFycmF5Ll9iX2Jhc2VfICMgZG9jdGVzdDogK0VMTElQU0lTCis8Y3R5cGVzLnRlc3QudGVzdF9vYmplY3RzLlggb2JqZWN0IGF0IDB4Li4uPgorPj4+CisKKz4+PiB4LmFycmF5WzBdID0gJ3NwYW0gc3BhbSBzcGFtJworPj4+IHguX29iamVjdHMKK3snMDoyJzogJ3NwYW0gc3BhbSBzcGFtJ30KKz4+PiB4LmFycmF5Ll9iX2Jhc2VfLl9vYmplY3RzCit7JzA6Mic6ICdzcGFtIHNwYW0gc3BhbSd9Cis+Pj4KKworJycnCisKK2ltcG9ydCB1bml0dGVzdCwgZG9jdGVzdCwgc3lzCisKK2ltcG9ydCBjdHlwZXMudGVzdC50ZXN0X29iamVjdHMKKworY2xhc3MgVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGlmIHN5cy5oZXh2ZXJzaW9uID4gMHgwMjA0MDAwMDoKKyAgICAgICAgIyBQeXRob24gMi4zIGhhcyBubyBFTExJUFNJUyBmbGFnLCBzbyB3ZSBkb24ndCB0ZXN0IHdpdGggdGhpcworICAgICAgICAjIHZlcnNpb246CisgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgorICAgICAgICAgICAgZG9jdGVzdC50ZXN0bW9kKGN0eXBlcy50ZXN0LnRlc3Rfb2JqZWN0cykKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpZiBzeXMuaGV4dmVyc2lvbiA+IDB4MDIwNDAwMDA6CisgICAgICAgIGRvY3Rlc3QudGVzdG1vZChjdHlwZXMudGVzdC50ZXN0X29iamVjdHMpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCA5NTM3NDAwLi4xYjdmMGRjIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTE0Nyw2ICsxNDcsNDEgQEAKICMjICAgIGRlZiB0ZXN0X3BlcmZvcm1hbmNlKHNlbGYpOgogIyMgICAgICAgIGNoZWNrX3BlcmYoKQogCisgICAgZGVmIHRlc3Rfbm9jdHlwZXNfYXJndHlwZShzZWxmKToKKyAgICAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAorICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgQ0RMTCwgY192b2lkX3AsIEFyZ3VtZW50RXJyb3IKKworICAgICAgICBmdW5jID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKKyAgICAgICAgZnVuYy5yZXN0eXBlID0gY192b2lkX3AKKyAgICAgICAgIyBUeXBlRXJyb3I6IGhhcyBubyBmcm9tX3BhcmFtIG1ldGhvZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGZ1bmMsICJhcmd0eXBlcyIsIChvYmplY3QsKSkKKworICAgICAgICBjbGFzcyBBZGFwdGVyKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgZnJvbV9wYXJhbShjbHMsIG9iaik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMob2JqZWN0KCkpLCBOb25lKQorCisgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKKyAgICAgICAgICAgICAgICByZXR1cm4gb2JqCisKKyAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQorICAgICAgICAjIGRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgcGFyYW1ldGVyIDEKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgb2JqZWN0KCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoY192b2lkX3AoNDIpKSwgNDIpCisKKyAgICAgICAgY2xhc3MgQWRhcHRlcihvYmplY3QpOgorICAgICAgICAgICAgZGVmIGZyb21fcGFyYW0oY2xzLCBvYmopOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3Iob2JqKQorCisgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoQWRhcHRlcigpLCkKKyAgICAgICAgIyBBcmd1bWVudEVycm9yOiBhcmd1bWVudCAxOiBWYWx1ZUVycm9yOiA5OQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCA5OSkKKworCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wb2ludGVycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CmluZGV4IGE3YTI4MDIuLjU4NjY1NWEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5CkBAIC0xNTcsNiArMTU3LDIzIEBACiAgICAgICAgIHEgPSBwb2ludGVyKHkpCiAgICAgICAgIHBwWzBdID0gcSAgICAgICAgICMgPD09CiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMF0sIDYpCisgICAgZGVmIHRlc3RfY192b2lkX3Aoc2VsZik6CisgICAgICAgICMgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhaWQ9MTUxODE5MCZncm91cF9pZD01NDcwJmF0aWQ9MTA1NDcwCisgICAgICAgIGlmIHNpemVvZihjX3ZvaWRfcCkgPT0gNDoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorICAgICAgICBlbGlmIHNpemVvZihjX3ZvaWRfcCkgPT0gODoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkZMKQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3AoLTEpLnZhbHVlKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY192b2lkX3AsIDMuMTQpICMgbWFrZSBzdXJlIGZsb2F0cyBhcmUgTk9UIGFjY2VwdGVkCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY192b2lkX3AsIG9iamVjdCgpKSAjIG5vciBvdGhlciBvYmplY3RzCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQppbmRleCAwOGM4MTFlLi41MTFjM2QzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0c2xpY2UsIGEsIDAsIDUsIHJhbmdlKDMyKSkKIAogICAgIGRlZiB0ZXN0X2NoYXJfcHRyKHNlbGYpOgotICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCisgICAgICAgIHMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiCiAKICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19jaGFyKQpAQCAtNTAsOSArNTAsMzEgQEAKIAogICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfYnl0ZSkKICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKS0xXSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKV0sIHJhbmdlKG9yZCgiYSIpLCBvcmQoInoiKSsxKSkKICAgICAgICAgZGxsLm15X2ZyZWUocmVzKQogCisgICAgZGVmIHRlc3RfY2hhcl9wdHJfd2l0aF9mcmVlKHNlbGYpOgorICAgICAgICBkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKKyAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIKKworICAgICAgICBjbGFzcyBhbGxvY2F0ZWRfY19jaGFyX3AoY19jaGFyX3ApOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRsbC5teV9mcmVlLnJlc3R5cGUgPSBOb25lCisgICAgICAgIGRlZiBlcnJjaGVjayhyZXN1bHQsIGZ1bmMsIGFyZ3MpOgorICAgICAgICAgICAgcmV0dmFsID0gcmVzdWx0LnZhbHVlCisgICAgICAgICAgICBkbGwubXlfZnJlZShyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmV0dmFsCisKKyAgICAgICAgZGxsLm15X3N0cmR1cC5yZXN0eXBlID0gYWxsb2NhdGVkX2NfY2hhcl9wCisgICAgICAgIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sgPSBlcnJjaGVjaworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIHMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkZWwgZGxsLm15X3N0cmR1cC5lcnJjaGVjaworCisKICAgICBkZWYgdGVzdF9jaGFyX2FycmF5KHNlbGYpOgogICAgICAgICBzID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6XDAiCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CmluZGV4IDQ5ZjA2NGIuLjhhNDUzMWQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQpAQCAtMTM4LDggKzEzOCw4IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5Ci0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgueCwgInNpemUiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJvZmZzZXQiLCA5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKFR5cGVFcnJvciwgQXR0cmlidXRlRXJyb3IpLCBzZXRhdHRyLCBYLngsICJzaXplIiwgOTIpCiAKICAgICAgICAgY2xhc3MgWChVbmlvbik6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksCkBAIC0xNTIsOCArMTUyLDggQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC55LnNpemUsIHNpemVvZihjX2NoYXIpKQogCiAgICAgICAgICMgcmVhZG9ubHkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgueCwgIm9mZnNldCIsIDkyKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgWC54LCAic2l6ZSIsIDkyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIHNldGF0dHIsIFgueCwgIm9mZnNldCIsIDkyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygoVHlwZUVycm9yLCBBdHRyaWJ1dGVFcnJvciksIHNldGF0dHIsIFgueCwgInNpemUiLCA5MikKIAogICAgICAgICAjIFhYWCBTaG91bGQgd2UgY2hlY2sgbmVzdGVkIGRhdGEgdHlwZXMgYWxzbz8KICAgICAgICAgIyBvZmZzZXQgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBjbGFzcy4uLgpAQCAtMjk4LDcgKzI5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RyaW5nIG9yIFVuaWNvZGUgb2JqZWN0LCBpbnQgZm91bmQiKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgVHlwZUVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSBleGNlcHRpb25zLlR5cGVFcnJvcjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKCJhIiwgImIiLCAiYyIpKQpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5WYWx1ZUVycm9yJz46IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csICIoUGhvbmUpIFZhbHVlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChtc2csICIoUGhvbmUpIGV4Y2VwdGlvbnMuVmFsdWVFcnJvcjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKIAogCiAgICAgZGVmIGdldF9leGNlcHQoc2VsZiwgZnVuYywgKmFyZ3MpOgpAQCAtMzcxLDUgKzM3MSwxNSBAQAogICAgICAgICBpdGVtcyA9IFtzLmFycmF5W2ldIGZvciBpIGluIHJhbmdlKDMpXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpdGVtcywgWzEsIDIsIDNdKQogCisgICAgZGVmIHRlc3Rfbm9uZV90b19wb2ludGVyX2ZpZWxkcyhzZWxmKToKKyAgICAgICAgY2xhc3MgUyhTdHJ1Y3R1cmUpOgorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJwIiwgUE9JTlRFUihjX2ludCkpXQorCisgICAgICAgIHMgPSBTKCkKKyAgICAgICAgcy54ID0gMTIzNDU2NzgKKyAgICAgICAgcy5wID0gTm9uZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLngsIDEyMzQ1Njc4KQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmQyMzIzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkKQEAgLTAsMCArMSw1MCBAQAorZnJvbSBjdHlwZXMgaW1wb3J0ICoKK2ltcG9ydCB1bml0dGVzdAorCitjbGFzcyBWYXJTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfcmVzaXplKHNlbGYpOgorICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgICAgICBfZmllbGRzXyA9IFsoIml0ZW0iLCBjX2ludCksCisgICAgICAgICAgICAgICAgICAgICAgICAoImFycmF5IiwgY19pbnQgKiAxKV0KKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQorICAgICAgICB4ID0gWCgpCisgICAgICAgIHguaXRlbSA9IDQyCisgICAgICAgIHguYXJyYXlbMF0gPSAxMDAKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBzaXplb2YoY19pbnQpICogMikKKworICAgICAgICAjIG1ha2Ugcm9vbSBmb3Igb25lIGFkZGl0aW9uYWwgaXRlbQorICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiAxCisgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKworICAgICAgICAjIG1ha2Ugcm9vbSBmb3IgMTAgYWRkaXRpb25hbCBpdGVtcworICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiA5CisgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKworICAgICAgICAjIG1ha2Ugcm9vbSBmb3Igb25lIGFkZGl0aW9uYWwgaXRlbQorICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiAxCisgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKworICAgIGRlZiB0ZXN0X2FycmF5X2ludmFsaWRfbGVuZ3RoKHNlbGYpOgorICAgICAgICAjIGNhbm5vdCBjcmVhdGUgYXJyYXlzIHdpdGggbm9uLXBvc2l0aXZlIHNpemUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogY19pbnQgKiAtMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogY19pbnQgKiAtMykKKworICAgIGRlZiB0ZXN0X3plcm9zaXplZF9hcnJheShzZWxmKToKKyAgICAgICAgYXJyYXkgPSAoY19pbnQgKiAwKSgpCisgICAgICAgICMgYWNjZXNzaW5nIGVsZW1lbnRzIG9mIHplcm8tc2l6ZWQgYXJyYXlzIHJhaXNlIEluZGV4RXJyb3IKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAwLCBOb25lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMSwgTm9uZSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIC0xKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfd2luMzIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQppbmRleCA4MjQ3ZDM3Li5kYjUzMGQzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weQpAQCAtMSw2ICsxLDcgQEAKICMgV2luZG93cyBzcGVjaWZpYyB0ZXN0cwogCiBmcm9tIGN0eXBlcyBpbXBvcnQgKgorZnJvbSBjdHlwZXMudGVzdCBpbXBvcnQgaXNfcmVzb3VyY2VfZW5hYmxlZAogaW1wb3J0IHVuaXR0ZXN0LCBzeXMKIAogaW1wb3J0IF9jdHlwZXNfdGVzdApAQCAtMzAsMTUgKzMxLDEwIEBACiAgICAgICAgICAgICAjIG9yIHdyb25nIGNhbGxpbmcgY29udmVudGlvbgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgSXNXaW5kb3csIE5vbmUpCiAKLSAgICAgICAgZGVmIHRlc3RfU0VIKHNlbGYpOgotICAgICAgICAgICAgIyBDYWxsIGZ1bmN0aW9ucyB3aXRoIGludmFsaWQgYXJndW1lbnRzLCBhbmQgbWFrZSBzdXJlIHRoYXQgYWNjZXNzIHZpb2xhdGlvbnMKLSAgICAgICAgICAgICMgYXJlIHRyYXBwZWQgYW5kIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICMKLSAgICAgICAgICAgICMgTm9ybWFsbHksIGluIGEgZGVidWcgYnVpbGQgb2YgdGhlIF9jdHlwZXMgZXh0ZW5zaW9uCi0gICAgICAgICAgICAjIG1vZHVsZSwgZXhjZXB0aW9ucyBhcmUgbm90IHRyYXBwZWQsIHNvIHdlIGNhbiBvbmx5IHJ1bgotICAgICAgICAgICAgIyB0aGlzIHRlc3QgaW4gYSByZWxlYXNlIGJ1aWxkLgotICAgICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIoc3lzLCAiZ2V0b2JqZWN0cyIpOgorICAgICAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJTRUgiKToKKyAgICAgICAgICAgIGRlZiB0ZXN0X1NFSChzZWxmKToKKyAgICAgICAgICAgICAgICAjIENhbGwgZnVuY3Rpb25zIHdpdGggaW52YWxpZCBhcmd1bWVudHMsIGFuZCBtYWtlIHN1cmUgdGhhdCBhY2Nlc3MgdmlvbGF0aW9ucworICAgICAgICAgICAgICAgICMgYXJlIHRyYXBwZWQgYW5kIHJhaXNlIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBLCAzMikKIAogY2xhc3MgU3RydWN0dXJlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3V0aWwucHkgYi9MaWIvY3R5cGVzL3V0aWwucHkKaW5kZXggZDc1NmMxYy4uMmVlMjk2OCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy91dGlsLnB5CisrKyBiL0xpYi9jdHlwZXMvdXRpbC5weQpAQCAtMSw1ICsxLDcgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGltcG9ydCBzeXMsIG9zCi1pbXBvcnQgY3R5cGVzCiAKICMgZmluZF9saWJyYXJ5KG5hbWUpIHJldHVybnMgdGhlIHBhdGhuYW1lIG9mIGEgbGlicmFyeSwgb3IgTm9uZS4KIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTQxLDE0ICs0MywxNyBAQAogCiBlbGlmIG9zLm5hbWUgPT0gInBvc2l4IjoKICAgICAjIEFuZHJlYXMgRGVnZXJ0J3MgZmluZCBmdW5jdGlvbnMsIHVzaW5nIGdjYywgL3NiaW4vbGRjb25maWcsIG9iamR1bXAKLSAgICBpbXBvcnQgcmUsIHRlbXBmaWxlCisgICAgaW1wb3J0IHJlLCB0ZW1wZmlsZSwgZXJybm8KIAogICAgIGRlZiBfZmluZExpYl9nY2MobmFtZSk6CiAgICAgICAgIGV4cHIgPSAnW15cKFwpXHNdKmxpYiVzXC5bXlwoXClcc10qJyAlIG5hbWUKKyAgICAgICAgZmRvdXQsIGNjb3V0ID0gdGVtcGZpbGUubWtzdGVtcCgpCisgICAgICAgIG9zLmNsb3NlKGZkb3V0KQogICAgICAgICBjbWQgPSAnaWYgdHlwZSBnY2MgJj4vZGV2L251bGw7IHRoZW4gQ0M9Z2NjOyBlbHNlIENDPWNjOyBmaTsnIFwKLSAgICAgICAgICAgICAgJyRDQyAtV2wsLXQgLW8gL2Rldi9udWxsIDI+JjEgLWwnICsgbmFtZQorICAgICAgICAgICAgICAnJENDIC1XbCwtdCAtbyAnICsgY2NvdXQgKyAnIDI+JjEgLWwnICsgbmFtZQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmZG91dCwgb3V0ZmlsZSA9ICB0ZW1wZmlsZS5ta3N0ZW1wKCkKKyAgICAgICAgICAgIG9zLmNsb3NlKGZkb3V0KQogICAgICAgICAgICAgZmQgPSBvcy5wb3BlbihjbWQpCiAgICAgICAgICAgICB0cmFjZSA9IGZkLnJlYWQoKQogICAgICAgICAgICAgZXJyID0gZmQuY2xvc2UoKQpAQCAtNTgsNiArNjMsMTEgQEAKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgogICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhjY291dCkKKyAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gIT0gZXJybm8uRU5PRU5UOgorICAgICAgICAgICAgICAgICAgICByYWlzZQogICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgdHJhY2UpCiAgICAgICAgIGlmIG5vdCByZXM6CiAgICAgICAgICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy93aW50eXBlcy5weSBiL0xpYi9jdHlwZXMvd2ludHlwZXMucHkKaW5kZXggOTJiNzlkMi4uOTc2ODIzMyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy93aW50eXBlcy5weQorKysgYi9MaWIvY3R5cGVzL3dpbnR5cGVzLnB5CkBAIC0xLDYwICsxLDExNyBAQAotIyBYWFggVGhpcyBtb2R1bGUgbmVlZHMgY2xlYW51cC4KKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuICMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAorIyBUaGUgbW9zdCB1c2VmdWwgd2luZG93cyBkYXRhdHlwZXMKIGZyb20gY3R5cGVzIGltcG9ydCAqCiAKLURXT1JEID0gY191bG9uZwotV09SRCA9IGNfdXNob3J0CiBCWVRFID0gY19ieXRlCitXT1JEID0gY191c2hvcnQKK0RXT1JEID0gY191bG9uZworCitXQ0hBUiA9IGNfd2NoYXIKK1VJTlQgPSBjX3VpbnQKKworRE9VQkxFID0gY19kb3VibGUKKworQk9PTEVBTiA9IEJZVEUKK0JPT0wgPSBjX2xvbmcKKworZnJvbSBjdHlwZXMgaW1wb3J0IF9TaW1wbGVDRGF0YQorY2xhc3MgVkFSSUFOVF9CT09MKF9TaW1wbGVDRGF0YSk6CisgICAgX3R5cGVfID0gInYiCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIiVzKCVyKSIgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sIHNlbGYudmFsdWUpCiAKIFVMT05HID0gY191bG9uZwogTE9ORyA9IGNfbG9uZwogCi1MQVJHRV9JTlRFR0VSID0gY19sb25nbG9uZwotVUxBUkdFX0lOVEVHRVIgPSBjX3Vsb25nbG9uZworIyBpbiB0aGUgd2luZG93cyBoZWFkZXIgZmlsZXMsIHRoZXNlIGFyZSBzdHJ1Y3R1cmVzLgorX0xBUkdFX0lOVEVHRVIgPSBMQVJHRV9JTlRFR0VSID0gY19sb25nbG9uZworX1VMQVJHRV9JTlRFR0VSID0gVUxBUkdFX0lOVEVHRVIgPSBjX3Vsb25nbG9uZwogCi0KLUhBTkRMRSA9IGNfdWxvbmcgIyBpbiB0aGUgaGVhZGVyIGZpbGVzOiB2b2lkICoKLQotSFdORCA9IEhBTkRMRQotSERDID0gSEFORExFCi1ITU9EVUxFID0gSEFORExFCi1ISU5TVEFOQ0UgPSBIQU5ETEUKLUhSR04gPSBIQU5ETEUKLUhUQVNLID0gSEFORExFCi1IS0VZID0gSEFORExFCi1IUEVOID0gSEFORExFCi1IR0RJT0JKID0gSEFORExFCi1ITUVOVSA9IEhBTkRMRQotCi1MQ0lEID0gRFdPUkQKK0xQQ09MRVNUUiA9IExQT0xFU1RSID0gT0xFU1RSID0gY193Y2hhcl9wCitMUENXU1RSID0gTFBXU1RSID0gY193Y2hhcl9wCitMUENTVFIgPSBMUFNUUiA9IGNfY2hhcl9wCiAKIFdQQVJBTSA9IGNfdWludAogTFBBUkFNID0gY19sb25nCiAKLUJPT0wgPSBjX2xvbmcKLVZBUklBTlRfQk9PTCA9IGNfc2hvcnQKK0FUT00gPSBXT1JECitMQU5HSUQgPSBXT1JECiAKLUxQQ09MRVNUUiA9IExQT0xFU1RSID0gT0xFU1RSID0gY193Y2hhcl9wCi1MUENXU1RSID0gTFBXU1RSID0gY193Y2hhcl9wCitDT0xPUlJFRiA9IERXT1JECitMR1JQSUQgPSBEV09SRAorTENUWVBFID0gRFdPUkQKIAotTFBDU1RSID0gTFBTVFIgPSBjX2NoYXJfcAorTENJRCA9IERXT1JECisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgSEFORExFIHR5cGVzCitIQU5ETEUgPSBjX3Vsb25nICMgaW4gdGhlIGhlYWRlciBmaWxlczogdm9pZCAqCisKK0hBQ0NFTCA9IEhBTkRMRQorSEJJVE1BUCA9IEhBTkRMRQorSEJSVVNIID0gSEFORExFCitIQ09MT1JTUEFDRSA9IEhBTkRMRQorSERDID0gSEFORExFCitIREVTSyA9IEhBTkRMRQorSERXUCA9IEhBTkRMRQorSEVOSE1FVEFGSUxFID0gSEFORExFCitIRk9OVCA9IEhBTkRMRQorSEdESU9CSiA9IEhBTkRMRQorSEdMT0JBTCA9IEhBTkRMRQorSEhPT0sgPSBIQU5ETEUKK0hJQ09OID0gSEFORExFCitISU5TVEFOQ0UgPSBIQU5ETEUKK0hLRVkgPSBIQU5ETEUKK0hLTCA9IEhBTkRMRQorSExPQ0FMID0gSEFORExFCitITUVOVSA9IEhBTkRMRQorSE1FVEFGSUxFID0gSEFORExFCitITU9EVUxFID0gSEFORExFCitITU9OSVRPUiA9IEhBTkRMRQorSFBBTEVUVEUgPSBIQU5ETEUKK0hQRU4gPSBIQU5ETEUKK0hSR04gPSBIQU5ETEUKK0hSU1JDID0gSEFORExFCitIU1RSID0gSEFORExFCitIVEFTSyA9IEhBTkRMRQorSFdJTlNUQSA9IEhBTkRMRQorSFdORCA9IEhBTkRMRQorU0NfSEFORExFID0gSEFORExFCitTRVJWSUNFX1NUQVRVU19IQU5ETEUgPSBIQU5ETEUKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBTb21lIGltcG9ydGFudCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMKIAogY2xhc3MgUkVDVChTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygibGVmdCIsIGNfbG9uZyksCiAgICAgICAgICAgICAgICAgKCJ0b3AiLCBjX2xvbmcpLAogICAgICAgICAgICAgICAgICgicmlnaHQiLCBjX2xvbmcpLAogICAgICAgICAgICAgICAgICgiYm90dG9tIiwgY19sb25nKV0KLVJFQ1RMID0gUkVDVAordGFnUkVDVCA9IF9SRUNUTCA9IFJFQ1RMID0gUkVDVAorCitjbGFzcyBfU01BTExfUkVDVChTdHJ1Y3R1cmUpOgorICAgIF9maWVsZHNfID0gWygnTGVmdCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnVG9wJywgY19zaG9ydCksCisgICAgICAgICAgICAgICAgKCdSaWdodCcsIGNfc2hvcnQpLAorICAgICAgICAgICAgICAgICgnQm90dG9tJywgY19zaG9ydCldCitTTUFMTF9SRUNUID0gX1NNQUxMX1JFQ1QKKworY2xhc3MgX0NPT1JEKFN0cnVjdHVyZSk6CisgICAgX2ZpZWxkc18gPSBbKCdYJywgY19zaG9ydCksCisgICAgICAgICAgICAgICAgKCdZJywgY19zaG9ydCldCiAKIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CiAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoInkiLCBjX2xvbmcpXQotUE9JTlRMID0gUE9JTlQKK3RhZ1BPSU5UID0gX1BPSU5UTCA9IFBPSU5UTCA9IFBPSU5UCiAKIGNsYXNzIFNJWkUoU3RydWN0dXJlKToKICAgICBfZmllbGRzXyA9IFsoImN4IiwgY19sb25nKSwKICAgICAgICAgICAgICAgICAoImN5IiwgY19sb25nKV0KLVNJWkVMID0gU0laRQordGFnU0laRSA9IFNJWkVMID0gU0laRQogCiBkZWYgUkdCKHJlZCwgZ3JlZW4sIGJsdWUpOgogICAgIHJldHVybiByZWQgKyAoZ3JlZW4gPDwgOCkgKyAoYmx1ZSA8PCAxNikKQEAgLTYyLDYgKzExOSw3IEBACiBjbGFzcyBGSUxFVElNRShTdHJ1Y3R1cmUpOgogICAgIF9maWVsZHNfID0gWygiZHdMb3dEYXRlVGltZSIsIERXT1JEKSwKICAgICAgICAgICAgICAgICAoImR3SGlnaERhdGVUaW1lIiwgRFdPUkQpXQorX0ZJTEVUSU1FID0gRklMRVRJTUUKIAogY2xhc3MgTVNHKFN0cnVjdHVyZSk6CiAgICAgX2ZpZWxkc18gPSBbKCJoV25kIiwgSFdORCksCkBAIC03MCw2ICsxMjgsNyBAQAogICAgICAgICAgICAgICAgICgibFBhcmFtIiwgTFBBUkFNKSwKICAgICAgICAgICAgICAgICAoInRpbWUiLCBEV09SRCksCiAgICAgICAgICAgICAgICAgKCJwdCIsIFBPSU5UKV0KK3RhZ01TRyA9IE1TRwogTUFYX1BBVEggPSAyNjAKIAogY2xhc3MgV0lOMzJfRklORF9EQVRBQShTdHJ1Y3R1cmUpOgpAQCAtOTUsMyArMTU0LDE5IEBACiAgICAgICAgICAgICAgICAgKCJkd1Jlc2VydmVkMSIsIERXT1JEKSwKICAgICAgICAgICAgICAgICAoImNGaWxlTmFtZSIsIGNfd2NoYXIgKiBNQVhfUEFUSCksCiAgICAgICAgICAgICAgICAgKCJjQWx0ZXJuYW1lRmlsZU5hbWUiLCBjX3djaGFyICogMTQpXQorCitfX2FsbF9fID0gWydBVE9NJywgJ0JPT0wnLCAnQk9PTEVBTicsICdCWVRFJywgJ0NPTE9SUkVGJywgJ0RPVUJMRScsCisgICAgICAgICAgICdEV09SRCcsICdGSUxFVElNRScsICdIQUNDRUwnLCAnSEFORExFJywgJ0hCSVRNQVAnLCAnSEJSVVNIJywKKyAgICAgICAgICAgJ0hDT0xPUlNQQUNFJywgJ0hEQycsICdIREVTSycsICdIRFdQJywgJ0hFTkhNRVRBRklMRScsICdIRk9OVCcsCisgICAgICAgICAgICdIR0RJT0JKJywgJ0hHTE9CQUwnLCAnSEhPT0snLCAnSElDT04nLCAnSElOU1RBTkNFJywgJ0hLRVknLAorICAgICAgICAgICAnSEtMJywgJ0hMT0NBTCcsICdITUVOVScsICdITUVUQUZJTEUnLCAnSE1PRFVMRScsICdITU9OSVRPUicsCisgICAgICAgICAgICdIUEFMRVRURScsICdIUEVOJywgJ0hSR04nLCAnSFJTUkMnLCAnSFNUUicsICdIVEFTSycsICdIV0lOU1RBJywKKyAgICAgICAgICAgJ0hXTkQnLCAnTEFOR0lEJywgJ0xBUkdFX0lOVEVHRVInLCAnTENJRCcsICdMQ1RZUEUnLCAnTEdSUElEJywKKyAgICAgICAgICAgJ0xPTkcnLCAnTFBBUkFNJywgJ0xQQ09MRVNUUicsICdMUENTVFInLCAnTFBDV1NUUicsICdMUE9MRVNUUicsCisgICAgICAgICAgICdMUFNUUicsICdMUFdTVFInLCAnTUFYX1BBVEgnLCAnTVNHJywgJ09MRVNUUicsICdQT0lOVCcsCisgICAgICAgICAgICdQT0lOVEwnLCAnUkVDVCcsICdSRUNUTCcsICdSR0InLCAnU0NfSEFORExFJywKKyAgICAgICAgICAgJ1NFUlZJQ0VfU1RBVFVTX0hBTkRMRScsICdTSVpFJywgJ1NJWkVMJywgJ1NNQUxMX1JFQ1QnLCAnVUlOVCcsCisgICAgICAgICAgICdVTEFSR0VfSU5URUdFUicsICdVTE9ORycsICdWQVJJQU5UX0JPT0wnLCAnV0NIQVInLAorICAgICAgICAgICAnV0lOMzJfRklORF9EQVRBQScsICdXSU4zMl9GSU5EX0RBVEFXJywgJ1dPUkQnLCAnV1BBUkFNJywgJ19DT09SRCcsCisgICAgICAgICAgICdfRklMRVRJTUUnLCAnX0xBUkdFX0lOVEVHRVInLCAnX1BPSU5UTCcsICdfUkVDVEwnLCAnX1NNQUxMX1JFQ1QnLAorICAgICAgICAgICAnX1VMQVJHRV9JTlRFR0VSJywgJ3RhZ01TRycsICd0YWdQT0lOVCcsICd0YWdSRUNUJywgJ3RhZ1NJWkUnXQpkaWZmIC0tZ2l0IGEvTGliL2RpZmZsaWIucHkgYi9MaWIvZGlmZmxpYi5weQppbmRleCA1NWY2OWJhLi4zZTI4YjE4IDEwMDY0NAotLS0gYS9MaWIvZGlmZmxpYi5weQorKysgYi9MaWIvZGlmZmxpYi5weQpAQCAtODYsOCArODYsNyBAQAogICAgID4+PiBmb3IgYmxvY2sgaW4gcy5nZXRfbWF0Y2hpbmdfYmxvY2tzKCk6CiAgICAgLi4uICAgICBwcmludCAiYVslZF0gYW5kIGJbJWRdIG1hdGNoIGZvciAlZCBlbGVtZW50cyIgJSBibG9jawogICAgIGFbMF0gYW5kIGJbMF0gbWF0Y2ggZm9yIDggZWxlbWVudHMKLSAgICBhWzhdIGFuZCBiWzE3XSBtYXRjaCBmb3IgNiBlbGVtZW50cwotICAgIGFbMTRdIGFuZCBiWzIzXSBtYXRjaCBmb3IgMTUgZWxlbWVudHMKKyAgICBhWzhdIGFuZCBiWzE3XSBtYXRjaCBmb3IgMjEgZWxlbWVudHMKICAgICBhWzI5XSBhbmQgYlszOF0gbWF0Y2ggZm9yIDAgZWxlbWVudHMKIAogICAgIE5vdGUgdGhhdCB0aGUgbGFzdCB0dXBsZSByZXR1cm5lZCBieSAuZ2V0X21hdGNoaW5nX2Jsb2NrcygpIGlzIGFsd2F5cyBhCkBAIC0xMDEsOCArMTAwLDcgQEAKICAgICAuLi4gICAgIHByaW50ICIlNnMgYVslZDolZF0gYlslZDolZF0iICUgb3Bjb2RlCiAgICAgIGVxdWFsIGFbMDo4XSBiWzA6OF0KICAgICBpbnNlcnQgYVs4OjhdIGJbODoxN10KLSAgICAgZXF1YWwgYVs4OjE0XSBiWzE3OjIzXQotICAgICBlcXVhbCBhWzE0OjI5XSBiWzIzOjM4XQorICAgICBlcXVhbCBhWzg6MjldIGJbMTc6MzhdCiAKICAgICBTZWUgdGhlIERpZmZlciBjbGFzcyBmb3IgYSBmYW5jeSBodW1hbi1mcmllbmRseSBmaWxlIGRpZmZlcmVuY2VyLCB3aGljaAogICAgIHVzZXMgU2VxdWVuY2VNYXRjaGVyIGJvdGggdG8gY29tcGFyZSBzZXF1ZW5jZXMgb2YgbGluZXMsIGFuZCB0byBjb21wYXJlCkBAIC00NjEsNyArNDU5LDExIEBACiAKICAgICAgICAgRWFjaCB0cmlwbGUgaXMgb2YgdGhlIGZvcm0gKGksIGosIG4pLCBhbmQgbWVhbnMgdGhhdAogICAgICAgICBhW2k6aStuXSA9PSBiW2o6aituXS4gIFRoZSB0cmlwbGVzIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgaW4KLSAgICAgICAgaSBhbmQgaW4gai4KKyAgICAgICAgaSBhbmQgaW4gai4gIE5ldyBpbiBQeXRob24gMi41LCBpdCdzIGFsc28gZ3VhcmFudGVlZCB0aGF0IGlmCisgICAgICAgIChpLCBqLCBuKSBhbmQgKGknLCBqJywgbicpIGFyZSBhZGphY2VudCB0cmlwbGVzIGluIHRoZSBsaXN0LCBhbmQKKyAgICAgICAgdGhlIHNlY29uZCBpcyBub3QgdGhlIGxhc3QgdHJpcGxlIGluIHRoZSBsaXN0LCB0aGVuIGkrbiAhPSBpJyBvcgorICAgICAgICBqK24gIT0gaicuICBJT1csIGFkamFjZW50IHRyaXBsZXMgbmV2ZXIgZGVzY3JpYmUgYWRqYWNlbnQgZXF1YWwKKyAgICAgICAgYmxvY2tzLgogCiAgICAgICAgIFRoZSBsYXN0IHRyaXBsZSBpcyBhIGR1bW15LCAobGVuKGEpLCBsZW4oYiksIDApLCBhbmQgaXMgdGhlIG9ubHkKICAgICAgICAgdHJpcGxlIHdpdGggbj09MC4KQEAgLTQ3NSwyOCArNDc3LDUyIEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tYXRjaGluZ19ibG9ja3MKICAgICAgICAgbGEsIGxiID0gbGVuKHNlbGYuYSksIGxlbihzZWxmLmIpCiAKLSAgICAgICAgaW5kZXhlZF9ibG9ja3MgPSBbXQorICAgICAgICAjIFRoaXMgaXMgbW9zdCBuYXR1cmFsbHkgZXhwcmVzc2VkIGFzIGEgcmVjdXJzaXZlIGFsZ29yaXRobSwgYnV0CisgICAgICAgICMgYXQgbGVhc3Qgb25lIHVzZXIgYnVtcGVkIGludG8gZXh0cmVtZSB1c2UgY2FzZXMgdGhhdCBleGNlZWRlZAorICAgICAgICAjIHRoZSByZWN1cnNpb24gbGltaXQgb24gdGhlaXIgYm94LiAgU28sIG5vdyB3ZSBtYWludGFpbiBhIGxpc3QKKyAgICAgICAgIyAoJ3F1ZXVlYCkgb2YgYmxvY2tzIHdlIHN0aWxsIG5lZWQgdG8gbG9vayBhdCwgYW5kIGFwcGVuZCBwYXJ0aWFsCisgICAgICAgICMgcmVzdWx0cyB0byBgbWF0Y2hpbmdfYmxvY2tzYCBpbiBhIGxvb3A7IHRoZSBtYXRjaGVzIGFyZSBzb3J0ZWQKKyAgICAgICAgIyBhdCB0aGUgZW5kLgogICAgICAgICBxdWV1ZSA9IFsoMCwgbGEsIDAsIGxiKV0KKyAgICAgICAgbWF0Y2hpbmdfYmxvY2tzID0gW10KICAgICAgICAgd2hpbGUgcXVldWU6Ci0gICAgICAgICAgICAjIGJ1aWxkcyBsaXN0IG9mIG1hdGNoaW5nIGJsb2NrcyBjb3ZlcmluZyBhW2FsbzphaGldIGFuZAotICAgICAgICAgICAgIyBiW2JsbzpiaGldLCBhcHBlbmRpbmcgdGhlbSBpbiBpbmNyZWFzaW5nIG9yZGVyIHRvIGFuc3dlcgogICAgICAgICAgICAgYWxvLCBhaGksIGJsbywgYmhpID0gcXVldWUucG9wKCkKLQorICAgICAgICAgICAgaSwgaiwgayA9IHggPSBzZWxmLmZpbmRfbG9uZ2VzdF9tYXRjaChhbG8sIGFoaSwgYmxvLCBiaGkpCiAgICAgICAgICAgICAjIGFbYWxvOmldIHZzIGJbYmxvOmpdIHVua25vd24KICAgICAgICAgICAgICMgYVtpOmkra10gc2FtZSBhcyBiW2o6aitrXQogICAgICAgICAgICAgIyBhW2krazphaGldIHZzIGJbaitrOmJoaV0gdW5rbm93bgotICAgICAgICAgICAgaSwgaiwgayA9IHggPSBzZWxmLmZpbmRfbG9uZ2VzdF9tYXRjaChhbG8sIGFoaSwgYmxvLCBiaGkpCi0KLSAgICAgICAgICAgIGlmIGs6CisgICAgICAgICAgICBpZiBrOiAgICMgaWYgayBpcyAwLCB0aGVyZSB3YXMgbm8gbWF0Y2hpbmcgYmxvY2sKKyAgICAgICAgICAgICAgICBtYXRjaGluZ19ibG9ja3MuYXBwZW5kKHgpCiAgICAgICAgICAgICAgICAgaWYgYWxvIDwgaSBhbmQgYmxvIDwgajoKICAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChhbG8sIGksIGJsbywgaikpCi0gICAgICAgICAgICAgICAgaW5kZXhlZF9ibG9ja3MuYXBwZW5kKChpLCB4KSkKICAgICAgICAgICAgICAgICBpZiBpK2sgPCBhaGkgYW5kIGorayA8IGJoaToKICAgICAgICAgICAgICAgICAgICAgcXVldWUuYXBwZW5kKChpK2ssIGFoaSwgaitrLCBiaGkpKQotICAgICAgICBpbmRleGVkX2Jsb2Nrcy5zb3J0KCkKKyAgICAgICAgbWF0Y2hpbmdfYmxvY2tzLnNvcnQoKQogCi0gICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzID0gW2VsZW1bMV0gZm9yIGVsZW0gaW4gaW5kZXhlZF9ibG9ja3NdCi0gICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzLmFwcGVuZCggKGxhLCBsYiwgMCkgKQorICAgICAgICAjIEl0J3MgcG9zc2libGUgdGhhdCB3ZSBoYXZlIGFkamFjZW50IGVxdWFsIGJsb2NrcyBpbiB0aGUKKyAgICAgICAgIyBtYXRjaGluZ19ibG9ja3MgbGlzdCBub3cuICBTdGFydGluZyB3aXRoIDIuNSwgdGhpcyBjb2RlIHdhcyBhZGRlZAorICAgICAgICAjIHRvIGNvbGxhcHNlIHRoZW0uCisgICAgICAgIGkxID0gajEgPSBrMSA9IDAKKyAgICAgICAgbm9uX2FkamFjZW50ID0gW10KKyAgICAgICAgZm9yIGkyLCBqMiwgazIgaW4gbWF0Y2hpbmdfYmxvY2tzOgorICAgICAgICAgICAgIyBJcyB0aGlzIGJsb2NrIGFkamFjZW50IHRvIGkxLCBqMSwgazE/CisgICAgICAgICAgICBpZiBpMSArIGsxID09IGkyIGFuZCBqMSArIGsxID09IGoyOgorICAgICAgICAgICAgICAgICMgWWVzLCBzbyBjb2xsYXBzZSB0aGVtIC0tIHRoaXMganVzdCBpbmNyZWFzZXMgdGhlIGxlbmd0aCBvZgorICAgICAgICAgICAgICAgICMgdGhlIGZpcnN0IGJsb2NrIGJ5IHRoZSBsZW5ndGggb2YgdGhlIHNlY29uZCwgYW5kIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICMgYmxvY2sgc28gbGVuZ3RoZW5lZCByZW1haW5zIHRoZSBibG9jayB0byBjb21wYXJlIGFnYWluc3QuCisgICAgICAgICAgICAgICAgazEgKz0gazIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyBOb3QgYWRqYWNlbnQuICBSZW1lbWJlciB0aGUgZmlyc3QgYmxvY2sgKGsxPT0wIG1lYW5zIGl0J3MKKyAgICAgICAgICAgICAgICAjIHRoZSBkdW1teSB3ZSBzdGFydGVkIHdpdGgpLCBhbmQgbWFrZSB0aGUgc2Vjb25kIGJsb2NrIHRoZQorICAgICAgICAgICAgICAgICMgbmV3IGJsb2NrIHRvIGNvbXBhcmUgYWdhaW5zdC4KKyAgICAgICAgICAgICAgICBpZiBrMToKKyAgICAgICAgICAgICAgICAgICAgbm9uX2FkamFjZW50LmFwcGVuZCgoaTEsIGoxLCBrMSkpCisgICAgICAgICAgICAgICAgaTEsIGoxLCBrMSA9IGkyLCBqMiwgazIKKyAgICAgICAgaWYgazE6CisgICAgICAgICAgICBub25fYWRqYWNlbnQuYXBwZW5kKChpMSwgajEsIGsxKSkKKworICAgICAgICBub25fYWRqYWNlbnQuYXBwZW5kKCAobGEsIGxiLCAwKSApCisgICAgICAgIHNlbGYubWF0Y2hpbmdfYmxvY2tzID0gbm9uX2FkamFjZW50CiAgICAgICAgIHJldHVybiBzZWxmLm1hdGNoaW5nX2Jsb2NrcwogCiAgICAgZGVmIGdldF9vcGNvZGVzKHNlbGYpOgpAQCAtMTQyMiw4ICsxNDQ4LDcgQEAKICAgICAgICAgICAgICAgICBudW1fYmxhbmtzX3BlbmRpbmcgLT0gMQogICAgICAgICAgICAgICAgIHlpZWxkIF9tYWtlX2xpbmUobGluZXMsJy0nLDApLCBOb25lLCBUcnVlCiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCctLT8rJykgb3Igcy5zdGFydHN3aXRoKCctLSsnKSBvciBcCi0gICAgICAgICAgICAgICAgIHMuc3RhcnRzd2l0aCgnLSAnKToKKyAgICAgICAgICAgIGVsaWYgcy5zdGFydHN3aXRoKCgnLS0/KycsICctLSsnLCAnLSAnKSk6CiAgICAgICAgICAgICAgICAgIyBpbiBkZWxldGUgYmxvY2sgYW5kIHNlZSBhIGludHJhbGluZSBjaGFuZ2Ugb3IgdW5jaGFuZ2VkIGxpbmUKICAgICAgICAgICAgICAgICAjIGNvbWluZzogeWllbGQgdGhlIGRlbGV0ZSBsaW5lIGFuZCB0aGVuIGJsYW5rcwogICAgICAgICAgICAgICAgIGZyb21fbGluZSx0b19saW5lID0gX21ha2VfbGluZShsaW5lcywnLScsMCksIE5vbmUKQEAgLTE0NDcsNyArMTQ3Miw3IEBACiAgICAgICAgICAgICAgICAgbnVtX2JsYW5rc19wZW5kaW5nICs9IDEKICAgICAgICAgICAgICAgICB5aWVsZCBOb25lLCBfbWFrZV9saW5lKGxpbmVzLCcrJywxKSwgVHJ1ZQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgnKyAnKSBvciBzLnN0YXJ0c3dpdGgoJystJyk6CisgICAgICAgICAgICBlbGlmIHMuc3RhcnRzd2l0aCgoJysgJywgJystJykpOgogICAgICAgICAgICAgICAgICMgd2lsbCBiZSBsZWF2aW5nIGFuIGFkZCBibG9jazogeWllbGQgYmxhbmtzIHRoZW4gYWRkIGxpbmUKICAgICAgICAgICAgICAgICBmcm9tX2xpbmUsIHRvX2xpbmUgPSBOb25lLCBfbWFrZV9saW5lKGxpbmVzLCcrJywxKQogICAgICAgICAgICAgICAgIG51bV9ibGFua3NfdG9feWllbGQsbnVtX2JsYW5rc19wZW5kaW5nID0gbnVtX2JsYW5rc19wZW5kaW5nKzEsMApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weSBiL0xpYi9kaXN0dXRpbHMvX19pbml0X18ucHkKaW5kZXggYTFkYmI0Yi4uOWM2MGU1NCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9fX2luaXRfXy5weQorKysgYi9MaWIvZGlzdHV0aWxzL19faW5pdF9fLnB5CkBAIC0xMiw0ICsxMiw2IEBACiAKIF9fcmV2aXNpb25fXyA9ICIkSWQkIgogCi1fX3ZlcnNpb25fXyA9ICIyLjQuMCIKK2ltcG9ydCBzeXMKK19fdmVyc2lvbl9fID0gIiVkLiVkLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bOjNdCitkZWwgc3lzCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2JkaXN0X3JwbS5weQppbmRleCA3MzhlM2Y3Li41YjA5OTY1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYmRpc3RfcnBtLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9iZGlzdF9ycG0ucHkKQEAgLTQ2Nyw3ICs0NjcsOCBAQAogCiAgICAgICAgICMgcnBtIHNjcmlwdHMKICAgICAgICAgIyBmaWd1cmUgb3V0IGRlZmF1bHQgYnVpbGQgc2NyaXB0Ci0gICAgICAgIGRlZl9idWlsZCA9ICIlcyBzZXR1cC5weSBidWlsZCIgJSBzZWxmLnB5dGhvbgorICAgICAgICBkZWZfc2V0dXBfY2FsbCA9ICIlcyAlcyIgJSAoc2VsZi5weXRob24sb3MucGF0aC5iYXNlbmFtZShzeXMuYXJndlswXSkpCisgICAgICAgIGRlZl9idWlsZCA9ICIlcyBidWlsZCIgJSBkZWZfc2V0dXBfY2FsbAogICAgICAgICBpZiBzZWxmLnVzZV9ycG1fb3B0X2ZsYWdzOgogICAgICAgICAgICAgZGVmX2J1aWxkID0gJ2VudiBDRkxBR1M9IiRSUE1fT1BUX0ZMQUdTIiAnICsgZGVmX2J1aWxkCiAKQEAgLTQ4MSw5ICs0ODIsOSBAQAogICAgICAgICAgICAgKCdwcmVwJywgJ3ByZXBfc2NyaXB0JywgIiVzZXR1cCIpLAogICAgICAgICAgICAgKCdidWlsZCcsICdidWlsZF9zY3JpcHQnLCBkZWZfYnVpbGQpLAogICAgICAgICAgICAgKCdpbnN0YWxsJywgJ2luc3RhbGxfc2NyaXB0JywKLSAgICAgICAgICAgICAoIiVzIHNldHVwLnB5IGluc3RhbGwgIgorICAgICAgICAgICAgICgiJXMgaW5zdGFsbCAiCiAgICAgICAgICAgICAgICItLXJvb3Q9JFJQTV9CVUlMRF9ST09UICIKLSAgICAgICAgICAgICAgIi0tcmVjb3JkPUlOU1RBTExFRF9GSUxFUyIpICUgc2VsZi5weXRob24pLAorICAgICAgICAgICAgICAiLS1yZWNvcmQ9SU5TVEFMTEVEX0ZJTEVTIikgJSBkZWZfc2V0dXBfY2FsbCksCiAgICAgICAgICAgICAoJ2NsZWFuJywgJ2NsZWFuX3NjcmlwdCcsICJybSAtcmYgJFJQTV9CVUlMRF9ST09UIiksCiAgICAgICAgICAgICAoJ3ZlcmlmeXNjcmlwdCcsICd2ZXJpZnlfc2NyaXB0JywgTm9uZSksCiAgICAgICAgICAgICAoJ3ByZScsICdwcmVfaW5zdGFsbCcsIE5vbmUpLApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKaW5kZXggNGE5ZWQzOS4uNjdiYTA4MCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CkBAIC0xODUsNyArMTg1LDcgQEAKICAgICAgICAgICAgIGh0dHAuZW5kaGVhZGVycygpCiAgICAgICAgICAgICBodHRwLnNlbmQoYm9keSkKICAgICAgICAgZXhjZXB0IHNvY2tldC5lcnJvciwgZToKLSAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoZS5tc2csIGxvZy5FUlJPUikKKyAgICAgICAgICAgIHNlbGYuYW5ub3VuY2Uoc3RyKGUpLCBsb2cuRVJST1IpCiAgICAgICAgICAgICByZXR1cm4KIAogICAgICAgICByID0gaHR0cC5nZXRyZXNwb25zZSgpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL21zdmNjb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CmluZGV4IGQyNGQwYWMuLjBkNzI4MzcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvbXN2Y2NvbXBpbGVyLnB5CkBAIC0xMzEsOCArMTMxLDEwIEBACiAgICAgICAgICAgICAgICAgc2VsZi5zZXRfbWFjcm8oIkZyYW1ld29ya1NES0RpciIsIG5ldCwgInNka2luc3RhbGxyb290IikKICAgICAgICAgZXhjZXB0IEtleUVycm9yLCBleGM6ICMKICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1BsYXRmb3JtRXJyb3IsIFwKLSAgICAgICAgICAgICAgICAgICgiVGhlIC5ORVQgRnJhbWV3b3JrIFNESyBuZWVkcyB0byBiZSBpbnN0YWxsZWQgYmVmb3JlICIKLSAgICAgICAgICAgICAgICAgICAiYnVpbGRpbmcgZXh0ZW5zaW9ucyBmb3IgUHl0aG9uLiIpCisgICAgICAgICAgICAgICAgICAoIiIiUHl0aG9uIHdhcyBidWlsdCB3aXRoIFZpc3VhbCBTdHVkaW8gMjAwMzsKK2V4dGVuc2lvbnMgbXVzdCBiZSBidWlsdCB3aXRoIGEgY29tcGlsZXIgdGhhbiBjYW4gZ2VuZXJhdGUgY29tcGF0aWJsZSBiaW5hcmllcy4KK1Zpc3VhbCBTdHVkaW8gMjAwMyB3YXMgbm90IGZvdW5kIG9uIHRoaXMgc3lzdGVtLiBJZiB5b3UgaGF2ZSBDeWd3aW4gaW5zdGFsbGVkLAoreW91IGNhbiB0cnkgY29tcGlsaW5nIHdpdGggTWluZ1czMiwgYnkgcGFzc2luZyAiLWMgbWluZ3czMiIgdG8gc2V0dXAucHkuIiIiKQogCiAgICAgICAgIHAgPSByIlNvZnR3YXJlXE1pY3Jvc29mdFxORVQgRnJhbWV3b3JrIFNldHVwXFByb2R1Y3QiCiAgICAgICAgIGZvciBiYXNlIGluIEhLRVlTOgpAQCAtMjM3LDcgKzIzOSw3IEBACiAKICAgICBkZWYgaW5pdGlhbGl6ZShzZWxmKToKICAgICAgICAgc2VsZi5fX3BhdGhzID0gW10KLSAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCJNU1NkayIpIGFuZCBzZWxmLmZpbmRfZXhlKCJjbC5leGUiKToKKyAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCJESVNUVVRJTFNfVVNFX1NESyIpIGFuZCBvcy5lbnZpcm9uLmhhc19rZXkoIk1TU2RrIikgYW5kIHNlbGYuZmluZF9leGUoImNsLmV4ZSIpOgogICAgICAgICAgICAgIyBBc3N1bWUgdGhhdCB0aGUgU0RLIHNldCB1cCBldmVyeXRoaW5nIGFscmlnaHQ7IGRvbid0IHRyeSB0byBiZQogICAgICAgICAgICAgIyBzbWFydGVyCiAgICAgICAgICAgICBzZWxmLmNjID0gImNsLmV4ZSIKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKaW5kZXggZTEzOTdhMS4uNzZmZTI1NiAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKKysrIGIvTGliL2Rpc3R1dGlscy9zeXNjb25maWcucHkKQEAgLTUxMiw3ICs1MTIsNyBAQAogICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gKCdMREZMQUdTJywgJ0JBU0VDRkxBR1MnKToKICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgPSBfY29uZmlnX3ZhcnNba2V5XQogICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWFyY2hccytcdytccycsICcgJywgZmxhZ3MpCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzID0gcmUuc3ViKCctaXN5c3Jvb3QgW14gXHRdKiAnLCAnICcsIGZsYWdzKQorICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHJlLnN1YignLWlzeXNyb290IFteIFx0XSonLCAnICcsIGZsYWdzKQogICAgICAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNba2V5XSA9IGZsYWdzCiAKICAgICBpZiBhcmdzOgpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5IGIvTGliL2Rpc3R1dGlscy91bml4Y2NvbXBpbGVyLnB5CmluZGV4IDMyNDgxOWQuLjZjZDE0ZjcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdW5peGNjb21waWxlci5weQorKysgYi9MaWIvZGlzdHV0aWxzL3VuaXhjY29tcGlsZXIucHkKQEAgLTc4LDcgKzc4LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW5kZXggPSBjb21waWxlcl9zby5pbmRleCgnLWlzeXNyb290JykKICAgICAgICAgICAgICMgU3RyaXAgdGhpcyBhcmd1bWVudCBhbmQgdGhlIG5leHQgb25lOgotICAgICAgICAgICAgZGVsIGNvbXBpbGVyX3NvW2luZGV4OmluZGV4KzFdCisgICAgICAgICAgICBkZWwgY29tcGlsZXJfc29baW5kZXg6aW5kZXgrMl0KICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi9kb2N0ZXN0LnB5IGIvTGliL2RvY3Rlc3QucHkKaW5kZXggNDdiM2FhZS4uZmU3MzRiMyAxMDA2NDQKLS0tIGEvTGliL2RvY3Rlc3QucHkKKysrIGIvTGliL2RvY3Rlc3QucHkKQEAgLTk1LDcgKzk1LDcgQEAKIAogaW1wb3J0IF9fZnV0dXJlX18KIAotaW1wb3J0IHN5cywgdHJhY2ViYWNrLCBpbnNwZWN0LCBsaW5lY2FjaGUsIG9zLCByZSwgdHlwZXMKK2ltcG9ydCBzeXMsIHRyYWNlYmFjaywgaW5zcGVjdCwgbGluZWNhY2hlLCBvcywgcmUKIGltcG9ydCB1bml0dGVzdCwgZGlmZmxpYiwgcGRiLCB0ZW1wZmlsZQogaW1wb3J0IHdhcm5pbmdzCiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwpAQCAtODIxLDYgKzgyMSwxMSBAQAogICAgICAgICAjIFJlY3Vyc2l2ZWx5IGV4cG9yZSBgb2JqYCwgZXh0cmFjdGluZyBEb2NUZXN0cy4KICAgICAgICAgdGVzdHMgPSBbXQogICAgICAgICBzZWxmLl9maW5kKHRlc3RzLCBvYmosIG5hbWUsIG1vZHVsZSwgc291cmNlX2xpbmVzLCBnbG9icywge30pCisgICAgICAgICMgU29ydCB0aGUgdGVzdHMgYnkgYWxwaGEgb3JkZXIgb2YgbmFtZXMsIGZvciBjb25zaXN0ZW5jeSBpbgorICAgICAgICAjIHZlcmJvc2UtbW9kZSBvdXRwdXQuICBUaGlzIHdhcyBhIGZlYXR1cmUgb2YgZG9jdGVzdCBpbiBQeXRob25zCisgICAgICAgICMgPD0gMi4zIHRoYXQgZ290IGxvc3QgYnkgYWNjaWRlbnQgaW4gMi40LiAgSXQgd2FzIHJlcGFpcmVkIGluCisgICAgICAgICMgMi40LjQgYW5kIDIuNS4KKyAgICAgICAgdGVzdHMuc29ydCgpCiAgICAgICAgIHJldHVybiB0ZXN0cwogCiAgICAgZGVmIF9mcm9tX21vZHVsZShzZWxmLCBtb2R1bGUsIG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvZHVtbXlfdGhyZWFkLnB5IGIvTGliL2R1bW15X3RocmVhZC5weQppbmRleCAyMWZkMDNmLi5hNzJjOTI3IDEwMDY0NAotLS0gYS9MaWIvZHVtbXlfdGhyZWFkLnB5CisrKyBiL0xpYi9kdW1teV90aHJlYWQucHkKQEAgLTIwLDYgKzIwLDcgQEAKICAgICAgICAgICAgJ2ludGVycnVwdF9tYWluJywgJ0xvY2tUeXBlJ10KIAogaW1wb3J0IHRyYWNlYmFjayBhcyBfdHJhY2ViYWNrCitpbXBvcnQgd2FybmluZ3MKIAogY2xhc3MgZXJyb3IoRXhjZXB0aW9uKToKICAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuZXJyb3IuIiIiCkBAIC03NSw2ICs3NiwxMiBAQAogICAgICIiIkR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5hbGxvY2F0ZV9sb2NrKCkuIiIiCiAgICAgcmV0dXJuIExvY2tUeXBlKCkKIAorZGVmIHN0YWNrX3NpemUoc2l6ZT1Ob25lKToKKyAgICAiIiJEdW1teSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWQuc3RhY2tfc2l6ZSgpLiIiIgorICAgIGlmIHNpemUgaXMgbm90IE5vbmU6CisgICAgICAgIHJhaXNlIGVycm9yKCJzZXR0aW5nIHRocmVhZCBzdGFjayBzaXplIG5vdCBzdXBwb3J0ZWQiKQorICAgIHJldHVybiAwCisKIGNsYXNzIExvY2tUeXBlKG9iamVjdCk6CiAgICAgIiIiQ2xhc3MgaW1wbGVtZW50aW5nIGR1bW15IGltcGxlbWVudGF0aW9uIG9mIHRocmVhZC5Mb2NrVHlwZS4KIApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL19faW5pdF9fLnB5IGIvTGliL2VtYWlsL19faW5pdF9fLnB5CmluZGV4IGYwMTI2MGYuLjhkMjMwZmQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9fX2luaXRfXy5weQorKysgYi9MaWIvZW1haWwvX19pbml0X18ucHkKQEAgLTQsNyArNCw3IEBACiAKICIiIkEgcGFja2FnZSBmb3IgcGFyc2luZywgaGFuZGxpbmcsIGFuZCBnZW5lcmF0aW5nIGVtYWlsIG1lc3NhZ2VzLiIiIgogCi1fX3ZlcnNpb25fXyA9ICc0LjBhMicKK19fdmVyc2lvbl9fID0gJzQuMC4xJwogCiBfX2FsbF9fID0gWwogICAgICMgT2xkIG5hbWVzCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWVzc2FnZS5weSBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CmluZGV4IDUwZDkwYjQuLjc5YzVjNGMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9tZXNzYWdlLnB5CisrKyBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CkBAIC03NDcsNyArNzQ3LDE4IEBACiAgICAgICAgIGlmIGlzaW5zdGFuY2UoY2hhcnNldCwgdHVwbGUpOgogICAgICAgICAgICAgIyBSRkMgMjIzMSBlbmNvZGVkLCBzbyBkZWNvZGUgaXQsIGFuZCBpdCBiZXR0ZXIgZW5kIHVwIGFzIGFzY2lpLgogICAgICAgICAgICAgcGNoYXJzZXQgPSBjaGFyc2V0WzBdIG9yICd1cy1hc2NpaScKLSAgICAgICAgICAgIGNoYXJzZXQgPSB1bmljb2RlKGNoYXJzZXRbMl0sIHBjaGFyc2V0KS5lbmNvZGUoJ3VzLWFzY2lpJykKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIExvb2t1cEVycm9yIHdpbGwgYmUgcmFpc2VkIGlmIHRoZSBjaGFyc2V0IGlzbid0IGtub3duIHRvCisgICAgICAgICAgICAgICAgIyBQeXRob24uICBVbmljb2RlRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgdGhlIGVuY29kZWQgdGV4dAorICAgICAgICAgICAgICAgICMgY29udGFpbnMgYSBjaGFyYWN0ZXIgbm90IGluIHRoZSBjaGFyc2V0LgorICAgICAgICAgICAgICAgIGNoYXJzZXQgPSB1bmljb2RlKGNoYXJzZXRbMl0sIHBjaGFyc2V0KS5lbmNvZGUoJ3VzLWFzY2lpJykKKyAgICAgICAgICAgIGV4Y2VwdCAoTG9va3VwRXJyb3IsIFVuaWNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgY2hhcnNldCA9IGNoYXJzZXRbMl0KKyAgICAgICAgIyBjaGFyc2V0IGNoYXJhY3RlciBtdXN0IGJlIGluIHVzLWFzY2lpIHJhbmdlCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNoYXJzZXQgPSB1bmljb2RlKGNoYXJzZXQsICd1cy1hc2NpaScpLmVuY29kZSgndXMtYXNjaWknKQorICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKICAgICAgICAgIyBSRkMgMjA0NiwgJDQuMS4yIHNheXMgY2hhcnNldHMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZQogICAgICAgICByZXR1cm4gY2hhcnNldC5sb3dlcigpCiAKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CmluZGV4IGExOTdhMzYuLjEzODAxZGMgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQpAQCAtMzAwNSwyNiArMzAwNSw2NyBAQAogCiAnJycKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ05BTUUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTm9uZSwgTm9uZSwgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykpCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHBhcmFtLAorICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKIAogICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZShzZWxmKToKICAgICAgICAgbSA9ICcnJ1wKIENvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fbGFuZ3VhZ2Vfb3JfY2hhcnNldF9pbl9maWxlbmFtZV9lbmNvZGVkKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMD0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9wYXJ0bHlfbm9uZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKIFx0ZmlsZW5hbWUqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOwogXHRmaWxlbmFtZSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOwogXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgogCiAnJycKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXMgaXQgbm90LnBkZicpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKLVx0Ym91bmRhcnkqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOwotXHRib3VuZGFyeSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRib3VuZGFyeSowKj0iJydUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGJvdW5kYXJ5KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOwogXHRib3VuZGFyeSoyPSJpcyBpdCBub3QucGRmIgogCiAnJycKQEAgLTMwMzYsOCArMzA3Nyw4IEBACiAgICAgICAgICMgVGhpcyBpcyBhIG5vbnNlbnNpY2FsIGNoYXJzZXQgdmFsdWUsIGJ1dCB0ZXN0cyB0aGUgY29kZSBhbnl3YXkKICAgICAgICAgbSA9ICcnJ1wKIENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKLVx0Y2hhcnNldCowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7Ci1cdGNoYXJzZXQqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCowKj0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRjaGFyc2V0KjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOwogXHRjaGFyc2V0KjI9ImlzIGl0IG5vdC5wZGYiCiAKICcnJwpAQCAtMzA0NSwxNSArMzA4NiwxNDUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICd0aGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCiAKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9lbmNvZGluZ19pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImJvZ3VzJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9lbmNvZGluZ19pbl9jaGFyc2V0KHNlbGYpOgorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0Kj1ib2d1cycndXRmLTglRTIlODAlOUQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgIyBUaGlzIHNob3VsZCByZXR1cm4gTm9uZSBiZWNhdXNlIG5vbi1hc2NpaSBjaGFyYWN0ZXJzIGluIHRoZSBjaGFyc2V0CisgICAgICAgICMgYXJlIG5vdCBhbGxvd2VkLgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksIE5vbmUpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX2JhZF9jaGFyYWN0ZXJfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9YXNjaWknJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowKj0iYXNjaWkneHgnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMio9ImlzIGl0IG5vdC5wZGYlRTIiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHUnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGZcdWZmZmQnKQorCiAgICAgZGVmIHRlc3RfcmZjMjIzMV91bmtub3duX2VuY29kaW5nKHNlbGYpOgogICAgICAgICBtID0gIiIiXAogQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogOGJpdAotQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZSowPVgtVU5LTk9XTicnbXlmaWxlLnR4dAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZSo9WC1VTktOT1dOJydteWZpbGUudHh0CiAKICIiIgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLCAnbXlmaWxlLnR4dCcpCiAKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3NpbmdsZV90aWNrX2luX2ZpbGVuYW1lX2V4dGVuZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJGcmFuaydzXCI7IG5hbWUqMSo9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCBOb25lKQorICAgICAgICBlcShsYW5ndWFnZSwgTm9uZSkKKyAgICAgICAgZXEocywgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287IG5hbWUqMD1cIkZyYW5rJ3NcIjsgbmFtZSoxPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAiRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrX2V4dGVuZGVkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMSo9XCIgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFjayhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMD1cInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3NcIjsgbmFtZSoxPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAidXMtYXNjaWknZW4tdXMnRnJhbmsncyBEb2N1bWVudCIpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2V4dGVuZGVkX3ZhbHVlcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lPVwiRnJhbmsncyBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ25hbWUnKSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9lbmNvZGVkX3RoZW5fdW5lbmNvZGVkX3NlZ21lbnRzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC1mb287CitcdG5hbWUqMCo9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjE9XCIgRG9jdW1lbnRcIjsKK1x0bmFtZSoyKj1cIiBGb3IgWW91XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICdNeSBEb2N1bWVudCBGb3IgWW91JykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5lbmNvZGVkX3RoZW5fZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydNeVwiOworXHRuYW1lKjEqPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKIAogDAogZGVmIF90ZXN0Y2xhc3NlcygpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CmluZGV4IDk1ZDA2Y2IuLjMwZjM5YjkgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTMwMTEsMjYgKzMwMTEsNjcgQEAKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdOQU1FJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUsICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpKQorICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ05BTUUnKQorICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBwYXJhbSwKKyAgICAgICAgICAgICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWUoc2VsZik6CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSInJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fZmlsZW5hbWVfZW5jb2RlZChzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X2VuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjA9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRmaWxlbmFtZSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfcGFydGx5X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CiBcdGZpbGVuYW1lKjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKIFx0ZmlsZW5hbWUqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0ZmlsZW5hbWUqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzIGl0IG5vdC5wZGYnKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2JvdW5kYXJ5KHNlbGYpOgogICAgICAgICBtID0gJycnXAogQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvYWx0ZXJuYXRpdmU7Ci1cdGJvdW5kYXJ5KjA9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKLVx0Ym91bmRhcnkqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Ym91bmRhcnkqMCo9IicnVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Ym91bmRhcnkqMj0iaXMgaXQgbm90LnBkZiIKIAogJycnCkBAIC0zMDQyLDggKzMwODMsOCBAQAogICAgICAgICAjIFRoaXMgaXMgYSBub25zZW5zaWNhbCBjaGFyc2V0IHZhbHVlLCBidXQgdGVzdHMgdGhlIGNvZGUgYW55d2F5CiAgICAgICAgIG0gPSAnJydcCiBDb250ZW50LVR5cGU6IHRleHQvcGxhaW47Ci1cdGNoYXJzZXQqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOwotXHRjaGFyc2V0KjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGNoYXJzZXQqMCo9IlRoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0Y2hhcnNldCoxKj0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKIFx0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgogCiAnJycKQEAgLTMwNTEsMTUgKzMwOTIsMTQ1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAndGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7CitcdGZpbGVuYW1lKjAqPSJib2d1cyd4eCdUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjEqPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRmaWxlbmFtZSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfZW5jb2RpbmdfaW5fY2hhcnNldChzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldCo9Ym9ndXMnJ3V0Zi04JUUyJTgwJTlECisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgICMgVGhpcyBzaG91bGQgcmV0dXJuIE5vbmUgYmVjYXVzZSBub24tYXNjaWkgY2hhcmFjdGVycyBpbiB0aGUgY2hhcnNldAorICAgICAgICAjIGFyZSBub3QgYWxsb3dlZC4KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfY2hhcnNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9iYWRfY2hhcmFjdGVyX2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQqPWFzY2lpJyd1dGYtOCVFMiU4MCU5RAorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICAjIFRoaXMgc2hvdWxkIHJldHVybiBOb25lIGJlY2F1c2Ugbm9uLWFzY2lpIGNoYXJhY3RlcnMgaW4gdGhlIGNoYXJzZXQKKyAgICAgICAgIyBhcmUgbm90IGFsbG93ZWQuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X2NoYXJzZXQoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfYmFkX2NoYXJhY3Rlcl9pbl9maWxlbmFtZShzZWxmKToKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsKK1x0ZmlsZW5hbWUqMCo9ImFzY2lpJ3h4J1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwIjsKK1x0ZmlsZW5hbWUqMSo9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjIqPSJpcyBpdCBub3QucGRmJUUyIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmXHVmZmZkJykKKwogICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKICAgICAgICAgbSA9ICIiIlwKIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKLUNvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqMD1YLVVOS05PV04nJ215ZmlsZS50eHQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqPVgtVU5LTk9XTicnbXlmaWxlLnR4dAogCiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJ215ZmlsZS50eHQnKQogCisgICAgZGVmIHRlc3RfcmZjMjIzMV9zaW5nbGVfdGlja19pbl9maWxlbmFtZV9leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwiRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgTm9uZSkKKyAgICAgICAgZXEobGFuZ3VhZ2UsIE5vbmUpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfc2luZ2xlX3RpY2tfaW5fZmlsZW5hbWUoc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOyBuYW1lKjA9XCJGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnRnJhbmsnc1wiOyBuYW1lKjEqPVwiIERvY3VtZW50XCIKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKKyAgICAgICAgZXEoY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobGFuZ3VhZ2UsICdlbi11cycpCisgICAgICAgIGVxKHMsICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdGlja19hdHRhY2soc2VsZik6CisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjA9XCJ1cy1hc2NpaSdlbi11cydGcmFuaydzXCI7IG5hbWUqMT1cIiBEb2N1bWVudFwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgInVzLWFzY2lpJ2VuLXVzJ0ZyYW5rJ3MgRG9jdW1lbnQiKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19leHRlbmRlZF92YWx1ZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsgbmFtZT1cIkZyYW5rJ3MgRG9jdW1lbnRcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCduYW1lJyksICJGcmFuaydzIERvY3VtZW50IikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZW5jb2RlZF90aGVuX3VuZW5jb2RlZF9zZWdtZW50cyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAiIiJcCitDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtZm9vOworXHRuYW1lKjAqPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxPVwiIERvY3VtZW50XCI7CitcdG5hbWUqMio9XCIgRm9yIFlvdVwiCisKKyIiIgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCBzID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCisgICAgICAgIGVxKGNoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKGxhbmd1YWdlLCAnZW4tdXMnKQorICAgICAgICBlcShzLCAnTXkgRG9jdW1lbnQgRm9yIFlvdScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX3VuZW5jb2RlZF90aGVuX2VuY29kZWRfc2VnbWVudHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gIiIiXAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWZvbzsKK1x0bmFtZSowPVwidXMtYXNjaWknZW4tdXMnTXlcIjsKK1x0bmFtZSoxKj1cIiBEb2N1bWVudFwiOworXHRuYW1lKjIqPVwiIEZvciBZb3VcIgorCisiIiIKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgcyA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQorICAgICAgICBlcShjaGFyc2V0LCAndXMtYXNjaWknKQorICAgICAgICBlcShsYW5ndWFnZSwgJ2VuLXVzJykKKyAgICAgICAgZXEocywgJ015IERvY3VtZW50IEZvciBZb3UnKQorCiAKIAwKIGRlZiBfdGVzdGNsYXNzZXMoKToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC91dGlscy5weSBiL0xpYi9lbWFpbC91dGlscy5weQppbmRleCAyNTBlYjE5Li4yNmViYjBlIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvdXRpbHMucHkKKysrIGIvTGliL2VtYWlsL3V0aWxzLnB5CkBAIC0yNSw2ICsyNSw3IEBACiBpbXBvcnQgYmFzZTY0CiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgc29ja2V0CitpbXBvcnQgdXJsbGliCiBpbXBvcnQgd2FybmluZ3MKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCkBAIC00NSw2ICs0Niw3IEBACiBFTVBUWVNUUklORyA9ICcnCiBVRU1QVFlTVFJJTkcgPSB1JycKIENSTEYgPSAnXHJcbicKK1RJQ0sgPSAiJyIKIAogc3BlY2lhbHNyZSA9IHJlLmNvbXBpbGUocidbXVtcXCgpPD5ALDo7Ii5dJykKIGVzY2FwZXNyZSA9IHJlLmNvbXBpbGUocidbXVtcXCgpIl0nKQpAQCAtMjMwLDEyICsyMzIsMTQgQEAKICMgUkZDMjIzMS1yZWxhdGVkIGZ1bmN0aW9ucyAtIHBhcmFtZXRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKIGRlZiBkZWNvZGVfcmZjMjIzMShzKToKICAgICAiIiJEZWNvZGUgc3RyaW5nIGFjY29yZGluZyB0byBSRkMgMjIzMSIiIgotICAgIGltcG9ydCB1cmxsaWIKLSAgICBwYXJ0cyA9IHMuc3BsaXQoIiciLCAyKQotICAgIGlmIGxlbihwYXJ0cykgPT0gMToKLSAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUsIHVybGxpYi51bnF1b3RlKHMpCi0gICAgY2hhcnNldCwgbGFuZ3VhZ2UsIHMgPSBwYXJ0cwotICAgIHJldHVybiBjaGFyc2V0LCBsYW5ndWFnZSwgdXJsbGliLnVucXVvdGUocykKKyAgICBwYXJ0cyA9IHMuc3BsaXQoVElDSywgMikKKyAgICBpZiBsZW4ocGFydHMpIDw9IDI6CisgICAgICAgIHJldHVybiBOb25lLCBOb25lLCBzCisgICAgaWYgbGVuKHBhcnRzKSA+IDM6CisgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlID0gcGFydHNbOjJdCisgICAgICAgIHMgPSBUSUNLLmpvaW4ocGFydHNbMjpdKQorICAgICAgICByZXR1cm4gY2hhcnNldCwgbGFuZ3VhZ2UsIHMKKyAgICByZXR1cm4gcGFydHMKIAogCiBkZWYgZW5jb2RlX3JmYzIyMzEocywgY2hhcnNldD1Ob25lLCBsYW5ndWFnZT1Ob25lKToKQEAgLTI1OSwzNyArMjYzLDU0IEBACiBkZWYgZGVjb2RlX3BhcmFtcyhwYXJhbXMpOgogICAgICIiIkRlY29kZSBwYXJhbWV0ZXJzIGxpc3QgYWNjb3JkaW5nIHRvIFJGQyAyMjMxLgogCi0gICAgcGFyYW1zIGlzIGEgc2VxdWVuY2Ugb2YgMi10dXBsZXMgY29udGFpbmluZyAoY29udGVudCB0eXBlLCBzdHJpbmcgdmFsdWUpLgorICAgIHBhcmFtcyBpcyBhIHNlcXVlbmNlIG9mIDItdHVwbGVzIGNvbnRhaW5pbmcgKHBhcmFtIG5hbWUsIHN0cmluZyB2YWx1ZSkuCiAgICAgIiIiCisgICAgIyBDb3B5IHBhcmFtcyBzbyB3ZSBkb24ndCBtZXNzIHdpdGggdGhlIG9yaWdpbmFsCisgICAgcGFyYW1zID0gcGFyYW1zWzpdCiAgICAgbmV3X3BhcmFtcyA9IFtdCi0gICAgIyBtYXBzIHBhcmFtZXRlcidzIG5hbWUgdG8gYSBsaXN0IG9mIGNvbnRpbnVhdGlvbnMKKyAgICAjIE1hcCBwYXJhbWV0ZXIncyBuYW1lIHRvIGEgbGlzdCBvZiBjb250aW51YXRpb25zLiAgVGhlIHZhbHVlcyBhcmUgYQorICAgICMgMy10dXBsZSBvZiB0aGUgY29udGludWF0aW9uIG51bWJlciwgdGhlIHN0cmluZyB2YWx1ZSwgYW5kIGEgZmxhZworICAgICMgc3BlY2lmeWluZyB3aGV0aGVyIGEgcGFydGljdWxhciBzZWdtZW50IGlzICUtZW5jb2RlZC4KICAgICByZmMyMjMxX3BhcmFtcyA9IHt9Ci0gICAgIyBwYXJhbXMgaXMgYSBzZXF1ZW5jZSBvZiAyLXR1cGxlcyBjb250YWluaW5nIChjb250ZW50X3R5cGUsIHN0cmluZyB2YWx1ZSkKLSAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtc1swXQorICAgIG5hbWUsIHZhbHVlID0gcGFyYW1zLnBvcCgwKQogICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCB2YWx1ZSkpCi0gICAgIyBDeWNsZSB0aHJvdWdoIGVhY2ggb2YgdGhlIHJlc3Qgb2YgdGhlIHBhcmFtZXRlcnMuCi0gICAgZm9yIG5hbWUsIHZhbHVlIGluIHBhcmFtc1sxOl06CisgICAgd2hpbGUgcGFyYW1zOgorICAgICAgICBuYW1lLCB2YWx1ZSA9IHBhcmFtcy5wb3AoMCkKKyAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnKicpOgorICAgICAgICAgICAgZW5jb2RlZCA9IFRydWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGVuY29kZWQgPSBGYWxzZQogICAgICAgICB2YWx1ZSA9IHVucXVvdGUodmFsdWUpCiAgICAgICAgIG1vID0gcmZjMjIzMV9jb250aW51YXRpb24ubWF0Y2gobmFtZSkKICAgICAgICAgaWYgbW86CiAgICAgICAgICAgICBuYW1lLCBudW0gPSBtby5ncm91cCgnbmFtZScsICdudW0nKQogICAgICAgICAgICAgaWYgbnVtIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIG51bSA9IGludChudW0pCi0gICAgICAgICAgICByZmMyMjMxX3BhcmFtMSA9IHJmYzIyMzFfcGFyYW1zLnNldGRlZmF1bHQobmFtZSwgW10pCi0gICAgICAgICAgICByZmMyMjMxX3BhcmFtMS5hcHBlbmQoKG51bSwgdmFsdWUpKQorICAgICAgICAgICAgcmZjMjIzMV9wYXJhbXMuc2V0ZGVmYXVsdChuYW1lLCBbXSkuYXBwZW5kKChudW0sIHZhbHVlLCBlbmNvZGVkKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCAnIiVzIicgJSBxdW90ZSh2YWx1ZSkpKQogICAgIGlmIHJmYzIyMzFfcGFyYW1zOgogICAgICAgICBmb3IgbmFtZSwgY29udGludWF0aW9ucyBpbiByZmMyMjMxX3BhcmFtcy5pdGVtcygpOgogICAgICAgICAgICAgdmFsdWUgPSBbXQorICAgICAgICAgICAgZXh0ZW5kZWQgPSBGYWxzZQogICAgICAgICAgICAgIyBTb3J0IGJ5IG51bWJlcgogICAgICAgICAgICAgY29udGludWF0aW9ucy5zb3J0KCkKLSAgICAgICAgICAgICMgQW5kIG5vdyBhcHBlbmQgYWxsIHZhbHVlcyBpbiBudW0gb3JkZXIKLSAgICAgICAgICAgIGZvciBudW0sIGNvbnRpbnVhdGlvbiBpbiBjb250aW51YXRpb25zOgotICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChjb250aW51YXRpb24pCi0gICAgICAgICAgICBjaGFyc2V0LCBsYW5ndWFnZSwgdmFsdWUgPSBkZWNvZGVfcmZjMjIzMShFTVBUWVNUUklORy5qb2luKHZhbHVlKSkKLSAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKAotICAgICAgICAgICAgICAgIChuYW1lLCAoY2hhcnNldCwgbGFuZ3VhZ2UsICciJXMiJyAlIHF1b3RlKHZhbHVlKSkpKQorICAgICAgICAgICAgIyBBbmQgbm93IGFwcGVuZCBhbGwgdmFsdWVzIGluIG51bWVyaWNhbCBvcmRlciwgY29udmVydGluZworICAgICAgICAgICAgIyAlLWVuY29kaW5ncyBmb3IgdGhlIGVuY29kZWQgc2VnbWVudHMuICBJZiBhbnkgb2YgdGhlCisgICAgICAgICAgICAjIGNvbnRpbnVhdGlvbiBuYW1lcyBlbmRzIGluIGEgKiwgdGhlbiB0aGUgZW50aXJlIHN0cmluZywgYWZ0ZXIKKyAgICAgICAgICAgICMgZGVjb2Rpbmcgc2VnbWVudHMgYW5kIGNvbmNhdGVuYXRpbmcsIG11c3QgaGF2ZSB0aGUgY2hhcnNldCBhbmQKKyAgICAgICAgICAgICMgbGFuZ3VhZ2Ugc3BlY2lmaWVycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgICAgICAgICAgICBmb3IgbnVtLCBzLCBlbmNvZGVkIGluIGNvbnRpbnVhdGlvbnM6CisgICAgICAgICAgICAgICAgaWYgZW5jb2RlZDoKKyAgICAgICAgICAgICAgICAgICAgcyA9IHVybGxpYi51bnF1b3RlKHMpCisgICAgICAgICAgICAgICAgICAgIGV4dGVuZGVkID0gVHJ1ZQorICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChzKQorICAgICAgICAgICAgdmFsdWUgPSBxdW90ZShFTVBUWVNUUklORy5qb2luKHZhbHVlKSkKKyAgICAgICAgICAgIGlmIGV4dGVuZGVkOgorICAgICAgICAgICAgICAgIGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSA9IGRlY29kZV9yZmMyMjMxKHZhbHVlKQorICAgICAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCAoY2hhcnNldCwgbGFuZ3VhZ2UsICciJXMiJyAlIHZhbHVlKSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld19wYXJhbXMuYXBwZW5kKChuYW1lLCAnIiVzIicgJSB2YWx1ZSkpCiAgICAgcmV0dXJuIG5ld19wYXJhbXMKIAogZGVmIGNvbGxhcHNlX3JmYzIyMzFfdmFsdWUodmFsdWUsIGVycm9ycz0ncmVwbGFjZScsCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL21iY3MucHkgYi9MaWIvZW5jb2RpbmdzL21iY3MucHkKaW5kZXggZmY3N2ZkZS4uYmFmNDZjYiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9tYmNzLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvbWJjcy5weQpAQCAtNyw0MiArNywzOSBAQAogKGMpIENvcHlyaWdodCBDTlJJLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBOTyBXQVJSQU5UWS4KIAogIiIiCisjIEltcG9ydCB0aGVtIGV4cGxpY2l0bHkgdG8gY2F1c2UgYW4gSW1wb3J0RXJyb3IKKyMgb24gbm9uLVdpbmRvd3Mgc3lzdGVtcworZnJvbSBjb2RlY3MgaW1wb3J0IG1iY3NfZW5jb2RlLCBtYmNzX2RlY29kZQorIyBmb3IgSW5jcmVtZW50YWxEZWNvZGVyLCBJbmNyZW1lbnRhbEVuY29kZXIsIC4uLgogaW1wb3J0IGNvZGVjcwogCiAjIyMgQ29kZWMgQVBJcwogCi1jbGFzcyBDb2RlYyhjb2RlY3MuQ29kZWMpOgorZW5jb2RlID0gbWJjc19lbmNvZGUKIAotICAgICMgTm90ZTogQmluZGluZyB0aGVzZSBhcyBDIGZ1bmN0aW9ucyB3aWxsIHJlc3VsdCBpbiB0aGUgY2xhc3Mgbm90Ci0gICAgIyBjb252ZXJ0aW5nIHRoZW0gdG8gbWV0aG9kcy4gVGhpcyBpcyBpbnRlbmRlZC4KLSAgICBlbmNvZGUgPSBjb2RlY3MubWJjc19lbmNvZGUKLSAgICBkZWNvZGUgPSBjb2RlY3MubWJjc19kZWNvZGUKK2RlZiBkZWNvZGUoaW5wdXQsIGVycm9ycz0nc3RyaWN0Jyk6CisgICAgcmV0dXJuIG1iY3NfZGVjb2RlKGlucHV0LCBlcnJvcnMsIFRydWUpCiAKIGNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKICAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBjb2RlY3MubWJjc19lbmNvZGUoaW5wdXQsc2VsZi5lcnJvcnMpWzBdCisgICAgICAgIHJldHVybiBtYmNzX2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCiAKLWNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKLSAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBjb2RlY3MubWJjc19kZWNvZGUoaW5wdXQsc2VsZi5lcnJvcnMpWzBdCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgcGFzcworY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKGNvZGVjcy5CdWZmZXJlZEluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgX2J1ZmZlcl9kZWNvZGUgPSBtYmNzX2RlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgcGFzcworY2xhc3MgU3RyZWFtV3JpdGVyKGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGVuY29kZSA9IG1iY3NfZW5jb2RlCiAKLWNsYXNzIFN0cmVhbUNvbnZlcnRlcihTdHJlYW1Xcml0ZXIsU3RyZWFtUmVhZGVyKToKLQotICAgIGVuY29kZSA9IGNvZGVjcy5tYmNzX2RlY29kZQotICAgIGRlY29kZSA9IGNvZGVjcy5tYmNzX2VuY29kZQorY2xhc3MgU3RyZWFtUmVhZGVyKGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGRlY29kZSA9IG1iY3NfZGVjb2RlCiAKICMjIyBlbmNvZGluZ3MgbW9kdWxlIEFQSQogCiBkZWYgZ2V0cmVnZW50cnkoKToKICAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKICAgICAgICAgbmFtZT0nbWJjcycsCi0gICAgICAgIGVuY29kZT1Db2RlYy5lbmNvZGUsCi0gICAgICAgIGRlY29kZT1Db2RlYy5kZWNvZGUsCisgICAgICAgIGVuY29kZT1lbmNvZGUsCisgICAgICAgIGRlY29kZT1kZWNvZGUsCiAgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCiAgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCiAgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3B1bnljb2RlLnB5IGIvTGliL2VuY29kaW5ncy9wdW55Y29kZS5weQppbmRleCAyY2RlOGI5Li5kOTcyMDBmIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3B1bnljb2RlLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvcHVueWNvZGUucHkKQEAgLTIxNCw5ICsyMTQsOSBAQAogCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIoY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CiAgICAgZGVmIGRlY29kZShzZWxmLCBpbnB1dCwgZmluYWw9RmFsc2UpOgotICAgICAgICBpZiBlcnJvcnMgbm90IGluICgnc3RyaWN0JywgJ3JlcGxhY2UnLCAnaWdub3JlJyk6Ci0gICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJVbnN1cHBvcnRlZCBlcnJvciBoYW5kbGluZyAiK2Vycm9ycwotICAgICAgICByZXR1cm4gcHVueWNvZGVfZGVjb2RlKGlucHV0LCBlcnJvcnMpCisgICAgICAgIGlmIHNlbGYuZXJyb3JzIG5vdCBpbiAoJ3N0cmljdCcsICdyZXBsYWNlJywgJ2lnbm9yZScpOgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitzZWxmLmVycm9ycworICAgICAgICByZXR1cm4gcHVueWNvZGVfZGVjb2RlKGlucHV0LCBzZWxmLmVycm9ycykKIAogY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgogICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvdXRmXzhfc2lnLnB5IGIvTGliL2VuY29kaW5ncy91dGZfOF9zaWcucHkKaW5kZXggY2QxNGFiMC4uZjA1ZjZiOCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy91dGZfOF9zaWcucHkKKysrIGIvTGliL2VuY29kaW5ncy91dGZfOF9zaWcucHkKQEAgLTMwLDkgKzMwLDkgQEAKICAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CiAgICAgICAgIGlmIHNlbGYuZmlyc3Q6CiAgICAgICAgICAgICBzZWxmLmZpcnN0ID0gRmFsc2UKLSAgICAgICAgICAgIHJldHVybiBjb2RlY3MuQk9NX1VURjggKyBjb2RlY3MudXRmXzhfZW5jb2RlKGlucHV0LCBlcnJvcnMpWzBdCisgICAgICAgICAgICByZXR1cm4gY29kZWNzLkJPTV9VVEY4ICsgY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gY29kZWNzLnV0Zl84X2VuY29kZShpbnB1dCwgZXJyb3JzKVswXQorICAgICAgICAgICAgcmV0dXJuIGNvZGVjcy51dGZfOF9lbmNvZGUoaW5wdXQsIHNlbGYuZXJyb3JzKVswXQogCiAgICAgZGVmIHJlc2V0KHNlbGYpOgogICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyLnJlc2V0KHNlbGYpCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL3V1X2NvZGVjLnB5IGIvTGliL2VuY29kaW5ncy91dV9jb2RlYy5weQppbmRleCAwODc3ZmUxLi40M2ZiOTNjIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL3V1X2NvZGVjLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvdXVfY29kZWMucHkKQEAgLTEwMiwxMSArMTAyLDExIEBACiAKIGNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKICAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiB1dV9lbmNvZGUoaW5wdXQsIGVycm9ycylbMF0KKyAgICAgICAgcmV0dXJuIHV1X2VuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCiAKIGNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKICAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiB1dV9kZWNvZGUoaW5wdXQsIGVycm9ycylbMF0KKyAgICAgICAgcmV0dXJuIHV1X2RlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCiAKIGNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYyxjb2RlY3MuU3RyZWFtV3JpdGVyKToKICAgICBwYXNzCmRpZmYgLS1naXQgYS9MaWIvZ3ppcC5weSBiL0xpYi9nemlwLnB5CmluZGV4IDg2MGFjY2MuLjBiZjI5ZTggMTAwNjQ0Ci0tLSBhL0xpYi9nemlwLnB5CisrKyBiL0xpYi9nemlwLnB5CkBAIC0zMTUsNyArMzE1LDEzIEBACiAgICAgZGVmIGNsb3NlKHNlbGYpOgogICAgICAgICBpZiBzZWxmLm1vZGUgPT0gV1JJVEU6CiAgICAgICAgICAgICBzZWxmLmZpbGVvYmoud3JpdGUoc2VsZi5jb21wcmVzcy5mbHVzaCgpKQotICAgICAgICAgICAgd3JpdGUzMihzZWxmLmZpbGVvYmosIHNlbGYuY3JjKQorICAgICAgICAgICAgIyBUaGUgbmF0aXZlIHpsaWIgY3JjIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBidXQKKyAgICAgICAgICAgICMgdGhlIFB5dGhvbiB3cmFwcGVyIGltcGxpY2l0bHkgY2FzdHMgdGhhdCB0byBhIHNpZ25lZCBDCisgICAgICAgICAgICAjIGxvbmcuICBTbywgb24gYSAzMi1iaXQgYm94IHNlbGYuY3JjIG1heSAibG9vayBuZWdhdGl2ZSIsCisgICAgICAgICAgICAjIHdoaWxlIHRoZSBzYW1lIGNyYyBvbiBhIDY0LWJpdCBib3ggbWF5ICJsb29rIHBvc2l0aXZlIi4KKyAgICAgICAgICAgICMgVG8gYXZvaWQgaXJrc29tZSB3YXJuaW5ncyBmcm9tIHRoZSBgc3RydWN0YCBtb2R1bGUsIGZvcmNlCisgICAgICAgICAgICAjIGl0IHRvIGxvb2sgcG9zaXRpdmUgb24gYWxsIGJveGVzLgorICAgICAgICAgICAgd3JpdGUzMnUoc2VsZi5maWxlb2JqLCBMT1dVMzIoc2VsZi5jcmMpKQogICAgICAgICAgICAgIyBzZWxmLnNpemUgbWF5IGV4Y2VlZCAyR0IsIG9yIGV2ZW4gNEdCCiAgICAgICAgICAgICB3cml0ZTMydShzZWxmLmZpbGVvYmosIExPV1UzMihzZWxmLnNpemUpKQogICAgICAgICAgICAgc2VsZi5maWxlb2JqID0gTm9uZQpkaWZmIC0tZ2l0IGEvTGliL2h0dHBsaWIucHkgYi9MaWIvaHR0cGxpYi5weQppbmRleCAzNjM4MWRlLi41YWU1ZWZjIDEwMDY0NAotLS0gYS9MaWIvaHR0cGxpYi5weQorKysgYi9MaWIvaHR0cGxpYi5weQpAQCAtMyw3ICszLDcgQEAKIDxpbnRybyBzdHVmZiBnb2VzIGhlcmU+CiA8b3RoZXIgc3R1ZmYsIHRvbz4KIAotSFRUUENvbm5lY3Rpb24gZ28gdGhyb3VnaCBhIG51bWJlciBvZiAic3RhdGVzIiwgd2hpY2ggZGVmaW5lcyB3aGVuIGEgY2xpZW50CitIVFRQQ29ubmVjdGlvbiBnb2VzIHRocm91Z2ggYSBudW1iZXIgb2YgInN0YXRlcyIsIHdoaWNoIGRlZmluZSB3aGVuIGEgY2xpZW50CiBtYXkgbGVnYWxseSBtYWtlIGFub3RoZXIgcmVxdWVzdCBvciBmZXRjaCB0aGUgcmVzcG9uc2UgZm9yIGEgcGFydGljdWxhcgogcmVxdWVzdC4gVGhpcyBkaWFncmFtIGRldGFpbHMgdGhlc2Ugc3RhdGUgdHJhbnNpdGlvbnM6CiAKQEAgLTkyNiwxNSArOTI2LDE1IEBACiAgICAgICAgIHNlbGYuX19zdGF0ZSA9IF9DU19JRExFCiAKICAgICAgICAgaWYgcmVzcG9uc2Uud2lsbF9jbG9zZToKLSAgICAgICAgICAgICMgdGhpcyBlZmZlY3RpdmVseSBwYXNzZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIHJlc3BvbnNlCi0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKKyAgICAgICAgICAgICMgUGFzcyB0aGUgc29ja2V0IHRvIHRoZSByZXNwb25zZQorICAgICAgICAgICAgc2VsZi5zb2NrID0gTm9uZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyByZW1lbWJlciB0aGlzLCBzbyB3ZSBjYW4gdGVsbCB3aGVuIGl0IGlzIGNvbXBsZXRlCiAgICAgICAgICAgICBzZWxmLl9fcmVzcG9uc2UgPSByZXNwb25zZQogCiAgICAgICAgIHJldHVybiByZXNwb25zZQogCi0jIFRoZSBuZXh0IHNldmVyYWwgY2xhc3NlcyBhcmUgdXNlZCB0byBkZWZpbmUgRmFrZVNvY2tldCxhIHNvY2tldC1saWtlCisjIFRoZSBuZXh0IHNldmVyYWwgY2xhc3NlcyBhcmUgdXNlZCB0byBkZWZpbmUgRmFrZVNvY2tldCwgYSBzb2NrZXQtbGlrZQogIyBpbnRlcmZhY2UgdG8gYW4gU1NMIGNvbm5lY3Rpb24uCiAKICMgVGhlIHByaW1hcnkgY29tcGxleGl0eSBjb21lcyBmcm9tIGZha2luZyBhIG1ha2VmaWxlKCkgbWV0aG9kLiAgVGhlCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9CaW5kaW5ncy5weSBiL0xpYi9pZGxlbGliL0JpbmRpbmdzLnB5CmluZGV4IGI1ZTkwYjAuLmQyNGJlM2YgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0JpbmRpbmdzLnB5CisrKyBiL0xpYi9pZGxlbGliL0JpbmRpbmdzLnB5CkBAIC04MCw2ICs4MCwzMiBAQAogICAgXSksCiBdCiAKK2ltcG9ydCBzeXMKK2lmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJy5hcHAnIGluIHN5cy5leGVjdXRhYmxlOgorICAgICMgUnVubmluZyBhcyBhIHByb3BlciBNYWNPUyBhcHBsaWNhdGlvbiBidW5kbGUuIFRoaXMgYmxvY2sgcmVzdHJ1Y3R1cmVzCisgICAgIyB0aGUgbWVudXMgYSBsaXR0bGUgdG8gbWFrZSB0aGVtIGNvbmZvcm0gYmV0dGVyIHRvIHRoZSBISUcuCisKKyAgICBxdWl0SXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0xXQorICAgIGNsb3NlSXRlbSA9IG1lbnVkZWZzWzBdWzFdWy0yXQorCisgICAgIyBSZW1vdmUgdGhlIGxhc3QgMyBpdGVtcyBvZiB0aGUgZmlsZSBtZW51OiBhIHNlcGFyYXRvciwgY2xvc2Ugd2luZG93IGFuZAorICAgICMgcXVpdC4gQ2xvc2Ugd2luZG93IHdpbGwgYmUgcmVpbnNlcnRlZCBqdXN0IGFib3ZlIHRoZSBzYXZlIGl0ZW0sIHdoZXJlCisgICAgIyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRvIHRoZSBISUcuIFF1aXQgaXMgaW4gdGhlIGFwcGxpY2F0aW9uIG1lbnUuCisgICAgZGVsIG1lbnVkZWZzWzBdWzFdWy0zOl0KKyAgICBtZW51ZGVmc1swXVsxXS5pbnNlcnQoNiwgY2xvc2VJdGVtKQorCisgICAgIyBSZW1vdmUgdGhlICdBYm91dCcgZW50cnkgZnJvbSB0aGUgaGVscCBtZW51LCBpdCBpcyBpbiB0aGUgYXBwbGljYXRpb24KKyAgICAjIG1lbnUKKyAgICBkZWwgbWVudWRlZnNbLTFdWzFdWzA6Ml0KKworICAgIG1lbnVkZWZzLmluc2VydCgwLAorICAgICAgICAgICAgKCdhcHBsaWNhdGlvbicsIFsKKyAgICAgICAgICAgICAgICAoJ0Fib3V0IElETEUnLCAnPDxhYm91dC1pZGxlPj4nKSwKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICgnX1ByZWZlcmVuY2VzLi4uLicsICc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JyksCisgICAgICAgICAgICBdKSkKKworCiBkZWZhdWx0X2tleWRlZnMgPSBpZGxlQ29uZi5HZXRDdXJyZW50S2V5U2V0KCkKIAogZGVsIHN5cwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ1JFRElUUy50eHQgYi9MaWIvaWRsZWxpYi9DUkVESVRTLnR4dAppbmRleCA2ZjRlOTVkLi5lODM4YzAzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DUkVESVRTLnR4dAorKysgYi9MaWIvaWRsZWxpYi9DUkVESVRTLnR4dApAQCAtMTksMTcgKzE5LDE4IEBACiBzdWJwcm9jZXNzLCBhbmQgbWFkZSBhIG51bWJlciBvZiB1c2FiaWxpdHkgZW5oYW5jZW1lbnRzLgogCiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBSYXltb25kIEhldHRpbmdlciwgVG9ueSBMb3duZHMgKE1hYyBpbnRlZ3JhdGlvbiksCi1OZWFsIE5vcndpdHogKGNvZGUgY2hlY2sgYW5kIGNsZWFuLXVwKSwgYW5kIENodWkgVGV5IChSUEMgaW50ZWdyYXRpb24sIGRlYnVnZ2VyCi1pbnRlZ3JhdGlvbiBhbmQgcGVyc2lzdGVudCBicmVha3BvaW50cykuCitOZWFsIE5vcndpdHogKGNvZGUgY2hlY2sgYW5kIGNsZWFuLXVwKSwgUm9uYWxkIE91c3NvcmVuIChNYWMgaW50ZWdyYXRpb24pLAorTm9hbSBSYXBoYWVsIChDb2RlIENvbnRleHQsIENhbGwgVGlwcywgbWFueSBvdGhlciBwYXRjaGVzKSwgYW5kIENodWkgVGV5IChSUEMKK2ludGVncmF0aW9uLCBkZWJ1Z2dlciBpbnRlZ3JhdGlvbiBhbmQgcGVyc2lzdGVudCBicmVha3BvaW50cykuCiAKLVNjb3R0IERhdmlkIERhbmllbHMsIEhlcm5hbiBGb2ZmYW5pLCBDaHJpc3RvcyBHZW9yZ2lvdSwgTWFydGluIHYuIEz2d2lzLCAKLUphc29uIE9yZW5kb3JmZiwgTm9hbSBSYXBoYWVsLCBKb3NoIFJvYmIsIE5pZ2VsIFJvd2UsIEJydWNlIFNoZXJ3b29kLCBhbmQKLUplZmYgU2h1dGUgaGF2ZSBzdWJtaXR0ZWQgdXNlZnVsIHBhdGNoZXMuICBUaGFua3MsIGd1eXMhCitTY290dCBEYXZpZCBEYW5pZWxzLCBUYWwgRWluYXQsIEhlcm5hbiBGb2ZmYW5pLCBDaHJpc3RvcyBHZW9yZ2lvdSwKK01hcnRpbiB2LiBM9ndpcywgSmFzb24gT3JlbmRvcmZmLCBKb3NoIFJvYmIsIE5pZ2VsIFJvd2UsIEJydWNlIFNoZXJ3b29kLAorYW5kIEplZmYgU2h1dGUgaGF2ZSBzdWJtaXR0ZWQgdXNlZnVsIHBhdGNoZXMuICBUaGFua3MsIGd1eXMhCiAKIEZvciBhZGRpdGlvbmFsIGRldGFpbHMgcmVmZXIgdG8gTkVXUy50eHQgYW5kIENoYW5nZWxvZy4KIAotUGxlYXNlIGNvbnRhY3QgdGhlIElETEUgbWFpbnRhaW5lciB0byBoYXZlIHlvdXJzZWxmIGluY2x1ZGVkIGhlcmUgaWYgeW91Ci1hcmUgb25lIG9mIHRob3NlIHdlIG1pc3NlZCEgCitQbGVhc2UgY29udGFjdCB0aGUgSURMRSBtYWludGFpbmVyIChrYmtAc2hvcmUubmV0KSB0byBoYXZlIHlvdXJzZWxmIGluY2x1ZGVkCitoZXJlIGlmIHlvdSBhcmUgb25lIG9mIHRob3NlIHdlIG1pc3NlZCEKIAogCiAKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkgYi9MaWIvaWRsZWxpYi9DYWxsVGlwV2luZG93LnB5CmluZGV4IGFmZDQ0MzkuLjIyMjM4ODUgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NhbGxUaXBXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvQ2FsbFRpcFdpbmRvdy5weQpAQCAtNDksNyArNDksMTEgQEAKICAgICAgICAgIiIiCiAgICAgICAgICMgdHJ1bmNhdGUgb3Zlcmx5IGxvbmcgY2FsbHRpcAogICAgICAgICBpZiBsZW4odGV4dCkgPj0gNzk6Ci0gICAgICAgICAgICB0ZXh0ID0gdGV4dFs6NzVdICsgJyAuLi4nCisgICAgICAgICAgICB0ZXh0bGluZXMgPSB0ZXh0LnNwbGl0bGluZXMoKQorICAgICAgICAgICAgZm9yIGksIGxpbmUgaW4gZW51bWVyYXRlKHRleHRsaW5lcyk6CisgICAgICAgICAgICAgICAgaWYgbGVuKGxpbmUpID4gNzk6CisgICAgICAgICAgICAgICAgICAgIHRleHRsaW5lc1tpXSA9IGxpbmVbOjc1XSArICcgLi4uJworICAgICAgICAgICAgdGV4dCA9ICdcbicuam9pbih0ZXh0bGluZXMpCiAgICAgICAgIHNlbGYudGV4dCA9IHRleHQKICAgICAgICAgaWYgc2VsZi50aXB3aW5kb3cgb3Igbm90IHNlbGYudGV4dDoKICAgICAgICAgICAgIHJldHVybgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ2FsbFRpcHMucHkgYi9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weQppbmRleCA0N2ExZDU1Li45OTdlYjEzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weQorKysgYi9MaWIvaWRsZWxpYi9DYWxsVGlwcy5weQpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgYXJnVGV4dCA9ICIiCiAgICAgaWYgb2IgaXMgbm90IE5vbmU6CiAgICAgICAgIGFyZ09mZnNldCA9IDAKLSAgICAgICAgaWYgdHlwZShvYik9PXR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgaWYgdHlwZShvYikgaW4gKHR5cGVzLkNsYXNzVHlwZSwgdHlwZXMuVHlwZVR5cGUpOgogICAgICAgICAgICAgIyBMb29rIGZvciB0aGUgaGlnaGVzdCBfX2luaXRfXyBpbiB0aGUgY2xhc3MgY2hhaW4uCiAgICAgICAgICAgICBmb2IgPSBfZmluZF9jb25zdHJ1Y3RvcihvYikKICAgICAgICAgICAgIGlmIGZvYiBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvQ29kZUNvbnRleHQucHkgYi9MaWIvaWRsZWxpYi9Db2RlQ29udGV4dC5weQppbmRleCA1ZDU1Zjc3Li42M2NjODJjIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9Db2RlQ29udGV4dC5weQorKysgYi9MaWIvaWRsZWxpYi9Db2RlQ29udGV4dC5weQpAQCAtMTEsMTEgKzExLDEwIEBACiAiIiIKIGltcG9ydCBUa2ludGVyCiBmcm9tIGNvbmZpZ0hhbmRsZXIgaW1wb3J0IGlkbGVDb25mCi1mcm9tIHNldHMgaW1wb3J0IFNldAogaW1wb3J0IHJlCiBmcm9tIHN5cyBpbXBvcnQgbWF4aW50IGFzIElORklOSVRZCiAKLUJMT0NLT1BFTkVSUyA9IFNldChbImNsYXNzIiwgImRlZiIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLCAiZm9yIiwKK0JMT0NLT1BFTkVSUyA9IHNldChbImNsYXNzIiwgImRlZiIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLCAiZm9yIiwKICAgICAgICAgICAgICAgICAgICAgImlmIiwgInRyeSIsICJ3aGlsZSJdKQogVVBEQVRFSU5URVJWQUwgPSAxMDAgIyBtaWxsaXNlYwogRk9OVFVQREFURUlOVEVSVkFMID0gMTAwMCAjIG1pbGxpc2VjCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9Db2xvckRlbGVnYXRvci5weSBiL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CmluZGV4IGYyNThiMzQuLmU1NWY5ZTYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CisrKyBiL0xpYi9pZGxlbGliL0NvbG9yRGVsZWdhdG9yLnB5CkBAIC04LDI4ICs4LDI5IEBACiAKIERFQlVHID0gRmFsc2UKIAotZGVmIGFueShuYW1lLCBsaXN0KToKLSAgICByZXR1cm4gIig/UDwlcz4iICUgbmFtZSArICJ8Ii5qb2luKGxpc3QpICsgIikiCitkZWYgYW55KG5hbWUsIGFsdGVybmF0ZXMpOgorICAgICJSZXR1cm4gYSBuYW1lZCBncm91cCBwYXR0ZXJuIG1hdGNoaW5nIGxpc3Qgb2YgYWx0ZXJuYXRlcy4iCisgICAgcmV0dXJuICIoP1A8JXM+IiAlIG5hbWUgKyAifCIuam9pbihhbHRlcm5hdGVzKSArICIpIgogCiBkZWYgbWFrZV9wYXQoKToKICAgICBrdyA9IHIiXGIiICsgYW55KCJLRVlXT1JEIiwga2V5d29yZC5rd2xpc3QpICsgciJcYiIKICAgICBidWlsdGlubGlzdCA9IFtzdHIobmFtZSkgZm9yIG5hbWUgaW4gZGlyKF9fYnVpbHRpbl9fKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKV0KICAgICAjIHNlbGYuZmlsZSA9IGZpbGUoImZpbGUiKSA6Ci0gICAgIyAxc3QgJ2ZpbGUnIGNvbG9yaXplZCBub3JtYWwsIDJuZCBhcyBidWlsdGluLCAzcmQgYXMgY29tbWVudAotICAgIGJ1aWx0aW4gPSByIihbXi4nXCJcXF1cYnxeKSIgKyBhbnkoIkJVSUxUSU4iLCBidWlsdGlubGlzdCkgKyByIlxiIgorICAgICMgMXN0ICdmaWxlJyBjb2xvcml6ZWQgbm9ybWFsLCAybmQgYXMgYnVpbHRpbiwgM3JkIGFzIHN0cmluZworICAgIGJ1aWx0aW4gPSByIihbXi4nXCJcXCNdXGJ8XikiICsgYW55KCJCVUlMVElOIiwgYnVpbHRpbmxpc3QpICsgciJcYiIKICAgICBjb21tZW50ID0gYW55KCJDT01NRU5UIiwgW3IiI1teXG5dKiJdKQotICAgIHNxc3RyaW5nID0gciIoXGJbclJdKT8nW14nXFxcbl0qKFxcLlteJ1xcXG5dKikqJz8iCi0gICAgZHFzdHJpbmcgPSByJyhcYltyUl0pPyJbXiJcXFxuXSooXFwuW14iXFxcbl0qKSoiPycKLSAgICBzcTNzdHJpbmcgPSByIihcYltyUl0pPycnJ1teJ1xcXSooKFxcLnwnKD8hJycpKVteJ1xcXSopKignJycpPyIKLSAgICBkcTNzdHJpbmcgPSByJyhcYltyUl0pPyIiIlteIlxcXSooKFxcLnwiKD8hIiIpKVteIlxcXSopKigiIiIpPycKKyAgICBzcXN0cmluZyA9IHIiKFxiW3JSdVVdKT8nW14nXFxcbl0qKFxcLlteJ1xcXG5dKikqJz8iCisgICAgZHFzdHJpbmcgPSByJyhcYltyUnVVXSk/IlteIlxcXG5dKihcXC5bXiJcXFxuXSopKiI/JworICAgIHNxM3N0cmluZyA9IHIiKFxiW3JSdVVdKT8nJydbXidcXF0qKChcXC58Jyg/IScnKSlbXidcXF0qKSooJycnKT8iCisgICAgZHEzc3RyaW5nID0gcicoXGJbclJ1VV0pPyIiIlteIlxcXSooKFxcLnwiKD8hIiIpKVteIlxcXSopKigiIiIpPycKICAgICBzdHJpbmcgPSBhbnkoIlNUUklORyIsIFtzcTNzdHJpbmcsIGRxM3N0cmluZywgc3FzdHJpbmcsIGRxc3RyaW5nXSkKICAgICByZXR1cm4ga3cgKyAifCIgKyBidWlsdGluICsgInwiICsgY29tbWVudCArICJ8IiArIHN0cmluZyArXAogICAgICAgICAgICAifCIgKyBhbnkoIlNZTkMiLCBbciJcbiJdKQogCiBwcm9nID0gcmUuY29tcGlsZShtYWtlX3BhdCgpLCByZS5TKQogaWRwcm9nID0gcmUuY29tcGlsZShyIlxzKyhcdyspIiwgcmUuUykKLWFzcHJvZyA9IHJlLmNvbXBpbGUociIuKj9cYihhcylcYiIsIHJlLlMpCithc3Byb2cgPSByZS5jb21waWxlKHIiLio/XGIoYXMpXGIiKQogCiBjbGFzcyBDb2xvckRlbGVnYXRvcihEZWxlZ2F0b3IpOgogCkBAIC0yMDgsMTAgKzIwOSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgKyAiKyVkYyIgJSBhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQgKyAiKyVkYyIgJSBiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsaWYgdmFsdWUgPT0gImltcG9ydCI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29sb3IgYWxsIHRoZSAiYXMiIHdvcmRzIG9uIHNhbWUgbGluZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjaGVhcCBhcHByb3hpbWF0aW9uIHRvIHRoZSB0cnV0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbG9yIGFsbCB0aGUgImFzIiB3b3JkcyBvbiBzYW1lIGxpbmUsIGV4Y2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGlmIGluIGEgY29tbWVudDsgY2hlYXAgYXBwcm94aW1hdGlvbiB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0cnV0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAnIycgaW4gY2hhcnM6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBjaGFycy5pbmRleCgnIycpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRwb3MgPSBsZW4oY2hhcnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIFRydWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtMSA9IHNlbGYuYXNwcm9nLm1hdGNoKGNoYXJzLCBiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTEgPSBzZWxmLmFzcHJvZy5tYXRjaChjaGFycywgYiwgZW5kcG9zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm90IG0xOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLCBiID0gbTEuc3BhbigxKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvRGVidWdnZXIucHkgYi9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQppbmRleCA3YTlkMDJmLi5mNTY0NjBhIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQorKysgYi9MaWIvaWRsZWxpYi9EZWJ1Z2dlci5weQpAQCAtNCw2ICs0LDcgQEAKIGZyb20gVGtpbnRlciBpbXBvcnQgKgogZnJvbSBXaW5kb3dMaXN0IGltcG9ydCBMaXN0ZWRUb3BsZXZlbAogZnJvbSBTY3JvbGxlZExpc3QgaW1wb3J0IFNjcm9sbGVkTGlzdAoraW1wb3J0IG1hY29zeFN1cHBvcnQKIAogCiBjbGFzcyBJZGIoYmRiLkJkYik6CkBAIC0zMjIsNyArMzIzLDEzIEBACiBjbGFzcyBTdGFja1ZpZXdlcihTY3JvbGxlZExpc3QpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3RlciwgZmxpc3QsIGd1aSk6Ci0gICAgICAgIFNjcm9sbGVkTGlzdC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsIHdpZHRoPTgwKQorICAgICAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAgICAgIyBBdCBsZWFzdCBvbiB3aXRoIHRoZSBzdG9jayBBcXVhVGsgdmVyc2lvbiBvbiBPU1ggMTAuNCB5b3UnbGwKKyAgICAgICAgICAgICMgZ2V0IGFuIHNoYWtpbmcgR1VJIHRoYXQgZXZlbnR1YWxseSBraWxscyBJRExFIGlmIHRoZSB3aWR0aAorICAgICAgICAgICAgIyBhcmd1bWVudCBpcyBzcGVjaWZpZWQuCisgICAgICAgICAgICBTY3JvbGxlZExpc3QuX19pbml0X18oc2VsZiwgbWFzdGVyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2Nyb2xsZWRMaXN0Ll9faW5pdF9fKHNlbGYsIG1hc3Rlciwgd2lkdGg9ODApCiAgICAgICAgIHNlbGYuZmxpc3QgPSBmbGlzdAogICAgICAgICBzZWxmLmd1aSA9IGd1aQogICAgICAgICBzZWxmLnN0YWNrID0gW10KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weSBiL0xpYi9pZGxlbGliL0VkaXRvcldpbmRvdy5weQppbmRleCA1OTQ0MGYwLi42YjhhYjYzIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9FZGl0b3JXaW5kb3cucHkKKysrIGIvTGliL2lkbGVsaWIvRWRpdG9yV2luZG93LnB5CkBAIC0xNyw2ICsxNyw3IEBACiBpbXBvcnQgUHlQYXJzZQogZnJvbSBjb25maWdIYW5kbGVyIGltcG9ydCBpZGxlQ29uZgogaW1wb3J0IGFib3V0RGlhbG9nLCB0ZXh0VmlldywgY29uZmlnRGlhbG9nCitpbXBvcnQgbWFjb3N4U3VwcG9ydAogCiAjIFRoZSBkZWZhdWx0IHRhYiBzZXR0aW5nIGZvciBhIFRleHQgd2lkZ2V0LCBpbiBhdmVyYWdlLXdpZHRoIGNoYXJhY3RlcnMuCiBUS19UQUJXSURUSF9ERUZBVUxUID0gOApAQCAtNjYsMjYgKzY3LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJWQlZC5jaG0nICUgc3lzLnZlcnNpb25faW5mb1s6Ml0pCiAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY2htZmlsZSk6CiAgICAgICAgICAgICAgICAgICAgIGRvY2hvbWUgPSBjaG1maWxlCisKKyAgICAgICAgICAgIGVsaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICAgICAjIGRvY3VtZW50YXRpb24gaXMgc3RvcmVkIGluc2lkZSB0aGUgcHl0aG9uIGZyYW1ld29yaworICAgICAgICAgICAgICAgIGRvY2hvbWUgPSBvcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICdSZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uL2luZGV4Lmh0bWwnKQorCiAgICAgICAgICAgICBkb2Nob21lID0gb3MucGF0aC5ub3JtcGF0aChkb2Nob21lKQogICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZG9jaG9tZSk6CiAgICAgICAgICAgICAgICAgRWRpdG9yV2luZG93LmhlbHBfdXJsID0gZG9jaG9tZQorICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKKyAgICAgICAgICAgICAgICAgICAgIyBTYWZhcmkgcmVxdWlyZXMgcmVhbCBmaWxlOi1VUkxzCisgICAgICAgICAgICAgICAgICAgIEVkaXRvcldpbmRvdy5oZWxwX3VybCA9ICdmaWxlOi8vJyArIEVkaXRvcldpbmRvdy5oZWxwX3VybAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBFZGl0b3JXaW5kb3cuaGVscF91cmwgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9jdXJyZW50IgogICAgICAgICBjdXJyZW50VGhlbWU9aWRsZUNvbmYuQ3VycmVudFRoZW1lKCkKICAgICAgICAgc2VsZi5mbGlzdCA9IGZsaXN0CiAgICAgICAgIHJvb3QgPSByb290IG9yIGZsaXN0LnJvb3QKICAgICAgICAgc2VsZi5yb290ID0gcm9vdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMucHMxCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHN5cy5wczEgPSAnPj4+ICcKICAgICAgICAgc2VsZi5tZW51YmFyID0gTWVudShyb290KQogICAgICAgICBzZWxmLnRvcCA9IHRvcCA9IFdpbmRvd0xpc3QuTGlzdGVkVG9wbGV2ZWwocm9vdCwgbWVudT1zZWxmLm1lbnViYXIpCiAgICAgICAgIGlmIGZsaXN0OgogICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSBmbGlzdC52YXJzCiAgICAgICAgICAgICAjc2VsZi50b3AuaW5zdGFuY2VfZGljdCBtYWtlcyBmbGlzdC5pbnZlcnNlZGljdCBhdmFsYWJsZSB0bwogICAgICAgICAgICAgI2NvbmZpZ0RpYWxvZy5weSBzbyBpdCBjYW4gYWNjZXNzIGFsbCBFZGl0b3JXaW5kb3cgaW5zdGFjZXMKLSAgICAgICAgICAgIHNlbGYudG9wLmluc3RhbmNlX2RpY3Q9Zmxpc3QuaW52ZXJzZWRpY3QKKyAgICAgICAgICAgIHNlbGYudG9wLmluc3RhbmNlX2RpY3QgPSBmbGlzdC5pbnZlcnNlZGljdAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi50a2ludGVyX3ZhcnMgPSB7fSAgIyBrZXlzOiBUa2ludGVyIGV2ZW50IG5hbWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZhbHVlczogVGtpbnRlciB2YXJpYWJsZSBpbnN0YW5jZXMKLSAgICAgICAgc2VsZi5yZWNlbnRfZmlsZXNfcGF0aD1vcy5wYXRoLmpvaW4oaWRsZUNvbmYuR2V0VXNlckNmZ0RpcigpLAorICAgICAgICAgICAgc2VsZi50b3AuaW5zdGFuY2VfZGljdCA9IHt9CisgICAgICAgIHNlbGYucmVjZW50X2ZpbGVzX3BhdGggPSBvcy5wYXRoLmpvaW4oaWRsZUNvbmYuR2V0VXNlckNmZ0RpcigpLAogICAgICAgICAgICAgICAgICdyZWNlbnQtZmlsZXMubHN0JykKICAgICAgICAgc2VsZi52YmFyID0gdmJhciA9IFNjcm9sbGJhcih0b3AsIG5hbWU9J3ZiYXInKQogICAgICAgICBzZWxmLnRleHRfZnJhbWUgPSB0ZXh0X2ZyYW1lID0gRnJhbWUodG9wKQpAQCAtMTExLDYgKzEyNiw5IEBACiAKICAgICAgICAgc2VsZi50b3AucHJvdG9jb2woIldNX0RFTEVURV9XSU5ET1ciLCBzZWxmLmNsb3NlKQogICAgICAgICBzZWxmLnRvcC5iaW5kKCI8PGNsb3NlLXdpbmRvdz4+Iiwgc2VsZi5jbG9zZV9ldmVudCkKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgQ29tbWFuZC1XIG9uIGVkaXRvcndpbmRvd3MgZG9lc24ndCB3b3JrIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgICAgIHRleHQuYmluZCgnPDxjbG9zZS13aW5kb3c+PicsIHNlbGYuY2xvc2VfZXZlbnQpCiAgICAgICAgIHRleHQuYmluZCgiPDxjdXQ+PiIsIHNlbGYuY3V0KQogICAgICAgICB0ZXh0LmJpbmQoIjw8Y29weT4+Iiwgc2VsZi5jb3B5KQogICAgICAgICB0ZXh0LmJpbmQoIjw8cGFzdGU+PiIsIHNlbGYucGFzdGUpCkBAIC0yNzgsNiArMjk2LDEwIEBACiAKICAgICBkZWYgc2V0X3N0YXR1c19iYXIoc2VsZik6CiAgICAgICAgIHNlbGYuc3RhdHVzX2JhciA9IHNlbGYuTXVsdGlTdGF0dXNCYXIoc2VsZi50b3ApCisgICAgICAgIGlmIG1hY29zeFN1cHBvcnQucnVubmluZ0FzT1NYQXBwKCk6CisgICAgICAgICAgICAjIEluc2VydCBzb21lIHBhZGRpbmcgdG8gYXZvaWQgb2JzY3VyaW5nIHNvbWUgb2YgdGhlIHN0YXR1c2JhcgorICAgICAgICAgICAgIyBieSB0aGUgcmVzaXplIHdpZGdldC4KKyAgICAgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ19wYWRkaW5nMScsICcgICAgJywgc2lkZT1SSUdIVCkKICAgICAgICAgc2VsZi5zdGF0dXNfYmFyLnNldF9sYWJlbCgnY29sdW1uJywgJ0NvbDogPycsIHNpZGU9UklHSFQpCiAgICAgICAgIHNlbGYuc3RhdHVzX2Jhci5zZXRfbGFiZWwoJ2xpbmUnLCAnTG46ID8nLCBzaWRlPVJJR0hUKQogICAgICAgICBzZWxmLnN0YXR1c19iYXIucGFjayhzaWRlPUJPVFRPTSwgZmlsbD1YKQpAQCAtMzAxLDYgKzMyMywxMSBAQAogICAgICAgICAoImhlbHAiLCAiX0hlbHAiKSwKICAgICBdCiAKKyAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBkZWwgbWVudV9zcGVjc1stM10KKyAgICAgICAgbWVudV9zcGVjc1stMl0gPSAoIndpbmRvd3MiLCAiX1dpbmRvdyIpCisKKwogICAgIGRlZiBjcmVhdGVtZW51YmFyKHNlbGYpOgogICAgICAgICBtYmFyID0gc2VsZi5tZW51YmFyCiAgICAgICAgIHNlbGYubWVudWRpY3QgPSBtZW51ZGljdCA9IHt9CkBAIC0zMDgsNiArMzM1LDEyIEBACiAgICAgICAgICAgICB1bmRlcmxpbmUsIGxhYmVsID0gcHJlcHN0cihsYWJlbCkKICAgICAgICAgICAgIG1lbnVkaWN0W25hbWVdID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT1uYW1lKQogICAgICAgICAgICAgbWJhci5hZGRfY2FzY2FkZShsYWJlbD1sYWJlbCwgbWVudT1tZW51LCB1bmRlcmxpbmU9dW5kZXJsaW5lKQorCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJyBhbmQgJy5mcmFtZXdvcmsnIGluIHN5cy5leGVjdXRhYmxlOgorICAgICAgICAgICAgIyBJbnNlcnQgdGhlIGFwcGxpY2F0aW9uIG1lbnUKKyAgICAgICAgICAgIG1lbnVkaWN0WydhcHBsaWNhdGlvbiddID0gbWVudSA9IE1lbnUobWJhciwgbmFtZT0nYXBwbGUnKQorICAgICAgICAgICAgbWJhci5hZGRfY2FzY2FkZShsYWJlbD0nSURMRScsIG1lbnU9bWVudSkKKwogICAgICAgICBzZWxmLmZpbGxfbWVudXMoKQogICAgICAgICBzZWxmLmJhc2VfaGVscG1lbnVfbGVuZ3RoID0gc2VsZi5tZW51ZGljdFsnaGVscCddLmluZGV4KEVORCkKICAgICAgICAgc2VsZi5yZXNldF9oZWxwX21lbnVfZW50cmllcygpCkBAIC02NDksNyArNjgyLDcgQEAKICAgICBkZWYgX19leHRyYV9oZWxwX2NhbGxiYWNrKHNlbGYsIGhlbHBmaWxlKToKICAgICAgICAgIkNyZWF0ZSBhIGNhbGxiYWNrIHdpdGggdGhlIGhlbHBmaWxlIHZhbHVlIGZyb3plbiBhdCBkZWZpbml0aW9uIHRpbWUiCiAgICAgICAgIGRlZiBkaXNwbGF5X2V4dHJhX2hlbHAoaGVscGZpbGU9aGVscGZpbGUpOgotICAgICAgICAgICAgaWYgbm90IChoZWxwZmlsZS5zdGFydHN3aXRoKCd3d3cnKSBvciBoZWxwZmlsZS5zdGFydHN3aXRoKCdodHRwJykpOgorICAgICAgICAgICAgaWYgbm90IGhlbHBmaWxlLnN0YXJ0c3dpdGgoKCd3d3cnLCAnaHR0cCcpKToKICAgICAgICAgICAgICAgICB1cmwgPSBvcy5wYXRoLm5vcm1wYXRoKGhlbHBmaWxlKQogICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtWzozXSA9PSAnd2luJzoKICAgICAgICAgICAgICAgICBvcy5zdGFydGZpbGUoaGVscGZpbGUpCkBAIC0xMjQ0LDEzICsxMjc3LDEzIEBACiAgICAgICAgICAgICAgICJUb2dnbGUgdGFicyIsCiAgICAgICAgICAgICAgICJUdXJuIHRhYnMgIiArICgib24iLCAib2ZmIilbc2VsZi51c2V0YWJzXSArCiAgICAgICAgICAgICAgICI/XG5JbmRlbnQgd2lkdGggIiArCi0gICAgICAgICAgICAgICgid2lsbCBiZSIsICJyZW1haW5zIGF0Iilbc2VsZi51c2V0YWJzXSArICIgOC4iLAorICAgICAgICAgICAgICAoIndpbGwgYmUiLCAicmVtYWlucyBhdCIpW3NlbGYudXNldGFic10gKyAiIDguIiArCisgICAgICAgICAgICAgICJcbiBOb3RlOiBhIHRhYiBpcyBhbHdheXMgOCBjb2x1bW5zIiwKICAgICAgICAgICAgICAgcGFyZW50PXNlbGYudGV4dCk6CiAgICAgICAgICAgICBzZWxmLnVzZXRhYnMgPSBub3Qgc2VsZi51c2V0YWJzCi0gICAgICAgICMgVHJ5IHRvIHByZXZlbnQgbWl4ZWQgdGFicy9zcGFjZXMuCi0gICAgICAgICMgVXNlciBtdXN0IHJlc2V0IGluZGVudCB3aWR0aCBtYW51YWxseSBhZnRlciB1c2luZyB0YWJzCi0gICAgICAgICMgICAgICBpZiBoZSBpbnNpc3RzIG9uIGdldHRpbmcgaW50byB0cm91YmxlLgotICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gOAorICAgICAgICAgICAgIyBUcnkgdG8gcHJldmVudCBpbmNvbnNpc3RlbnQgaW5kZW50YXRpb24uCisgICAgICAgICAgICAjIFVzZXIgbXVzdCBjaGFuZ2UgaW5kZW50IHdpZHRoIG1hbnVhbGx5IGFmdGVyIHVzaW5nIHRhYnMuCisgICAgICAgICAgICBzZWxmLmluZGVudHdpZHRoID0gOAogICAgICAgICByZXR1cm4gImJyZWFrIgogCiAgICAgIyBYWFggdGhpcyBpc24ndCBib3VuZCB0byBhbnl0aGluZyAtLSBzZWUgdGFid2lkdGggY29tbWVudHMKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL05FV1MudHh0IGIvTGliL2lkbGVsaWIvTkVXUy50eHQKaW5kZXggMjVlNWQ0MC4uMjM1OTYzZSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvTkVXUy50eHQKKysrIGIvTGliL2lkbGVsaWIvTkVXUy50eHQKQEAgLTEsMyArMSw0NiBAQAorV2hhdCdzIE5ldyBpbiBJRExFIDEuMmMxPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiBYWC1BVUctMjAwNioKKworLSBDaGFuZ2luZyB0b2tlbml6ZSAoMzkwNDYpIHRvIGRldGVjdCBkZWRlbnQgYnJva2UgdGFibmFubnkgY2hlY2sgKHNpbmNlIDEuMmExKQorCistIFRvZ2dsZVRhYiBkaWFsb2cgd2FzIHNldHRpbmcgaW5kZW50IHRvIDggZXZlbiBpZiBjYW5jZWxsZWQgKHNpbmNlIDEuMmExKS4KKworLSBXaGVuIHVzZWQgdy9vIHN1YnByb2Nlc3MsIGFsbCBleGNlcHRpb25zIHdlcmUgcHJlY2VkZWQgYnkgYW4gZXJyb3IKKyAgbWVzc2FnZSBjbGFpbWluZyB0aGV5IHdlcmUgSURMRSBpbnRlcm5hbCBlcnJvcnMgKHNpbmNlIDEuMmExKS4KKworV2hhdCdzIE5ldyBpbiBJRExFIDEuMmIzPworPT09PT09PT09PT09PT09PT09PT09PT09PQorCisqUmVsZWFzZSBkYXRlOiAwMy1BVUctMjAwNioKKworLSBFZGl0b3JXaW5kb3cudGVzdCgpIHdhcyBmYWlsaW5nLiAgQnVnIDE0MTc1OTgKKworLSBFZGl0b3JXaW5kb3cgZmFpbGVkIHdoZW4gdXNlZCBzdGFuZC1hbG9uZSBpZiBzeXMucHMxIG5vdCBzZXQuCisgIEJ1ZyAxMDEwMzcwIERhdmUgRmxvcmVrCisKKy0gVG9vbHRpcHMgZmFpbGVkIG9uIG5ldy1zeWxlIGNsYXNzIF9faW5pdF9fIGFyZ3MuICBCdWcgMTAyNzU2NiBMb3JlbiBHdXRocmllCisKKy0gQXZvaWQgb2NjYXNpb25hbCBmYWlsdXJlIHRvIGRldGVjdCBjbG9zaW5nIHBhcmVuIHByb3Blcmx5LgorICBQYXRjaCAxNDA3MjgwIFRhbCBFaW5hdAorCistIFJlYmluZGluZyBUYWIga2V5IHdhcyBpbnNlcnRpbmcgJ3RhYicgaW5zdGVhZCBvZiAnVGFiJy4gIEJ1ZyAxMTc5MTY4LgorCistIENvbG9yaXplciBub3cgaGFuZGxlcyAjPGJ1aWx0aW4+IGNvcnJlY3RseSwgYWxzbyB1bmljb2RlIHN0cmluZ3MgYW5kCisgICdhcycga2V5d29yZCBpbiBjb21tZW50IGRpcmVjdGx5IGZvbGxvd2luZyBpbXBvcnQgY29tbWFuZC4gQ2xvc2VzIDEzMjUwNzEuCisgIFBhdGNoIDE0NzkyMTkgVGFsIEVpbmF0CisKK1doYXQncyBOZXcgaW4gSURMRSAxLjJiMj8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMTEtSlVMLTIwMDYqCisKK1doYXQncyBOZXcgaW4gSURMRSAxLjJiMT8KKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworKlJlbGVhc2UgZGF0ZTogMjAtSlVOLTIwMDYqCisKIFdoYXQncyBOZXcgaW4gSURMRSAxLjJhMj8KID09PT09PT09PT09PT09PT09PT09PT09PT0KIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weSBiL0xpYi9pZGxlbGliL1BhcmVuTWF0Y2gucHkKaW5kZXggNjczYWVlMi4uMjUwYWU4YiAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvUGFyZW5NYXRjaC5weQorKysgYi9MaWIvaWRsZWxpYi9QYXJlbk1hdGNoLnB5CkBAIC04LDcgKzgsNyBAQAogZnJvbSBIeXBlclBhcnNlciBpbXBvcnQgSHlwZXJQYXJzZXIKIGZyb20gY29uZmlnSGFuZGxlciBpbXBvcnQgaWRsZUNvbmYKIAota2V5c3ltX29wZW5lciA9IHsicGFyZW5yaWdodCI6JygnLCAiYnJhY2tldHJpZ2h0IjonWycsICJicmFjZXJpZ2h0Ijoneyd9Citfb3BlbmVycyA9IHsnKSc6JygnLCddJzonWycsJ30nOid7J30KIENIRUNLX0RFTEFZID0gMTAwICMgbWlsaXNlY29uZHMKIAogY2xhc3MgUGFyZW5NYXRjaDoKQEAgLTEwMCwxMiArMTAwLDEzIEBACiAKICAgICBkZWYgcGFyZW5fY2xvc2VkX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgIyBJZiBpdCB3YXMgYSBzaG9ydGN1dCBhbmQgbm90IHJlYWxseSBhIGNsb3NpbmcgcGFyZW4sIHF1aXQuCi0gICAgICAgIGlmIHNlbGYudGV4dC5nZXQoImluc2VydC0xYyIpIG5vdCBpbiAoJyknLCddJywnfScpOgorICAgICAgICBjbG9zZXIgPSBzZWxmLnRleHQuZ2V0KCJpbnNlcnQtMWMiKQorICAgICAgICBpZiBjbG9zZXIgbm90IGluIF9vcGVuZXJzOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGhwID0gSHlwZXJQYXJzZXIoc2VsZi5lZGl0d2luLCAiaW5zZXJ0LTFjIikKICAgICAgICAgaWYgbm90IGhwLmlzX2luX2NvZGUoKToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpbmRpY2VzID0gaHAuZ2V0X3N1cnJvdW5kaW5nX2JyYWNrZXRzKGtleXN5bV9vcGVuZXJbZXZlbnQua2V5c3ltXSwgVHJ1ZSkKKyAgICAgICAgaW5kaWNlcyA9IGhwLmdldF9zdXJyb3VuZGluZ19icmFja2V0cyhfb3BlbmVyc1tjbG9zZXJdLCBUcnVlKQogICAgICAgICBpZiBpbmRpY2VzIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLndhcm5fbWlzbWF0Y2hlZCgpCiAgICAgICAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1B5U2hlbGwucHkgYi9MaWIvaWRsZWxpYi9QeVNoZWxsLnB5CmluZGV4IGI2YWJlNDAuLjI1ZWI0NDYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1B5U2hlbGwucHkKKysrIGIvTGliL2lkbGVsaWIvUHlTaGVsbC5weQpAQCAtMTEsNiArMTEsNyBAQAogaW1wb3J0IHRocmVhZGluZwogaW1wb3J0IHRyYWNlYmFjawogaW1wb3J0IHR5cGVzCitpbXBvcnQgbWFjb3N4U3VwcG9ydAogCiBpbXBvcnQgbGluZWNhY2hlCiBmcm9tIGNvZGUgaW1wb3J0IEludGVyYWN0aXZlSW50ZXJwcmV0ZXIKQEAgLTcyMSw4ICs3MjIsMTIgQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICBzZWxmLnNob3d0cmFjZWJhY2soKQogICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHByaW50Pj5zeXMuc3RkZXJyLCAiSURMRSBpbnRlcm5hbCBlcnJvciBpbiBydW5jb2RlKCkiCisgICAgICAgICAgICAgICAgaWYgdXNlX3N1YnByb2Nlc3M6CisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYudGtjb25zb2xlLnN0ZGVyciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSURMRSBpbnRlcm5hbCBlcnJvciBpbiBydW5jb2RlKCkiCiAgICAgICAgICAgICAgICAgc2VsZi5zaG93dHJhY2ViYWNrKCkKKyAgICAgICAgICAgICAgICBpZiB1c2Vfc3VicHJvY2VzczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50a2NvbnNvbGUuZW5kZXhlY3V0aW5nKCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIG5vdCB1c2Vfc3VicHJvY2VzczoKICAgICAgICAgICAgICAgICBzZWxmLnRrY29uc29sZS5lbmRleGVjdXRpbmcoKQpAQCAtNzc3LDYgKzc4MiwxMSBAQAogICAgICAgICAoImhlbHAiLCAiX0hlbHAiKSwKICAgICBdCiAKKyAgICBpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICBkZWwgbWVudV9zcGVjc1stM10KKyAgICAgICAgbWVudV9zcGVjc1stMl0gPSAoIndpbmRvd3MiLCAiX1dpbmRvdyIpCisKKwogICAgICMgTmV3IGNsYXNzZXMKICAgICBmcm9tIElkbGVIaXN0b3J5IGltcG9ydCBIaXN0b3J5CiAKQEAgLTEzMDAsMTAgKzEzMTAsNiBAQAogICAgIHNjcmlwdCA9IE5vbmUKICAgICBzdGFydHVwID0gRmFsc2UKICAgICB0cnk6Ci0gICAgICAgIHN5cy5wczEKLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIHN5cy5wczEgPSAnPj4+ICcKLSAgICB0cnk6CiAgICAgICAgIG9wdHMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgImM6ZGVpaG5yOnN0OiIpCiAgICAgZXhjZXB0IGdldG9wdC5lcnJvciwgbXNnOgogICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFcnJvcjogJXNcbiIgJSBzdHIobXNnKSkKQEAgLTEzNzEsOSArMTM3NywxMiBAQAogICAgIGVuYWJsZV9zaGVsbCA9IGVuYWJsZV9zaGVsbCBvciBub3QgZWRpdF9zdGFydAogICAgICMgc3RhcnQgZWRpdG9yIGFuZC9vciBzaGVsbCB3aW5kb3dzOgogICAgIHJvb3QgPSBUayhjbGFzc05hbWU9IklkbGUiKQorCiAgICAgZml4d29yZGJyZWFrcyhyb290KQogICAgIHJvb3Qud2l0aGRyYXcoKQogICAgIGZsaXN0ID0gUHlTaGVsbEZpbGVMaXN0KHJvb3QpCisgICAgbWFjb3N4U3VwcG9ydC5zZXR1cEFwcChyb290LCBmbGlzdCkKKwogICAgIGlmIGVuYWJsZV9lZGl0OgogICAgICAgICBpZiBub3QgKGNtZCBvciBzY3JpcHQpOgogICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CkBAIC0xMzgxLDggKzEzOTAsMTcgQEAKICAgICAgICAgICAgIGlmIG5vdCBhcmdzOgogICAgICAgICAgICAgICAgIGZsaXN0Lm5ldygpCiAgICAgaWYgZW5hYmxlX3NoZWxsOgotICAgICAgICBpZiBub3QgZmxpc3Qub3Blbl9zaGVsbCgpOgorICAgICAgICBzaGVsbCA9IGZsaXN0Lm9wZW5fc2hlbGwoKQorICAgICAgICBpZiBub3Qgc2hlbGw6CiAgICAgICAgICAgICByZXR1cm4gIyBjb3VsZG4ndCBvcGVuIHNoZWxsCisKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKSBhbmQgZmxpc3QuZGljdDoKKyAgICAgICAgICAgICMgT24gT1NYOiB3aGVuIHRoZSB1c2VyIGhhcyBkb3VibGUtY2xpY2tlZCBvbiBhIGZpbGUgdGhhdCBjYXVzZXMKKyAgICAgICAgICAgICMgSURMRSB0byBiZSBsYXVuY2hlZCB0aGUgc2hlbGwgd2luZG93IHdpbGwgb3BlbiBqdXN0IGluIGZyb250IG9mCisgICAgICAgICAgICAjIHRoZSBmaWxlIHNoZSB3YW50cyB0byBzZWUuIExvd2VyIHRoZSBpbnRlcnByZXRlciB3aW5kb3cgd2hlbgorICAgICAgICAgICAgIyB0aGVyZSBhcmUgb3BlbiBmaWxlcy4KKyAgICAgICAgICAgIHNoZWxsLnRvcC5sb3dlcigpCisKICAgICBzaGVsbCA9IGZsaXN0LnB5c2hlbGwKICAgICAjIGhhbmRsZSByZW1haW5pbmcgb3B0aW9uczoKICAgICBpZiBkZWJ1ZzoKQEAgLTE0MDMsNiArMTQyMSw3IEBACiAgICAgICAgIGVsaWYgc2NyaXB0OgogICAgICAgICAgICAgc2hlbGwuaW50ZXJwLnByZXBlbmRfc3lzcGF0aChzY3JpcHQpCiAgICAgICAgICAgICBzaGVsbC5pbnRlcnAuZXhlY2ZpbGUoc2NyaXB0KQorCiAgICAgcm9vdC5tYWlubG9vcCgpCiAgICAgcm9vdC5kZXN0cm95KCkKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weSBiL0xpYi9pZGxlbGliL1NjcmlwdEJpbmRpbmcucHkKaW5kZXggMDg0YzYwNy4uZjMyNWFkMSAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvU2NyaXB0QmluZGluZy5weQorKysgYi9MaWIvaWRsZWxpYi9TY3JpcHRCaW5kaW5nLnB5CkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICMgUHJvdmlkZSBpbnN0YW5jZSB2YXJpYWJsZXMgcmVmZXJlbmNlZCBieSBEZWJ1Z2dlcgogICAgICAgICAjIFhYWCBUaGlzIHNob3VsZCBiZSBkb25lIGRpZmZlcmVudGx5CiAgICAgICAgIHNlbGYuZmxpc3QgPSBzZWxmLmVkaXR3aW4uZmxpc3QKLSAgICAgICAgc2VsZi5yb290ID0gc2VsZi5mbGlzdC5yb290CisgICAgICAgIHNlbGYucm9vdCA9IHNlbGYuZWRpdHdpbi5yb290CiAKICAgICBkZWYgY2hlY2tfbW9kdWxlX2V2ZW50KHNlbGYsIGV2ZW50KToKICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldGZpbGVuYW1lKCkKQEAgLTc2LDYgKzc2LDkgQEAKICAgICAgICAgICAgIHNlbGYuZWRpdHdpbi5nb3RvbGluZShuYWcuZ2V0X2xpbmVubygpKQogICAgICAgICAgICAgc2VsZi5lcnJvcmJveCgiVGFiL3NwYWNlIGVycm9yIiwgaW5kZW50X21lc3NhZ2UpCiAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgZXhjZXB0IEluZGVudGF0aW9uRXJyb3I6CisgICAgICAgICAgICAjIEZyb20gdG9rZW5pemUoKSwgbGV0IGNvbXBpbGUoKSBpbiBjaGVja3N5bnRheCBmaW5kIGl0IGFnYWluLgorICAgICAgICAgICAgcGFzcwogICAgICAgICByZXR1cm4gVHJ1ZQogCiAgICAgZGVmIGNoZWNrc3ludGF4KHNlbGYsIGZpbGVuYW1lKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkgYi9MaWIvaWRsZWxpYi9ab29tSGVpZ2h0LnB5CmluZGV4IDJhYjQ2NTYuLjgzY2EzYTYgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL1pvb21IZWlnaHQucHkKKysrIGIvTGliL2lkbGVsaWIvWm9vbUhlaWdodC5weQpAQCAtMiw2ICsyLDcgQEAKIAogaW1wb3J0IHJlCiBpbXBvcnQgc3lzCitpbXBvcnQgbWFjb3N4U3VwcG9ydAogCiBjbGFzcyBab29tSGVpZ2h0OgogCkBAIC0yOSw2ICszMCwxNCBAQAogICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnd2luMzInOgogICAgICAgICBuZXd5ID0gMAogICAgICAgICBuZXdoZWlnaHQgPSBuZXdoZWlnaHQgLSA3MgorCisgICAgZWxpZiBtYWNvc3hTdXBwb3J0LnJ1bm5pbmdBc09TWEFwcCgpOgorICAgICAgICAjIFRoZSAnODgnIGJlbG93IGlzIGEgbWFnaWMgbnVtYmVyIHRoYXQgYXZvaWRzIHBsYWNpbmcgdGhlIGJvdHRvbQorICAgICAgICAjIG9mIHRoZSB3aW5kb3cgYmVsb3cgdGhlIHBhbmVsIG9uIG15IG1hY2hpbmUuIEkgZG9uJ3Qga25vdyBob3cKKyAgICAgICAgIyB0byBjYWxjdWxhdGUgdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoaXMgd2l0aCB0a2ludGVyLgorICAgICAgICBuZXd5ID0gMjIKKyAgICAgICAgbmV3aGVpZ2h0ID0gbmV3aGVpZ2h0IC0gbmV3eSAtIDg4CisKICAgICBlbHNlOgogICAgICAgICAjbmV3eSA9IDI0CiAgICAgICAgIG5ld3kgPSAwCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9idWlsZGFwcC5weSBiL0xpYi9pZGxlbGliL2J1aWxkYXBwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzJlYjFlLi4wMDAwMDAwCi0tLSBhL0xpYi9pZGxlbGliL2J1aWxkYXBwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIwotIyBBZnRlciBydW5uaW5nIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsLCBydW4gdGhpcyBwcm9ncmFtIGZyb20gdGhlIGNvbW1hbmQKLSMgbGluZSBsaWtlIHNvOgotIwotIyAlIHB5dGhvbjIuMyBidWlsZGFwcC5weSBidWlsZAotIwotIyBBIGRvdWJsZS1jbGlja2FibGUgSURMRSBhcHBsaWNhdGlvbiB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGJ1aWxkLyBkaXJlY3RvcnkuCi0jCi0KLWZyb20gYnVuZGxlYnVpbGRlciBpbXBvcnQgYnVpbGRhcHAKLQotYnVpbGRhcHAoCi0gICAgICAgIG5hbWU9IklETEUiLAotICAgICAgICBtYWlucHJvZ3JhbT0iaWRsZS5weSIsCi0gICAgICAgIGFyZ3ZfZW11bGF0aW9uPTEsCi0gICAgICAgIGljb25maWxlPSJJY29ucy9pZGxlLmljbnMiLAotKQpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmIGIvTGliL2lkbGVsaWIvY29uZmlnLWtleXMuZGVmCmluZGV4IDA2NTM3NDYuLmZiMGFhZjQgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZy1rZXlzLmRlZgorKysgYi9MaWIvaWRsZWxpYi9jb25maWcta2V5cy5kZWYKQEAgLTE1OSwzICsxNTksNTYgQEAKIGNoYW5nZS1pbmRlbnR3aWR0aD08Q29udHJvbC1LZXktdT4KIGRlbC13b3JkLWxlZnQ9PENvbnRyb2wtS2V5LUJhY2tTcGFjZT4KIGRlbC13b3JkLXJpZ2h0PTxDb250cm9sLUtleS1EZWxldGU+CisKK1tJRExFIENsYXNzaWMgT1NYXQordG9nZ2xlLXRhYnMgPSA8Q29udHJvbC1LZXktdD4KK2ludGVycnVwdC1leGVjdXRpb24gPSA8Q29udHJvbC1LZXktYz4KK3VudGFiaWZ5LXJlZ2lvbiA9IDxDb250cm9sLUtleS02PgorcmVtb3ZlLXNlbGVjdGlvbiA9IDxLZXktRXNjYXBlPgorcHJpbnQtd2luZG93ID0gPENvbW1hbmQtS2V5LXA+CityZXBsYWNlID0gPENvbW1hbmQtS2V5LXI+Citnb3RvLWxpbmUgPSA8Q29tbWFuZC1LZXktaj4KK3BsYWluLW5ld2xpbmUtYW5kLWluZGVudCA9IDxDb250cm9sLUtleS1qPgoraGlzdG9yeS1wcmV2aW91cyA9IDxDb250cm9sLUtleS1wPgorYmVnaW5uaW5nLW9mLWxpbmUgPSA8Q29udHJvbC1LZXktTGVmdD4KK2VuZC1vZi1saW5lID0gPENvbnRyb2wtS2V5LVJpZ2h0PgorY29tbWVudC1yZWdpb24gPSA8Q29udHJvbC1LZXktMz4KK3JlZG8gPSA8U2hpZnQtQ29tbWFuZC1LZXktWj4KK2Nsb3NlLXdpbmRvdyA9IDxDb21tYW5kLUtleS13PgorcmVzdGFydC1zaGVsbCA9IDxDb250cm9sLUtleS1GNj4KK3NhdmUtd2luZG93LWFzLWZpbGUgPSA8Q29tbWFuZC1LZXktUz4KK2Nsb3NlLWFsbC13aW5kb3dzID0gPENvbW1hbmQtS2V5LXE+Cit2aWV3LXJlc3RhcnQgPSA8S2V5LUY2PgordGFiaWZ5LXJlZ2lvbiA9IDxDb250cm9sLUtleS01PgorZmluZC1hZ2FpbiA9IDxDb21tYW5kLUtleS1nPiA8S2V5LUYzPgorZmluZCA9IDxDb21tYW5kLUtleS1mPgordG9nZ2xlLWF1dG8tY29sb3JpbmcgPSA8Q29udHJvbC1LZXktc2xhc2g+CitzZWxlY3QtYWxsID0gPENvbW1hbmQtS2V5LWE+CitzbWFydC1iYWNrc3BhY2UgPSA8S2V5LUJhY2tTcGFjZT4KK2NoYW5nZS1pbmRlbnR3aWR0aCA9IDxDb250cm9sLUtleS11PgorZG8tbm90aGluZyA9IDxDb250cm9sLUtleS1GMTI+CitzbWFydC1pbmRlbnQgPSA8S2V5LVRhYj4KK2NlbnRlci1pbnNlcnQgPSA8Q29udHJvbC1LZXktbD4KK2hpc3RvcnktbmV4dCA9IDxDb250cm9sLUtleS1uPgorZGVsLXdvcmQtcmlnaHQgPSA8T3B0aW9uLUtleS1EZWxldGU+Cit1bmRvID0gPENvbW1hbmQtS2V5LXo+CitzYXZlLXdpbmRvdyA9IDxDb21tYW5kLUtleS1zPgordW5jb21tZW50LXJlZ2lvbiA9IDxDb250cm9sLUtleS00PgorY3V0ID0gPENvbW1hbmQtS2V5LXg+CitmaW5kLWluLWZpbGVzID0gPENvbW1hbmQtS2V5LUYzPgorZGVkZW50LXJlZ2lvbiA9IDxDb21tYW5kLUtleS1icmFja2V0bGVmdD4KK2NvcHkgPSA8Q29tbWFuZC1LZXktYz4KK3Bhc3RlID0gPENvbW1hbmQtS2V5LXY+CitpbmRlbnQtcmVnaW9uID0gPENvbW1hbmQtS2V5LWJyYWNrZXRyaWdodD4KK2RlbC13b3JkLWxlZnQgPSA8T3B0aW9uLUtleS1CYWNrU3BhY2U+IDxPcHRpb24tQ29tbWFuZC1LZXktQmFja1NwYWNlPgorbmV3bGluZS1hbmQtaW5kZW50ID0gPEtleS1SZXR1cm4+IDxLZXktS1BfRW50ZXI+CitlbmQtb2YtZmlsZSA9IDxDb250cm9sLUtleS1kPgorb3Blbi1jbGFzcy1icm93c2VyID0gPENvbW1hbmQtS2V5LWI+CitvcGVuLW5ldy13aW5kb3cgPSA8Q29tbWFuZC1LZXktbj4KK29wZW4tbW9kdWxlID0gPENvbW1hbmQtS2V5LW0+CitmaW5kLXNlbGVjdGlvbiA9IDxTaGlmdC1Db21tYW5kLUtleS1GMz4KK3B5dGhvbi1jb250ZXh0LWhlbHAgPSA8U2hpZnQtS2V5LUYxPgorc2F2ZS1jb3B5LW9mLXdpbmRvdy1hcy1maWxlID0gPFNoaWZ0LUNvbW1hbmQtS2V5LXM+CitvcGVuLXdpbmRvdy1mcm9tLWZpbGUgPSA8Q29tbWFuZC1LZXktbz4KK3B5dGhvbi1kb2NzID0gPEtleS1GMT4KKwpkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ0hhbmRsZXIucHkKaW5kZXggMTkxYTg3Yy4uODI2ZmI1ZCAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvY29uZmlnSGFuZGxlci5weQorKysgYi9MaWIvaWRsZWxpYi9jb25maWdIYW5kbGVyLnB5CkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIGltcG9ydCBzdHJpbmcKK2ltcG9ydCBtYWNvc3hTdXBwb3J0CiBmcm9tIENvbmZpZ1BhcnNlciBpbXBvcnQgQ29uZmlnUGFyc2VyLCBOb09wdGlvbkVycm9yLCBOb1NlY3Rpb25FcnJvcgogCiBjbGFzcyBJbnZhbGlkQ29uZmlnVHlwZShFeGNlcHRpb24pOiBwYXNzCkBAIC00MDYsNyArNDA3LDcgQEAKICAgICAgICAgbmFtZXM9ZXh0bk5hbWVMaXN0CiAgICAgICAgIGtiTmFtZUluZGljaWVzPVtdCiAgICAgICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnX2JpbmRpbmdzJykgb3IgbmFtZS5lbmRzd2l0aCgnX2NmZ0JpbmRpbmdzJyk6CisgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCgnX2JpbmRpbmdzJywgJ19jZmdCaW5kaW5ncycpKToKICAgICAgICAgICAgICAgICBrYk5hbWVJbmRpY2llcy5hcHBlbmQobmFtZXMuaW5kZXgobmFtZSkpCiAgICAgICAgIGtiTmFtZUluZGljaWVzLnNvcnQoKQogICAgICAgICBrYk5hbWVJbmRpY2llcy5yZXZlcnNlKCkKQEAgLTQ5NSw3ICs0OTYsMTggQEAKICAgICAgICAgcmV0dXJuIGJpbmRpbmcKIAogICAgIGRlZiBHZXRDdXJyZW50S2V5U2V0KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5HZXRLZXlTZXQoc2VsZi5DdXJyZW50S2V5cygpKQorICAgICAgICByZXN1bHQgPSBzZWxmLkdldEtleVNldChzZWxmLkN1cnJlbnRLZXlzKCkpCisKKyAgICAgICAgaWYgbWFjb3N4U3VwcG9ydC5ydW5uaW5nQXNPU1hBcHAoKToKKyAgICAgICAgICAgICMgV2UncmUgdXNpbmcgQXF1YVRrLCByZXBsYWNlIGFsbCBrZXliaW5naW5ncyB0aGF0IHVzZSB0aGUKKyAgICAgICAgICAgICMgQWx0IGtleSBieSBvbmVzIHRoYXQgdXNlIHRoZSBPcHRpb24ga2V5IGJlY2F1c2UgdGhlIGZvcm1lcgorICAgICAgICAgICAgIyBkb24ndCB3b3JrIHJlbGlhYmx5LgorICAgICAgICAgICAgZm9yIGssIHYgaW4gcmVzdWx0Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgdjIgPSBbIHgucmVwbGFjZSgnPEFsdC0nLCAnPE9wdGlvbi0nKSBmb3IgeCBpbiB2IF0KKyAgICAgICAgICAgICAgICBpZiB2ICE9IHYyOgorICAgICAgICAgICAgICAgICAgICByZXN1bHRba10gPSB2MgorCisgICAgICAgIHJldHVybiByZXN1bHQKIAogICAgIGRlZiBHZXRLZXlTZXQoc2VsZixrZXlTZXROYW1lKToKICAgICAgICAgIiIiCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9jb25maWdIZWxwU291cmNlRWRpdC5weSBiL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CmluZGV4IDg5MjRmNzkuLjY2MTE2MjEgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CisrKyBiL0xpYi9pZGxlbGliL2NvbmZpZ0hlbHBTb3VyY2VFZGl0LnB5CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50PXNlbGYpCiAgICAgICAgICAgICBzZWxmLmVudHJ5UGF0aC5mb2N1c19zZXQoKQogICAgICAgICAgICAgcGF0aE9rID0gRmFsc2UKLSAgICAgICAgZWxpZiBwYXRoLnN0YXJ0c3dpdGgoJ3d3dy4nKSBvciBwYXRoLnN0YXJ0c3dpdGgoJ2h0dHAnKToKKyAgICAgICAgZWxpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cuJywgJ2h0dHAnKSk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBpZiBwYXRoWzo1XSA9PSAnZmlsZTonOgpAQCAtMTQ2LDggKzE0Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGguZ2V0KCkuc3RyaXAoKSkKICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnZGFyd2luJzoKICAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5yZXN1bHRbMV0KLSAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHN3aXRoKCd3d3cnKSBvciBwYXRoLnN0YXJ0c3dpdGgoJ2ZpbGU6JykKLSAgICAgICAgICAgICAgICAgICAgb3IgcGF0aC5zdGFydHN3aXRoKCdodHRwOicpKToKKyAgICAgICAgICAgICAgICBpZiBwYXRoLnN0YXJ0c3dpdGgoKCd3d3cnLCAnZmlsZTonLCAnaHR0cDonKSk6CiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAjIE1hYyBTYWZhcmkgaW5zaXN0cyBvbiB1c2luZyB0aGUgVVJJIGZvcm0gZm9yIGxvY2FsIGZpbGVzCmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5IGIvTGliL2lkbGVsaWIvaWRsZXZlci5weQppbmRleCBiN2RlYjNmLi4wN2QzZDgyIDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CisrKyBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKQEAgLTEgKzEgQEAKLUlETEVfVkVSU0lPTiA9ICIxLjJhMiIKK0lETEVfVkVSU0lPTiA9ICIxLjJiMyIKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkgYi9MaWIvaWRsZWxpYi9rZXliaW5kaW5nRGlhbG9nLnB5CmluZGV4IGVhNTc5NTguLmFmZjljYWMgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL2tleWJpbmRpbmdEaWFsb2cucHkKKysrIGIvTGliL2lkbGVsaWIva2V5YmluZGluZ0RpYWxvZy5weQpAQCAtMTMzLDcgKzEzMyw3IEBACiAgICAgICAgIGNvbmZpZy1rZXlzLmRlZiBtdXN0IHVzZSB0aGUgc2FtZSBvcmRlcmluZy4KICAgICAgICAgIiIiCiAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCBzeXMuZXhlY3V0YWJsZS5jb3VudCgnLmFwcCcpOgorICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2RhcndpbicgYW5kIHN5cy5hcmd2WzBdLmNvdW50KCcuYXBwJyk6CiAgICAgICAgICAgICBzZWxmLm1vZGlmaWVycyA9IFsnU2hpZnQnLCAnQ29udHJvbCcsICdPcHRpb24nLCAnQ29tbWFuZCddCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLm1vZGlmaWVycyA9IFsnQ29udHJvbCcsICdBbHQnLCAnU2hpZnQnXQpAQCAtMjAyLDcgKzIwMiw3IEBACiAgICAgICAgICAgICAgICAgJzonOidjb2xvbicsJywnOidjb21tYScsJy4nOidwZXJpb2QnLCc8JzonbGVzcycsJz4nOidncmVhdGVyJywKICAgICAgICAgICAgICAgICAnLyc6J3NsYXNoJywnPyc6J3F1ZXN0aW9uJywnUGFnZSBVcCc6J1ByaW9yJywnUGFnZSBEb3duJzonTmV4dCcsCiAgICAgICAgICAgICAgICAgJ0xlZnQgQXJyb3cnOidMZWZ0JywnUmlnaHQgQXJyb3cnOidSaWdodCcsJ1VwIEFycm93JzonVXAnLAotICAgICAgICAgICAgICAgICdEb3duIEFycm93JzogJ0Rvd24nLCAnVGFiJzondGFiJ30KKyAgICAgICAgICAgICAgICAnRG93biBBcnJvdyc6ICdEb3duJywgJ1RhYic6J1RhYid9CiAgICAgICAgIGlmIGtleSBpbiB0cmFuc2xhdGVEaWN0LmtleXMoKToKICAgICAgICAgICAgIGtleSA9IHRyYW5zbGF0ZURpY3Rba2V5XQogICAgICAgICBpZiAnU2hpZnQnIGluIG1vZGlmaWVycyBhbmQga2V5IGluIHN0cmluZy5hc2NpaV9sb3dlcmNhc2U6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9tYWNvc3hTdXBwb3J0LnB5IGIvTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDYxZmZmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2lkbGVsaWIvbWFjb3N4U3VwcG9ydC5weQpAQCAtMCwwICsxLDExMiBAQAorIiIiCitBIG51bWJlciBvZiBmdW5jdGlvbiB0aGF0IGVuaGFuY2UgSURMRSBvbiBNYWNPU1ggd2hlbiBpdCB1c2VkIGFzIGEgbm9ybWFsCitHVUkgYXBwbGljYXRpb24gKGFzIG9wcG9zZWQgdG8gYW4gWDExIGFwcGxpY2F0aW9uKS4KKyIiIgoraW1wb3J0IHN5cworCitkZWYgcnVubmluZ0FzT1NYQXBwKCk6CisgICAgIiIiIFJldHVybnMgVHJ1ZSBpZmYgcnVubmluZyBmcm9tIHRoZSBJRExFLmFwcCBidW5kbGUgb24gT1NYICIiIgorICAgIHJldHVybiAoc3lzLnBsYXRmb3JtID09ICdkYXJ3aW4nIGFuZCAnSURMRS5hcHAnIGluIHN5cy5hcmd2WzBdKQorCitkZWYgYWRkT3BlbkV2ZW50U3VwcG9ydChyb290LCBmbGlzdCk6CisgICAgIiIiCisgICAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVzcG9udCB0byBvcGVuIEFwcGxlRXZlbnRzLCB3aGljaAorICAgIG1ha2VzIGlzIGZlYXNlYWJsZSB0byB1c2UgSURMRSBhcyB0aGUgZGVmYXVsdCBhcHBsaWNhdGlvbiBmb3IgcHl0aG9uIGZpbGVzLgorICAgICIiIgorICAgIGRlZiBkb09wZW5GaWxlKCphcmdzKToKKyAgICAgICAgZm9yIGZuIGluIGFyZ3M6CisgICAgICAgICAgICBmbGlzdC5vcGVuKGZuKQorCisgICAgIyBUaGUgY29tbWFuZCBiZWxvdyBpcyBhIGhvb2sgaW4gYXF1YXRrIHRoYXQgaXMgY2FsbGVkIHdoZW5ldmVyIHRoZSBhcHAKKyAgICAjIHJlY2VpdmVzIGEgZmlsZSBvcGVuIGV2ZW50LiBUaGUgY2FsbGJhY2sgY2FuIGhhdmUgbXVsdGlwbGUgYXJndW1lbnRzLAorICAgICMgb25lIGZvciBldmVyeSBmaWxlIHRoYXQgc2hvdWxkIGJlIG9wZW5lZC4KKyAgICByb290LmNyZWF0ZWNvbW1hbmQoIjo6dGs6Om1hYzo6T3BlbkRvY3VtZW50IiwgZG9PcGVuRmlsZSkKKworZGVmIGhpZGVUa0NvbnNvbGUocm9vdCk6CisgICAgcm9vdC50ay5jYWxsKCdjb25zb2xlJywgJ2hpZGUnKQorCitkZWYgb3ZlcnJpZGVSb290TWVudShyb290LCBmbGlzdCk6CisgICAgIiIiCisgICAgUmVwbGFjZSB0aGUgVGsgcm9vdCBtZW51IGJ5IHNvbWV0aGluZyB0aGF0J3MgbW9yZSBhcHByb3ByaWF0ZSBmb3IKKyAgICBJRExFLgorICAgICIiIgorICAgICMgVGhlIG1lbnUgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgVGsgcm9vdCAoIi4iKSBpcyBhbHNvIHVzZWQgYnkgQXF1YVRrIGZvcgorICAgICMgYWxsIHdpbmRvd3MgdGhhdCBkb24ndCBzcGVjaWZ5IGEgbWVudSBvZiB0aGVpciBvd24uIFRoZSBkZWZhdWx0IG1lbnViYXIKKyAgICAjIGNvbnRhaW5zIGEgbnVtYmVyIG9mIG1lbnVzLCBub25lIG9mIHdoaWNoIGFyZSBhcHByb3ByaWF0ZSBmb3IgSURMRS4gVGhlCisgICAgIyBNb3N0IGFubm95aW5nIG9mIHRob3NlIGlzIGFuICdBYm91dCBUY2svVGsuLi4nIG1lbnUgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgIyBtZW51LgorICAgICMKKyAgICAjIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIGRlZmF1bHQgbWVudWJhciBieSBhIG1vc3RseSBlbXB0eSBvbmUsIGl0CisgICAgIyBzaG91bGQgb25seSBjb250YWluIHRoZSBjb3JyZWN0IGFwcGxpY2F0aW9uIG1lbnUgYW5kIHRoZSB3aW5kb3cgbWVudS4KKyAgICAjCisgICAgIyBEdWUgdG8gYSAobWlzLSlmZWF0dXJlIG9mIFRrQXF1YSB0aGUgdXNlciB3aWxsIGFsc28gc2VlIGFuIGVtcHR5IEhlbHAKKyAgICAjIG1lbnUuCisgICAgZnJvbSBUa2ludGVyIGltcG9ydCBNZW51LCBUZXh0LCBUZXh0CisgICAgZnJvbSBFZGl0b3JXaW5kb3cgaW1wb3J0IHByZXBzdHIsIGdldF9hY2NlbGVyYXRvcgorICAgIGltcG9ydCBCaW5kaW5ncworICAgIGltcG9ydCBXaW5kb3dMaXN0CisgICAgZnJvbSBNdWx0aUNhbGwgaW1wb3J0IE11bHRpQ2FsbENyZWF0b3IKKworICAgIG1lbnViYXIgPSBNZW51KHJvb3QpCisgICAgcm9vdC5jb25maWd1cmUobWVudT1tZW51YmFyKQorICAgIG1lbnVkaWN0ID0ge30KKworICAgIG1lbnVkaWN0Wyd3aW5kb3dzJ10gPSBtZW51ID0gTWVudShtZW51YmFyLCBuYW1lPSd3aW5kb3dzJykKKyAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdXaW5kb3cnLCBtZW51PW1lbnUsIHVuZGVybGluZT0wKQorCisgICAgZGVmIHBvc3R3aW5kb3dzbWVudShtZW51PW1lbnUpOgorICAgICAgICBlbmQgPSBtZW51LmluZGV4KCdlbmQnKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IC0xCisKKyAgICAgICAgaWYgZW5kID4gMDoKKyAgICAgICAgICAgIG1lbnUuZGVsZXRlKDAsIGVuZCkKKyAgICAgICAgV2luZG93TGlzdC5hZGRfd2luZG93c190b19tZW51KG1lbnUpCisgICAgV2luZG93TGlzdC5yZWdpc3Rlcl9jYWxsYmFjayhwb3N0d2luZG93c21lbnUpCisKKyAgICBtZW51ZGljdFsnYXBwbGljYXRpb24nXSA9IG1lbnUgPSBNZW51KG1lbnViYXIsIG5hbWU9J2FwcGxlJykKKyAgICBtZW51YmFyLmFkZF9jYXNjYWRlKGxhYmVsPSdJRExFJywgbWVudT1tZW51KQorCisgICAgZGVmIGFib3V0X2RpYWxvZyhldmVudD1Ob25lKToKKyAgICAgICAgaW1wb3J0IGFib3V0RGlhbG9nCisgICAgICAgIGFib3V0RGlhbG9nLkFib3V0RGlhbG9nKHJvb3QsICdBYm91dCBJRExFJykKKworICAgIGRlZiBjb25maWdfZGlhbG9nKGV2ZW50PU5vbmUpOgorICAgICAgICBpbXBvcnQgY29uZmlnRGlhbG9nCisgICAgICAgIGNvbmZpZ0RpYWxvZy5Db25maWdEaWFsb2cocm9vdCwgJ1NldHRpbmdzJykKKworICAgIHJvb3QuYmluZCgnPDxhYm91dC1pZGxlPj4nLCBhYm91dF9kaWFsb2cpCisgICAgcm9vdC5iaW5kKCc8PG9wZW4tY29uZmlnLWRpYWxvZz4+JywgY29uZmlnX2RpYWxvZykKKyAgICBpZiBmbGlzdDoKKyAgICAgICAgcm9vdC5iaW5kKCc8PGNsb3NlLWFsbC13aW5kb3dzPj4nLCBmbGlzdC5jbG9zZV9hbGxfY2FsbGJhY2spCisKKyAgICBmb3IgbW5hbWUsIGVudHJ5bGlzdCBpbiBCaW5kaW5ncy5tZW51ZGVmczoKKyAgICAgICAgbWVudSA9IG1lbnVkaWN0LmdldChtbmFtZSkKKyAgICAgICAgaWYgbm90IG1lbnU6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBmb3IgZW50cnkgaW4gZW50cnlsaXN0OgorICAgICAgICAgICAgaWYgbm90IGVudHJ5OgorICAgICAgICAgICAgICAgIG1lbnUuYWRkX3NlcGFyYXRvcigpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxhYmVsLCBldmVudG5hbWUgPSBlbnRyeQorICAgICAgICAgICAgICAgIHVuZGVybGluZSwgbGFiZWwgPSBwcmVwc3RyKGxhYmVsKQorICAgICAgICAgICAgICAgIGFjY2VsZXJhdG9yID0gZ2V0X2FjY2VsZXJhdG9yKEJpbmRpbmdzLmRlZmF1bHRfa2V5ZGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50bmFtZSkKKyAgICAgICAgICAgICAgICBkZWYgY29tbWFuZCh0ZXh0PXJvb3QsIGV2ZW50bmFtZT1ldmVudG5hbWUpOgorICAgICAgICAgICAgICAgICAgICB0ZXh0LmV2ZW50X2dlbmVyYXRlKGV2ZW50bmFtZSkKKyAgICAgICAgICAgICAgICBtZW51LmFkZF9jb21tYW5kKGxhYmVsPWxhYmVsLCB1bmRlcmxpbmU9dW5kZXJsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZD1jb21tYW5kLCBhY2NlbGVyYXRvcj1hY2NlbGVyYXRvcikKKworCisKKworCitkZWYgc2V0dXBBcHAocm9vdCwgZmxpc3QpOgorICAgICIiIgorICAgIFBlcmZvcm0gc2V0dXAgZm9yIHRoZSBPU1ggYXBwbGljYXRpb24gYnVuZGxlLgorICAgICIiIgorICAgIGlmIG5vdCBydW5uaW5nQXNPU1hBcHAoKTogcmV0dXJuCisKKyAgICBoaWRlVGtDb25zb2xlKHJvb3QpCisgICAgb3ZlcnJpZGVSb290TWVudShyb290LCBmbGlzdCkKKyAgICBhZGRPcGVuRXZlbnRTdXBwb3J0KHJvb3QsIGZsaXN0KQpkaWZmIC0tZ2l0IGEvTGliL2luc3BlY3QucHkgYi9MaWIvaW5zcGVjdC5weQppbmRleCBiZjdmMDA2Li4wYjQ5OGI1IDEwMDY0NAotLS0gYS9MaWIvaW5zcGVjdC5weQorKysgYi9MaWIvaW5zcGVjdC5weQpAQCAtODksNiArODksNDAgQEAKICAgICBpcyBub3QgZ3VhcmFudGVlZC4iIiIKICAgICByZXR1cm4gKGhhc2F0dHIob2JqZWN0LCAiX19zZXRfXyIpIGFuZCBoYXNhdHRyKG9iamVjdCwgIl9fZ2V0X18iKSkKIAoraWYgaGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyk6CisgICAgIyBDUHl0aG9uIGFuZCBlcXVpdmFsZW50CisgICAgZGVmIGlzbWVtYmVyZGVzY3JpcHRvcihvYmplY3QpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgbWVtYmVyIGRlc2NyaXB0b3IuCisKKyAgICAgICAgTWVtYmVyIGRlc2NyaXB0b3JzIGFyZSBzcGVjaWFsaXplZCBkZXNjcmlwdG9ycyBkZWZpbmVkIGluIGV4dGVuc2lvbgorICAgICAgICBtb2R1bGVzLiIiIgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvYmplY3QsIHR5cGVzLk1lbWJlckRlc2NyaXB0b3JUeXBlKQorZWxzZToKKyAgICAjIE90aGVyIGltcGxlbWVudGF0aW9ucworICAgIGRlZiBpc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIG1lbWJlciBkZXNjcmlwdG9yLgorCisgICAgICAgIE1lbWJlciBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2lmIGhhc2F0dHIodHlwZXMsICdHZXRTZXREZXNjcmlwdG9yVHlwZScpOgorICAgICMgQ1B5dGhvbiBhbmQgZXF1aXZhbGVudAorICAgIGRlZiBpc2dldHNldGRlc2NyaXB0b3Iob2JqZWN0KToKKyAgICAgICAgIiIiUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIGdldHNldCBkZXNjcmlwdG9yLgorCisgICAgICAgIGdldHNldCBkZXNjcmlwdG9ycyBhcmUgc3BlY2lhbGl6ZWQgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBleHRlbnNpb24KKyAgICAgICAgbW9kdWxlcy4iIiIKKyAgICAgICAgcmV0dXJuIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5HZXRTZXREZXNjcmlwdG9yVHlwZSkKK2Vsc2U6CisgICAgIyBPdGhlciBpbXBsZW1lbnRhdGlvbnMKKyAgICBkZWYgaXNnZXRzZXRkZXNjcmlwdG9yKG9iamVjdCk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSBnZXRzZXQgZGVzY3JpcHRvci4KKworICAgICAgICBnZXRzZXQgZGVzY3JpcHRvcnMgYXJlIHNwZWNpYWxpemVkIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gZXh0ZW5zaW9uCisgICAgICAgIG1vZHVsZXMuIiIiCisgICAgICAgIHJldHVybiBGYWxzZQorCiBkZWYgaXNmdW5jdGlvbihvYmplY3QpOgogICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBvYmplY3QgaXMgYSB1c2VyLWRlZmluZWQgZnVuY3Rpb24uCiAKQEAgLTM1NSw0MCArMzg5LDM4IEBACiAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgIGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKICAgICAgICAgcmV0dXJuIGZpbGVuYW1lCi0gICAgIyBVZ2x5IGJ1dCBuZWNlc3NhcnkgLSAnPHN0ZGluPicgYW5kICc8c3RyaW5nPicgbWVhbiB0aGF0IGdldG1vZHVsZSgpCi0gICAgIyB3b3VsZCBpbmZpbml0ZWx5IHJlY3Vyc2UsIGJlY2F1c2UgdGhleSdyZSBub3QgcmVhbCBmaWxlcyBub3IgbG9hZGFibGUKLSAgICAjIE5vdGUgdGhhdCB0aGlzIG1lYW5zIHRoYXQgd3JpdGluZyBhIFBFUCAzMDIgbG9hZGVyIHRoYXQgdXNlcyAnPCcKLSAgICAjIGF0IHRoZSBzdGFydCBvZiBhIGZpbGVuYW1lIGlzIG5vdyBub3QgYSBnb29kIGlkZWEuICA6KAotICAgIGlmIGZpbGVuYW1lWzoxXSE9JzwnIGFuZCBoYXNhdHRyKGdldG1vZHVsZShvYmplY3QpLCAnX19sb2FkZXJfXycpOgorICAgICMgb25seSByZXR1cm4gYSBub24tZXhpc3RlbnQgZmlsZW5hbWUgaWYgdGhlIG1vZHVsZSBoYXMgYSBQRVAgMzAyIGxvYWRlcgorICAgIGlmIGhhc2F0dHIoZ2V0bW9kdWxlKG9iamVjdCwgZmlsZW5hbWUpLCAnX19sb2FkZXJfXycpOgogICAgICAgICByZXR1cm4gZmlsZW5hbWUKIAotZGVmIGdldGFic2ZpbGUob2JqZWN0KToKK2RlZiBnZXRhYnNmaWxlKG9iamVjdCwgX2ZpbGVuYW1lPU5vbmUpOgogICAgICIiIlJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBzb3VyY2Ugb3IgY29tcGlsZWQgZmlsZSBmb3IgYW4gb2JqZWN0LgogCiAgICAgVGhlIGlkZWEgaXMgZm9yIGVhY2ggb2JqZWN0IHRvIGhhdmUgYSB1bmlxdWUgb3JpZ2luLCBzbyB0aGlzIHJvdXRpbmUKICAgICBub3JtYWxpemVzIHRoZSByZXN1bHQgYXMgbXVjaCBhcyBwb3NzaWJsZS4iIiIKLSAgICByZXR1cm4gb3MucGF0aC5ub3JtY2FzZSgKLSAgICAgICAgb3MucGF0aC5hYnNwYXRoKGdldHNvdXJjZWZpbGUob2JqZWN0KSBvciBnZXRmaWxlKG9iamVjdCkpKQorICAgIGlmIF9maWxlbmFtZSBpcyBOb25lOgorICAgICAgICBfZmlsZW5hbWUgPSBnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpCisgICAgcmV0dXJuIG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5hYnNwYXRoKF9maWxlbmFtZSkpCiAKIG1vZHVsZXNieWZpbGUgPSB7fQogCi1kZWYgZ2V0bW9kdWxlKG9iamVjdCk6CitkZWYgZ2V0bW9kdWxlKG9iamVjdCwgX2ZpbGVuYW1lPU5vbmUpOgogICAgICIiIlJldHVybiB0aGUgbW9kdWxlIGFuIG9iamVjdCB3YXMgZGVmaW5lZCBpbiwgb3IgTm9uZSBpZiBub3QgZm91bmQuIiIiCiAgICAgaWYgaXNtb2R1bGUob2JqZWN0KToKICAgICAgICAgcmV0dXJuIG9iamVjdAogICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19tb2R1bGVfXycpOgogICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG9iamVjdC5fX21vZHVsZV9fKQogICAgIHRyeToKLSAgICAgICAgZmlsZSA9IGdldGFic2ZpbGUob2JqZWN0KQorICAgICAgICBmaWxlID0gZ2V0YWJzZmlsZShvYmplY3QsIF9maWxlbmFtZSkKICAgICBleGNlcHQgVHlwZUVycm9yOgogICAgICAgICByZXR1cm4gTm9uZQogICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQogICAgIGZvciBtb2R1bGUgaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6CiAgICAgICAgIGlmIGlzbW9kdWxlKG1vZHVsZSkgYW5kIGhhc2F0dHIobW9kdWxlLCAnX19maWxlX18nKToKLSAgICAgICAgICAgIG1vZHVsZXNieWZpbGVbCi0gICAgICAgICAgICAgICAgb3MucGF0aC5yZWFscGF0aCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldGFic2ZpbGUobW9kdWxlKSldID0gbW9kdWxlLl9fbmFtZV9fCisgICAgICAgICAgICBmID0gZ2V0YWJzZmlsZShtb2R1bGUpCisgICAgICAgICAgICBtb2R1bGVzYnlmaWxlW2ZdID0gbW9kdWxlc2J5ZmlsZVsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLnJlYWxwYXRoKGYpXSA9IG1vZHVsZS5fX25hbWVfXwogICAgIGlmIGZpbGUgaW4gbW9kdWxlc2J5ZmlsZToKICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzLmdldChtb2R1bGVzYnlmaWxlW2ZpbGVdKQogICAgIG1haW4gPSBzeXMubW9kdWxlc1snX19tYWluX18nXQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay9Ua2ludGVyLnB5IGIvTGliL2xpYi10ay9Ua2ludGVyLnB5CmluZGV4IDBiYTk1NGUuLmIyNDgwMzEgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvVGtpbnRlci5weQorKysgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKQEAgLTE2OCwxOCArMTY4LDMwIEBACiAgICAgU3ViY2xhc3NlcyBTdHJpbmdWYXIsIEludFZhciwgRG91YmxlVmFyLCBCb29sZWFuVmFyIGFyZSBzcGVjaWFsaXphdGlvbnMKICAgICB0aGF0IGNvbnN0cmFpbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBnZXQoKS4iIiIKICAgICBfZGVmYXVsdCA9ICIiCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lKToKLSAgICAgICAgIiIiQ29uc3RydWN0IGEgdmFyaWFibGUgd2l0aCBhbiBvcHRpb25hbCBNQVNURVIgYXMgbWFzdGVyIHdpZGdldC4KLSAgICAgICAgVGhlIHZhcmlhYmxlIGlzIG5hbWVkIFBZX1ZBUl9udW1iZXIgaW4gVGNsLgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKKyAgICAgICAgIiIiQ29uc3RydWN0IGEgdmFyaWFibGUKKworICAgICAgICBNQVNURVIgY2FuIGJlIGdpdmVuIGFzIG1hc3RlciB3aWRnZXQuCisgICAgICAgIFZBTFVFIGlzIGFuIG9wdGlvbmFsIHZhbHVlIChkZWZhdWx0cyB0byAiIikKKyAgICAgICAgTkFNRSBpcyBhbiBvcHRpb25hbCBUY2wgbmFtZSAoZGVmYXVsdHMgdG8gUFlfVkFSbnVtKS4KKworICAgICAgICBJZiBOQU1FIG1hdGNoZXMgYW4gZXhpc3RpbmcgdmFyaWFibGUgYW5kIFZBTFVFIGlzIG9taXR0ZWQKKyAgICAgICAgdGhlbiB0aGUgZXhpc3RpbmcgdmFsdWUgaXMgcmV0YWluZWQuCiAgICAgICAgICIiIgogICAgICAgICBnbG9iYWwgX3Zhcm51bQogICAgICAgICBpZiBub3QgbWFzdGVyOgogICAgICAgICAgICAgbWFzdGVyID0gX2RlZmF1bHRfcm9vdAogICAgICAgICBzZWxmLl9tYXN0ZXIgPSBtYXN0ZXIKICAgICAgICAgc2VsZi5fdGsgPSBtYXN0ZXIudGsKLSAgICAgICAgc2VsZi5fbmFtZSA9ICdQWV9WQVInICsgcmVwcihfdmFybnVtKQotICAgICAgICBfdmFybnVtID0gX3Zhcm51bSArIDEKLSAgICAgICAgc2VsZi5zZXQoc2VsZi5fZGVmYXVsdCkKKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIHNlbGYuX25hbWUgPSBuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9uYW1lID0gJ1BZX1ZBUicgKyByZXByKF92YXJudW0pCisgICAgICAgICAgICBfdmFybnVtICs9IDEKKyAgICAgICAgaWYgdmFsdWUgIT0gTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2V0KHZhbHVlKQorICAgICAgICBlbGlmIG5vdCBzZWxmLl90ay5jYWxsKCJpbmZvIiwgImV4aXN0cyIsIHNlbGYuX25hbWUpOgorICAgICAgICAgICAgc2VsZi5zZXQoc2VsZi5fZGVmYXVsdCkKICAgICBkZWYgX19kZWxfXyhzZWxmKToKICAgICAgICAgIiIiVW5zZXQgdGhlIHZhcmlhYmxlIGluIFRjbC4iIiIKICAgICAgICAgc2VsZi5fdGsuZ2xvYmFsdW5zZXR2YXIoc2VsZi5fbmFtZSkKQEAgLTIxNywxNSArMjI5LDI5IEBACiAgICAgICAgICIiIlJldHVybiBhbGwgdHJhY2UgY2FsbGJhY2sgaW5mb3JtYXRpb24uIiIiCiAgICAgICAgIHJldHVybiBtYXAoc2VsZi5fdGsuc3BsaXQsIHNlbGYuX3RrLnNwbGl0bGlzdCgKICAgICAgICAgICAgIHNlbGYuX3RrLmNhbGwoInRyYWNlIiwgInZpbmZvIiwgc2VsZi5fbmFtZSkpKQorICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAiIiJDb21wYXJpc29uIGZvciBlcXVhbGl0eSAoPT0pLgorCisgICAgICAgIE5vdGU6IGlmIHRoZSBWYXJpYWJsZSdzIG1hc3RlciBtYXR0ZXJzIHRvIGJlaGF2aW9yCisgICAgICAgIGFsc28gY29tcGFyZSBzZWxmLl9tYXN0ZXIgPT0gb3RoZXIuX21hc3RlcgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fID09IG90aGVyLl9fY2xhc3NfXy5fX25hbWVfXyBcCisgICAgICAgICAgICBhbmQgc2VsZi5fbmFtZSA9PSBvdGhlci5fbmFtZQogCiBjbGFzcyBTdHJpbmdWYXIoVmFyaWFibGUpOgogICAgICIiIlZhbHVlIGhvbGRlciBmb3Igc3RyaW5ncyB2YXJpYWJsZXMuIiIiCiAgICAgX2RlZmF1bHQgPSAiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCB2YWx1ZT1Ob25lLCBuYW1lPU5vbmUpOgogICAgICAgICAiIiJDb25zdHJ1Y3QgYSBzdHJpbmcgdmFyaWFibGUuCiAKLSAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvICIiKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdmFsdWUgb2YgdmFyaWFibGUgYXMgc3RyaW5nLiIiIgpAQCAtMjM3LDExICsyNjMsMTcgQEAKIGNsYXNzIEludFZhcihWYXJpYWJsZSk6CiAgICAgIiIiVmFsdWUgaG9sZGVyIGZvciBpbnRlZ2VyIHZhcmlhYmxlcy4iIiIKICAgICBfZGVmYXVsdCA9IDAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0IGFuIGludGVnZXIgdmFyaWFibGUuCiAKLSAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LiIiIgotICAgICAgICBWYXJpYWJsZS5fX2luaXRfXyhzZWxmLCBtYXN0ZXIpCisgICAgICAgIE1BU1RFUiBjYW4gYmUgZ2l2ZW4gYXMgbWFzdGVyIHdpZGdldC4KKyAgICAgICAgVkFMVUUgaXMgYW4gb3B0aW9uYWwgdmFsdWUgKGRlZmF1bHRzIHRvIDApCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YWx1ZSwgbmFtZSkKIAogICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgogICAgICAgICAiIiJTZXQgdGhlIHZhcmlhYmxlIHRvIHZhbHVlLCBjb252ZXJ0aW5nIGJvb2xlYW5zIHRvIGludGVnZXJzLiIiIgpAQCAtMjU2LDExICsyODgsMTcgQEAKIGNsYXNzIERvdWJsZVZhcihWYXJpYWJsZSk6CiAgICAgIiIiVmFsdWUgaG9sZGVyIGZvciBmbG9hdCB2YXJpYWJsZXMuIiIiCiAgICAgX2RlZmF1bHQgPSAwLjAKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgdmFsdWU9Tm9uZSwgbmFtZT1Ob25lKToKICAgICAgICAgIiIiQ29uc3RydWN0IGEgZmxvYXQgdmFyaWFibGUuCiAKLSAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBhIG1hc3RlciB3aWRnZXQuIiIiCi0gICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gMC4wKQorICAgICAgICBOQU1FIGlzIGFuIG9wdGlvbmFsIFRjbCBuYW1lIChkZWZhdWx0cyB0byBQWV9WQVJudW0pLgorCisgICAgICAgIElmIE5BTUUgbWF0Y2hlcyBhbiBleGlzdGluZyB2YXJpYWJsZSBhbmQgVkFMVUUgaXMgb21pdHRlZAorICAgICAgICB0aGVuIHRoZSBleGlzdGluZyB2YWx1ZSBpcyByZXRhaW5lZC4KKyAgICAgICAgIiIiCisgICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlciwgdmFsdWUsIG5hbWUpCiAKICAgICBkZWYgZ2V0KHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBhcyBhIGZsb2F0LiIiIgpAQCAtMjY4LDEyICszMDYsMTggQEAKIAogY2xhc3MgQm9vbGVhblZhcihWYXJpYWJsZSk6CiAgICAgIiIiVmFsdWUgaG9sZGVyIGZvciBib29sZWFuIHZhcmlhYmxlcy4iIiIKLSAgICBfZGVmYXVsdCA9ICJmYWxzZSIKLSAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUpOgorICAgIF9kZWZhdWx0ID0gRmFsc2UKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyPU5vbmUsIHZhbHVlPU5vbmUsIG5hbWU9Tm9uZSk6CiAgICAgICAgICIiIkNvbnN0cnVjdCBhIGJvb2xlYW4gdmFyaWFibGUuCiAKLSAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBhIG1hc3RlciB3aWRnZXQuIiIiCi0gICAgICAgIFZhcmlhYmxlLl9faW5pdF9fKHNlbGYsIG1hc3RlcikKKyAgICAgICAgTUFTVEVSIGNhbiBiZSBnaXZlbiBhcyBtYXN0ZXIgd2lkZ2V0LgorICAgICAgICBWQUxVRSBpcyBhbiBvcHRpb25hbCB2YWx1ZSAoZGVmYXVsdHMgdG8gRmFsc2UpCisgICAgICAgIE5BTUUgaXMgYW4gb3B0aW9uYWwgVGNsIG5hbWUgKGRlZmF1bHRzIHRvIFBZX1ZBUm51bSkuCisKKyAgICAgICAgSWYgTkFNRSBtYXRjaGVzIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGFuZCBWQUxVRSBpcyBvbWl0dGVkCisgICAgICAgIHRoZW4gdGhlIGV4aXN0aW5nIHZhbHVlIGlzIHJldGFpbmVkLgorICAgICAgICAiIiIKKyAgICAgICAgVmFyaWFibGUuX19pbml0X18oc2VsZiwgbWFzdGVyLCB2YWx1ZSwgbmFtZSkKIAogICAgIGRlZiBnZXQoc2VsZik6CiAgICAgICAgICIiIlJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGFzIGEgYm9vbC4iIiIKQEAgLTE0NTYsMTAgKzE1MDAsMTkgQEAKICAgICAgICAgdGhlIGdyb3VwIGxlYWRlciBvZiB0aGlzIHdpZGdldCBpZiBOb25lIGlzIGdpdmVuLiIiIgogICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCd3bScsICdncm91cCcsIHNlbGYuX3csIHBhdGhOYW1lKQogICAgIGdyb3VwID0gd21fZ3JvdXAKLSAgICBkZWYgd21faWNvbmJpdG1hcChzZWxmLCBiaXRtYXA9Tm9uZSk6CisgICAgZGVmIHdtX2ljb25iaXRtYXAoc2VsZiwgYml0bWFwPU5vbmUsIGRlZmF1bHQ9Tm9uZSk6CiAgICAgICAgICIiIlNldCBiaXRtYXAgZm9yIHRoZSBpY29uaWZpZWQgd2lkZ2V0IHRvIEJJVE1BUC4gUmV0dXJuCi0gICAgICAgIHRoZSBiaXRtYXAgaWYgTm9uZSBpcyBnaXZlbi4iIiIKLSAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbmJpdG1hcCcsIHNlbGYuX3csIGJpdG1hcCkKKyAgICAgICAgdGhlIGJpdG1hcCBpZiBOb25lIGlzIGdpdmVuLgorCisgICAgICAgIFVuZGVyIFdpbmRvd3MsIHRoZSBERUZBVUxUIHBhcmFtZXRlciBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIGljb24KKyAgICAgICAgZm9yIHRoZSB3aWRnZXQgYW5kIGFueSBkZXNjZW5kZW50cyB0aGF0IGRvbid0IGhhdmUgYW4gaWNvbiBzZXQKKyAgICAgICAgZXhwbGljaXRseS4gIERFRkFVTFQgY2FuIGJlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIGEgLmljbyBmaWxlCisgICAgICAgIChleGFtcGxlOiByb290Lmljb25iaXRtYXAoZGVmYXVsdD0nbXlpY29uLmljbycpICkuICBTZWUgVGsKKyAgICAgICAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4iIiIKKyAgICAgICAgaWYgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoJ3dtJywgJ2ljb25iaXRtYXAnLCBzZWxmLl93LCAnLWRlZmF1bHQnLCBkZWZhdWx0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbCgnd20nLCAnaWNvbmJpdG1hcCcsIHNlbGYuX3csIGJpdG1hcCkKICAgICBpY29uYml0bWFwID0gd21faWNvbmJpdG1hcAogICAgIGRlZiB3bV9pY29uaWZ5KHNlbGYpOgogICAgICAgICAiIiJEaXNwbGF5IHdpZGdldCBhcyBpY29uLiIiIgpAQCAtMTg4MCw5ICsxOTMzLDkgQEAKICAgICBkZWYgZGVzdHJveShzZWxmKToKICAgICAgICAgIiIiRGVzdHJveSB0aGlzIGFuZCBhbGwgZGVzY2VuZGFudHMgd2lkZ2V0cy4iIiIKICAgICAgICAgZm9yIGMgaW4gc2VsZi5jaGlsZHJlbi52YWx1ZXMoKTogYy5kZXN0cm95KCkKKyAgICAgICAgc2VsZi50ay5jYWxsKCdkZXN0cm95Jywgc2VsZi5fdykKICAgICAgICAgaWYgc2VsZi5tYXN0ZXIuY2hpbGRyZW4uaGFzX2tleShzZWxmLl9uYW1lKToKICAgICAgICAgICAgIGRlbCBzZWxmLm1hc3Rlci5jaGlsZHJlbltzZWxmLl9uYW1lXQotICAgICAgICBzZWxmLnRrLmNhbGwoJ2Rlc3Ryb3knLCBzZWxmLl93KQogICAgICAgICBNaXNjLmRlc3Ryb3koc2VsZikKICAgICBkZWYgX2RvKHNlbGYsIG5hbWUsIGFyZ3M9KCkpOgogICAgICAgICAjIFhYWCBPYnNvbGV0ZSAtLSBiZXR0ZXIgdXNlIHNlbGYudGsuY2FsbCBkaXJlY3RseSEKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGtNZXNzYWdlQm94LnB5IGIvTGliL2xpYi10ay90a01lc3NhZ2VCb3gucHkKaW5kZXggMjUwNzFmZS4uYWZmMDY5YiAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90a01lc3NhZ2VCb3gucHkKKysrIGIvTGliL2xpYi10ay90a01lc3NhZ2VCb3gucHkKQEAgLTYzLDkgKzYzLDEwIEBACiAjCiAjIGNvbnZlbmllbmNlIHN0dWZmCiAKLWRlZiBfc2hvdyh0aXRsZT1Ob25lLCBtZXNzYWdlPU5vbmUsIGljb249Tm9uZSwgdHlwZT1Ob25lLCAqKm9wdGlvbnMpOgotICAgIGlmIGljb246ICAgIG9wdGlvbnNbImljb24iXSA9IGljb24KLSAgICBpZiB0eXBlOiAgICBvcHRpb25zWyJ0eXBlIl0gPSB0eXBlCisjIFJlbmFtZSBfaWNvbiBhbmQgX3R5cGUgb3B0aW9ucyB0byBhbGxvdyBvdmVycmlkaW5nIHRoZW0gaW4gb3B0aW9ucworZGVmIF9zaG93KHRpdGxlPU5vbmUsIG1lc3NhZ2U9Tm9uZSwgX2ljb249Tm9uZSwgX3R5cGU9Tm9uZSwgKipvcHRpb25zKToKKyAgICBpZiBfaWNvbiBhbmQgImljb24iIG5vdCBpbiBvcHRpb25zOiAgICBvcHRpb25zWyJpY29uIl0gPSBfaWNvbgorICAgIGlmIF90eXBlIGFuZCAidHlwZSIgbm90IGluIG9wdGlvbnM6ICAgIG9wdGlvbnNbInR5cGUiXSA9IF90eXBlCiAgICAgaWYgdGl0bGU6ICAgb3B0aW9uc1sidGl0bGUiXSA9IHRpdGxlCiAgICAgaWYgbWVzc2FnZTogb3B0aW9uc1sibWVzc2FnZSJdID0gbWVzc2FnZQogICAgIHJlcyA9IE1lc3NhZ2UoKipvcHRpb25zKS5zaG93KCkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdHVydGxlLnB5IGIvTGliL2xpYi10ay90dXJ0bGUucHkKaW5kZXggZDY4ZTQwNS4uMDFhNTViMSAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90dXJ0bGUucHkKKysrIGIvTGliL2xpYi10ay90dXJ0bGUucHkKQEAgLTMwLDYgKzMwLDcgQEAKICAgICAgICAgc2VsZi5fdHJhY2luZyA9IDEKICAgICAgICAgc2VsZi5fYXJyb3cgPSAwCiAgICAgICAgIHNlbGYuX2RlbGF5ID0gMTAgICAgICMgZGVmYXVsdCBkZWxheSBmb3IgZHJhd2luZworICAgICAgICBzZWxmLl9hbmdsZSA9IDAuMAogICAgICAgICBzZWxmLmRlZ3JlZXMoKQogICAgICAgICBzZWxmLnJlc2V0KCkKIApAQCAtMzksNiArNDAsMTAgQEAKICAgICAgICAgRXhhbXBsZToKICAgICAgICAgPj4+IHR1cnRsZS5kZWdyZWVzKCkKICAgICAgICAgIiIiCisgICAgICAgICMgRG9uJ3QgdHJ5IHRvIGNoYW5nZSBfYW5nbGUgaWYgaXQgaXMgMCwgYmVjYXVzZQorICAgICAgICAjIF9mdWxsY2lyY2xlIG1pZ2h0IG5vdCBiZSBzZXQsIHlldAorICAgICAgICBpZiBzZWxmLl9hbmdsZToKKyAgICAgICAgICAgIHNlbGYuX2FuZ2xlID0gKHNlbGYuX2FuZ2xlIC8gc2VsZi5fZnVsbGNpcmNsZSkgKiBmdWxsY2lyY2xlCiAgICAgICAgIHNlbGYuX2Z1bGxjaXJjbGUgPSBmdWxsY2lyY2xlCiAgICAgICAgIHNlbGYuX2ludnJhZGlhbiA9IHBpIC8gKGZ1bGxjaXJjbGUgKiAwLjUpCiAKQEAgLTgxLDcgKzg2LDYgQEAKICAgICAgICAgc2VsZi5fY29sb3IgPSAiYmxhY2siCiAgICAgICAgIHNlbGYuX2ZpbGxpbmcgPSAwCiAgICAgICAgIHNlbGYuX3BhdGggPSBbXQotICAgICAgICBzZWxmLl90b2ZpbGwgPSBbXQogICAgICAgICBzZWxmLmNsZWFyKCkKICAgICAgICAgY2FudmFzLl9yb290KCkudGtyYWlzZSgpCiAKQEAgLTMwMSwxOSArMzA1LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsnZmlsbCc6IHNlbGYuX2NvbG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Ntb290aCc6IHNtb290aH0pCiAgICAgICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCi0gICAgICAgICAgICAgICAgaWYgc2VsZi5fdG9maWxsOgotICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl90b2ZpbGw6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9jYW52YXMuaXRlbWNvbmZpZ3VyZShpdGVtLCBmaWxsPXNlbGYuX2NvbG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faXRlbXMuYXBwZW5kKGl0ZW0pCiAgICAgICAgIHNlbGYuX3BhdGggPSBbXQotICAgICAgICBzZWxmLl90b2ZpbGwgPSBbXQogICAgICAgICBzZWxmLl9maWxsaW5nID0gZmxhZwogICAgICAgICBpZiBmbGFnOgogICAgICAgICAgICAgc2VsZi5fcGF0aC5hcHBlbmQoc2VsZi5fcG9zaXRpb24pCi0gICAgICAgIHNlbGYuZm9yd2FyZCgwKQogCiAgICAgZGVmIGJlZ2luX2ZpbGwoc2VsZik6CiAgICAgICAgICIiIiBDYWxsZWQganVzdCBiZWZvcmUgZHJhd2luZyBhIHNoYXBlIHRvIGJlIGZpbGxlZC4KKyAgICAgICAgICAgIE11c3QgZXZlbnR1YWxseSBiZSBmb2xsb3dlZCBieSBhIGNvcnJlc3BvbmRpbmcgZW5kX2ZpbGwoKSBjYWxsLgorICAgICAgICAgICAgT3RoZXJ3aXNlIGl0IHdpbGwgYmUgaWdub3JlZC4KIAogICAgICAgICBFeGFtcGxlOgogICAgICAgICA+Pj4gdHVydGxlLmJlZ2luX2ZpbGwoKQpAQCAtMzI2LDcgKzMyNiw4IEBACiAgICAgICAgID4+PiB0dXJ0bGUuZm9yd2FyZCgxMDApCiAgICAgICAgID4+PiB0dXJ0bGUuZW5kX2ZpbGwoKQogICAgICAgICAiIiIKLSAgICAgICAgc2VsZi5maWxsKDEpCisgICAgICAgIHNlbGYuX3BhdGggPSBbc2VsZi5fcG9zaXRpb25dCisgICAgICAgIHNlbGYuX2ZpbGxpbmcgPSAxCiAKICAgICBkZWYgZW5kX2ZpbGwoc2VsZik6CiAgICAgICAgICIiIiBDYWxsZWQgYWZ0ZXIgZHJhd2luZyBhIHNoYXBlIHRvIGJlIGZpbGxlZC4KQEAgLTM0NCw3ICszNDUsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgc2VsZi5maWxsKDApCiAKLSAgICBkZWYgY2lyY2xlKHNlbGYsIHJhZGl1cywgZXh0ZW50PU5vbmUpOgorICAgIGRlZiBjaXJjbGUoc2VsZiwgcmFkaXVzLCBleHRlbnQgPSBOb25lKToKICAgICAgICAgIiIiIERyYXcgYSBjaXJjbGUgd2l0aCBnaXZlbiByYWRpdXMuCiAgICAgICAgIFRoZSBjZW50ZXIgaXMgcmFkaXVzIHVuaXRzIGxlZnQgb2YgdGhlIHR1cnRsZTsgZXh0ZW50CiAgICAgICAgIGRldGVybWluZXMgd2hpY2ggcGFydCBvZiB0aGUgY2lyY2xlIGlzIGRyYXduLiBJZiBub3QgZ2l2ZW4sCkBAIC0zNjEsNTIgKzM2MiwxOCBAQAogICAgICAgICAiIiIKICAgICAgICAgaWYgZXh0ZW50IGlzIE5vbmU6CiAgICAgICAgICAgICBleHRlbnQgPSBzZWxmLl9mdWxsY2lyY2xlCi0gICAgICAgIHgwLCB5MCA9IHNlbGYuX3Bvc2l0aW9uCi0gICAgICAgIHhjID0geDAgLSByYWRpdXMgKiBzaW4oc2VsZi5fYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCi0gICAgICAgIHljID0geTAgLSByYWRpdXMgKiBjb3Moc2VsZi5fYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCi0gICAgICAgIGlmIHJhZGl1cyA+PSAwLjA6Ci0gICAgICAgICAgICBzdGFydCA9IHNlbGYuX2FuZ2xlIC0gKHNlbGYuX2Z1bGxjaXJjbGUgLyA0LjApCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzdGFydCA9IHNlbGYuX2FuZ2xlICsgKHNlbGYuX2Z1bGxjaXJjbGUgLyA0LjApCi0gICAgICAgICAgICBleHRlbnQgPSAtZXh0ZW50Ci0gICAgICAgIGlmIHNlbGYuX2ZpbGxpbmc6Ci0gICAgICAgICAgICBpZiBhYnMoZXh0ZW50KSA+PSBzZWxmLl9mdWxsY2lyY2xlOgotICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9jYW52YXMuY3JlYXRlX292YWwoeGMtcmFkaXVzLCB5Yy1yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YytyYWRpdXMsIHljK3JhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXNlbGYuX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZT0iIikKLSAgICAgICAgICAgICAgICBzZWxmLl90b2ZpbGwuYXBwZW5kKGl0ZW0pCi0gICAgICAgICAgICBpdGVtID0gc2VsZi5fY2FudmFzLmNyZWF0ZV9hcmMoeGMtcmFkaXVzLCB5Yy1yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGMrcmFkaXVzLCB5YytyYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9ImNob3JkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydD1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ9ZXh0ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXNlbGYuX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9IiIpCi0gICAgICAgICAgICBzZWxmLl90b2ZpbGwuYXBwZW5kKGl0ZW0pCi0gICAgICAgIGlmIHNlbGYuX2RyYXdpbmc6Ci0gICAgICAgICAgICBpZiBhYnMoZXh0ZW50KSA+PSBzZWxmLl9mdWxsY2lyY2xlOgotICAgICAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9jYW52YXMuY3JlYXRlX292YWwoeGMtcmFkaXVzLCB5Yy1yYWRpdXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YytyYWRpdXMsIHljK3JhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXNlbGYuX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0bGluZT1zZWxmLl9jb2xvcikKLSAgICAgICAgICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSkKLSAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9jYW52YXMuY3JlYXRlX2FyYyh4Yy1yYWRpdXMsIHljLXJhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4YytyYWRpdXMsIHljK3JhZGl1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iYXJjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydD1zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnQ9ZXh0ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPXNlbGYuX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dGxpbmU9c2VsZi5fY29sb3IpCi0gICAgICAgICAgICBzZWxmLl9pdGVtcy5hcHBlbmQoaXRlbSkKLSAgICAgICAgYW5nbGUgPSBzdGFydCArIGV4dGVudAotICAgICAgICB4MSA9IHhjICsgYWJzKHJhZGl1cykgKiBjb3MoYW5nbGUgKiBzZWxmLl9pbnZyYWRpYW4pCi0gICAgICAgIHkxID0geWMgLSBhYnMocmFkaXVzKSAqIHNpbihhbmdsZSAqIHNlbGYuX2ludnJhZGlhbikKLSAgICAgICAgc2VsZi5fYW5nbGUgPSAoc2VsZi5fYW5nbGUgKyBleHRlbnQpICUgc2VsZi5fZnVsbGNpcmNsZQotICAgICAgICBzZWxmLl9wb3NpdGlvbiA9IHgxLCB5MQotICAgICAgICBpZiBzZWxmLl9maWxsaW5nOgotICAgICAgICAgICAgc2VsZi5fcGF0aC5hcHBlbmQoc2VsZi5fcG9zaXRpb24pCi0gICAgICAgIHNlbGYuX2RyYXdfdHVydGxlKCkKKyAgICAgICAgZnJhYyA9IGFicyhleHRlbnQpL3NlbGYuX2Z1bGxjaXJjbGUKKyAgICAgICAgc3RlcHMgPSAxK2ludChtaW4oMTErYWJzKHJhZGl1cykvNi4wLCA1OS4wKSpmcmFjKQorICAgICAgICB3ID0gMS4wICogZXh0ZW50IC8gc3RlcHMKKyAgICAgICAgdzIgPSAwLjUgKiB3CisgICAgICAgIGwgPSAyLjAgKiByYWRpdXMgKiBzaW4odzIqc2VsZi5faW52cmFkaWFuKQorICAgICAgICBpZiByYWRpdXMgPCAwOgorICAgICAgICAgICAgbCwgdywgdzIgPSAtbCwgLXcsIC13MgorICAgICAgICBzZWxmLmxlZnQodzIpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHN0ZXBzKToKKyAgICAgICAgICAgIHNlbGYuZm9yd2FyZChsKQorICAgICAgICAgICAgc2VsZi5sZWZ0KHcpCisgICAgICAgIHNlbGYucmlnaHQodzIpCiAKICAgICBkZWYgaGVhZGluZyhzZWxmKToKICAgICAgICAgIiIiIFJldHVybiB0aGUgdHVydGxlJ3MgY3VycmVudCBoZWFkaW5nLgpAQCAtNjM0LDYgKzYwMSw3IEBACiAKICAgICBkZWYgX2RyYXdfdHVydGxlKHNlbGYsIHBvc2l0aW9uPVtdKToKICAgICAgICAgaWYgbm90IHNlbGYuX3RyYWNpbmc6CisgICAgICAgICAgICBzZWxmLl9jYW52YXMudXBkYXRlKCkKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBpZiBwb3NpdGlvbiA9PSBbXToKICAgICAgICAgICAgIHBvc2l0aW9uID0gc2VsZi5fcG9zaXRpb24KQEAgLTY3OCw3ICs2NDYsNyBAQAogICAgICAgICAgICAgX2NhbnZhcyA9IFRraW50ZXIuQ2FudmFzKF9yb290LCBiYWNrZ3JvdW5kPSJ3aGl0ZSIpCiAgICAgICAgICAgICBfY2FudmFzLnBhY2soZXhwYW5kPTEsIGZpbGw9ImJvdGgiKQogCi0gICAgICAgIHNldHVwKHdpZHRoPV93aWR0aCwgaGVpZ2h0PSBfaGVpZ2h0LCBzdGFydHg9X3N0YXJ0eCwgc3RhcnR5PV9zdGFydHkpCisgICAgICAgICAgICBzZXR1cCh3aWR0aD1fd2lkdGgsIGhlaWdodD0gX2hlaWdodCwgc3RhcnR4PV9zdGFydHgsIHN0YXJ0eT1fc3RhcnR5KQogCiAgICAgICAgIFJhd1Blbi5fX2luaXRfXyhzZWxmLCBfY2FudmFzKQogCkBAIC03MjAsNyArNjg4LDcgQEAKIGRlZiB3cml0ZShhcmcsIG1vdmU9MCk6IF9nZXRwZW4oKS53cml0ZShhcmcsIG1vdmUpCiBkZWYgZmlsbChmbGFnKTogX2dldHBlbigpLmZpbGwoZmxhZykKIGRlZiBiZWdpbl9maWxsKCk6IF9nZXRwZW4oKS5iZWdpbl9maWxsKCkKLWRlZiBlbmRfZmlsbCgpOiBfZ2V0cGVuLmVuZF9maWxsKCkKK2RlZiBlbmRfZmlsbCgpOiBfZ2V0cGVuKCkuZW5kX2ZpbGwoKQogZGVmIGNpcmNsZShyYWRpdXMsIGV4dGVudD1Ob25lKTogX2dldHBlbigpLmNpcmNsZShyYWRpdXMsIGV4dGVudCkKIGRlZiBnb3RvKCphcmdzKTogX2dldHBlbigpLmdvdG8oKmFyZ3MpCiBkZWYgaGVhZGluZygpOiByZXR1cm4gX2dldHBlbigpLmhlYWRpbmcoKQpAQCAtNzQ1LDcgKzcxMyw3IEBACiBkZWYgc2V0dXAoKipnZW9tZXRyeSk6CiAgICAgIiIiIFNldHMgdGhlIHNpemUgYW5kIHBvc2l0aW9uIG9mIHRoZSBtYWluIHdpbmRvdy4KIAotICAgIEtleXdvcmRzIGFyZSB3aWR0aCwgaGVpZ2h0LCBzdGFydHggYW5kIHN0YXJ0eQorICAgIEtleXdvcmRzIGFyZSB3aWR0aCwgaGVpZ2h0LCBzdGFydHggYW5kIHN0YXJ0eToKIAogICAgIHdpZHRoOiBlaXRoZXIgYSBzaXplIGluIHBpeGVscyBvciBhIGZyYWN0aW9uIG9mIHRoZSBzY3JlZW4uCiAgICAgICBEZWZhdWx0IGlzIDUwJSBvZiBzY3JlZW4uCkBAIC04MjAsNyArNzg4LDcgQEAKICAgICAgICAgX3Jvb3QuZ2VvbWV0cnkoIiVkeCVkKyVkKyVkIiAlIChfd2lkdGgsIF9oZWlnaHQsIF9zdGFydHgsIF9zdGFydHkpKQogCiBkZWYgdGl0bGUodGl0bGUpOgotICAgICIiIiBzZXQgdGhlIHdpbmRvdyB0aXRsZS4KKyAgICAiIiJTZXQgdGhlIHdpbmRvdyB0aXRsZS4KIAogICAgIEJ5IGRlZmF1bHQgdGhpcyBpcyBzZXQgdG8gJ1R1cnRsZSBHcmFwaGljcycKIApAQCAtOTI5LDE1ICs4OTcsMzAgQEAKICAgICAgICAgICAgIHNwZWVkKHNwZWVkc1tzcF0pCiAgICAgY29sb3IoMC4yNSwwLDAuNzUpCiAgICAgZmlsbCgwKQotICAgIGNvbG9yKCJncmVlbiIpCiAKLSAgICBsZWZ0KDEzMCkKKyAgICAjIGRyYXcgYW5kIGZpbGwgYSBjb25jYXZlIHNoYXBlCisgICAgbGVmdCgxMjApCiAgICAgdXAoKQotICAgIGZvcndhcmQoOTApCisgICAgZm9yd2FyZCg3MCkKKyAgICByaWdodCgzMCkKKyAgICBkb3duKCkKICAgICBjb2xvcigicmVkIikKLSAgICBzcGVlZCgnZmFzdGVzdCcpCisgICAgc3BlZWQoImZhc3Rlc3QiKQorICAgIGZpbGwoMSkKKyAgICBmb3IgaSBpbiByYW5nZSg0KToKKyAgICAgICAgY2lyY2xlKDUwLDkwKQorICAgICAgICByaWdodCg5MCkKKyAgICAgICAgZm9yd2FyZCgzMCkKKyAgICAgICAgcmlnaHQoOTApCisgICAgY29sb3IoInllbGxvdyIpCisgICAgZmlsbCgwKQorICAgIGxlZnQoOTApCisgICAgdXAoKQorICAgIGZvcndhcmQoMzApCiAgICAgZG93bigpOwogCisgICAgY29sb3IoInJlZCIpCisKICAgICAjIGNyZWF0ZSBhIHNlY29uZCB0dXJ0bGUgYW5kIG1ha2UgdGhlIG9yaWdpbmFsIHB1cnN1ZSBhbmQgY2F0Y2ggaXQKICAgICB0dXJ0bGU9VHVydGxlKCkKICAgICB0dXJ0bGUucmVzZXQoKQpkaWZmIC0tZ2l0IGEvTGliL2xpbmVjYWNoZS5weSBiL0xpYi9saW5lY2FjaGUucHkKaW5kZXggZjQ5Njk1YS4uNDgzODYyNSAxMDA2NDQKLS0tIGEvTGliL2xpbmVjYWNoZS5weQorKysgYi9MaWIvbGluZWNhY2hlLnB5CkBAIC05NCw2ICs5NCwxMCBAQAogICAgICAgICAgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBJT0Vycm9yKToKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vIGx1Y2ssIHRoZSBQRVAzMDIgbG9hZGVyIGNhbm5vdCBmaW5kIHRoZSBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZvciB0aGlzIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10KICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlW2ZpbGVuYW1lXSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW4oZGF0YSksIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xpbmUrJ1xuJyBmb3IgbGluZSBpbiBkYXRhLnNwbGl0bGluZXMoKV0sIGZ1bGxuYW1lCmRpZmYgLS1naXQgYS9MaWIvbG9nZ2luZy9jb25maWcucHkgYi9MaWIvbG9nZ2luZy9jb25maWcucHkKaW5kZXggNDU3ZWM1Yy4uMWQ1ZjhjNCAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvY29uZmlnLnB5CisrKyBiL0xpYi9sb2dnaW5nL2NvbmZpZy5weQpAQCAtNzksNiArNzksNyBAQAogICAgIGxvZ2dpbmcuX2FjcXVpcmVMb2NrKCkKICAgICB0cnk6CiAgICAgICAgIGxvZ2dpbmcuX2hhbmRsZXJzLmNsZWFyKCkKKyAgICAgICAgbG9nZ2luZy5faGFuZGxlckxpc3QgPSBbXQogICAgICAgICAjIEhhbmRsZXJzIGFkZCB0aGVtc2VsdmVzIHRvIGxvZ2dpbmcuX2hhbmRsZXJzCiAgICAgICAgIGhhbmRsZXJzID0gX2luc3RhbGxfaGFuZGxlcnMoY3AsIGZvcm1hdHRlcnMpCiAgICAgICAgIF9pbnN0YWxsX2xvZ2dlcnMoY3AsIGhhbmRsZXJzKQpkaWZmIC0tZ2l0IGEvTGliL2xvZ2dpbmcvaGFuZGxlcnMucHkgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQppbmRleCBlMGRhMjU0Li4zNTUyOTUwIDEwMDY0NAotLS0gYS9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQorKysgYi9MaWIvbG9nZ2luZy9oYW5kbGVycy5weQpAQCAtMTI4LDEyICsxMjgsNyBAQAogICAgICAgICAgICAgZGZuID0gc2VsZi5iYXNlRmlsZW5hbWUgKyAiLjEiCiAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkZm4pOgogICAgICAgICAgICAgICAgIG9zLnJlbW92ZShkZm4pCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCi0gICAgICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKLSAgICAgICAgICAgICAgICByYWlzZQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorICAgICAgICAgICAgb3MucmVuYW1lKHNlbGYuYmFzZUZpbGVuYW1lLCBkZm4pCiAgICAgICAgICAgICAjcHJpbnQgIiVzIC0+ICVzIiAlIChzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQogICAgICAgICBpZiBzZWxmLmVuY29kaW5nOgogICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBjb2RlY3Mub3BlbihzZWxmLmJhc2VGaWxlbmFtZSwgJ3cnLCBzZWxmLmVuY29kaW5nKQpAQCAtMjczLDEyICsyNjgsNyBAQAogICAgICAgICBkZm4gPSBzZWxmLmJhc2VGaWxlbmFtZSArICIuIiArIHRpbWUuc3RyZnRpbWUoc2VsZi5zdWZmaXgsIHRpbWVUdXBsZSkKICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZGZuKToKICAgICAgICAgICAgIG9zLnJlbW92ZShkZm4pCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIG9zLnJlbmFtZShzZWxmLmJhc2VGaWxlbmFtZSwgZGZuKQotICAgICAgICBleGNlcHQgKEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKLSAgICAgICAgICAgIHJhaXNlCi0gICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgIHNlbGYuaGFuZGxlRXJyb3IocmVjb3JkKQorICAgICAgICBvcy5yZW5hbWUoc2VsZi5iYXNlRmlsZW5hbWUsIGRmbikKICAgICAgICAgaWYgc2VsZi5iYWNrdXBDb3VudCA+IDA6CiAgICAgICAgICAgICAjIGZpbmQgdGhlIG9sZGVzdCBsb2cgZmlsZSBhbmQgZGVsZXRlIGl0CiAgICAgICAgICAgICBzID0gZ2xvYi5nbG9iKHNlbGYuYmFzZUZpbGVuYW1lICsgIi4yMCoiKQpAQCAtNTcyLDYgKzU2MiwxOCBAQAogICAgICAgICAibG9jYWw3IjogICBMT0dfTE9DQUw3LAogICAgICAgICB9CiAKKyAgICAjVGhlIG1hcCBiZWxvdyBhcHBlYXJzIHRvIGJlIHRyaXZpYWxseSBsb3dlcmNhc2luZyB0aGUga2V5LiBIb3dldmVyLAorICAgICN0aGVyZSdzIG1vcmUgdG8gaXQgdGhhbiBtZWV0cyB0aGUgZXllIC0gaW4gc29tZSBsb2NhbGVzLCBsb3dlcmNhc2luZworICAgICNnaXZlcyB1bmV4cGVjdGVkIHJlc3VsdHMuIFNlZSBTRiAjMTUyNDA4MTogaW4gdGhlIFR1cmtpc2ggbG9jYWxlLAorICAgICMiSU5GTyIubG93ZXIoKSAhPSAiaW5mbyIKKyAgICBwcmlvcml0eV9tYXAgPSB7CisgICAgICAgICJERUJVRyIgOiAiZGVidWciLAorICAgICAgICAiSU5GTyIgOiAiaW5mbyIsCisgICAgICAgICJXQVJOSU5HIiA6ICJ3YXJuaW5nIiwKKyAgICAgICAgIkVSUk9SIiA6ICJlcnJvciIsCisgICAgICAgICJDUklUSUNBTCIgOiAiY3JpdGljYWwiCisgICAgfQorCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFkZHJlc3M9KCdsb2NhbGhvc3QnLCBTWVNMT0dfVURQX1BPUlQpLCBmYWNpbGl0eT1MT0dfVVNFUik6CiAgICAgICAgICIiIgogICAgICAgICBJbml0aWFsaXplIGEgaGFuZGxlci4KQEAgLTYwOCw3ICs2MTAsNyBAQAogICAgICMgICBuZWNlc3NhcnkuCiAgICAgbG9nX2Zvcm1hdF9zdHJpbmcgPSAnPCVkPiVzXDAwMCcKIAotICAgIGRlZiBlbmNvZGVQcmlvcml0eSAoc2VsZiwgZmFjaWxpdHksIHByaW9yaXR5KToKKyAgICBkZWYgZW5jb2RlUHJpb3JpdHkoc2VsZiwgZmFjaWxpdHksIHByaW9yaXR5KToKICAgICAgICAgIiIiCiAgICAgICAgIEVuY29kZSB0aGUgZmFjaWxpdHkgYW5kIHByaW9yaXR5LiBZb3UgY2FuIHBhc3MgaW4gc3RyaW5ncyBvcgogICAgICAgICBpbnRlZ2VycyAtIGlmIHN0cmluZ3MgYXJlIHBhc3NlZCwgdGhlIGZhY2lsaXR5X25hbWVzIGFuZApAQCAtNjI5LDYgKzYzMSwxNiBAQAogICAgICAgICAgICAgc2VsZi5zb2NrZXQuY2xvc2UoKQogICAgICAgICBsb2dnaW5nLkhhbmRsZXIuY2xvc2Uoc2VsZikKIAorICAgIGRlZiBtYXBQcmlvcml0eShzZWxmLCBsZXZlbE5hbWUpOgorICAgICAgICAiIiIKKyAgICAgICAgTWFwIGEgbG9nZ2luZyBsZXZlbCBuYW1lIHRvIGEga2V5IGluIHRoZSBwcmlvcml0eV9uYW1lcyBtYXAuCisgICAgICAgIFRoaXMgaXMgdXNlZnVsIGluIHR3byBzY2VuYXJpb3M6IHdoZW4gY3VzdG9tIGxldmVscyBhcmUgYmVpbmcKKyAgICAgICAgdXNlZCwgYW5kIGluIHRoZSBjYXNlIHdoZXJlIHlvdSBjYW4ndCBkbyBhIHN0cmFpZ2h0Zm9yd2FyZAorICAgICAgICBtYXBwaW5nIGJ5IGxvd2VyY2FzaW5nIHRoZSBsb2dnaW5nIGxldmVsIG5hbWUgYmVjYXVzZSBvZiBsb2NhbGUtCisgICAgICAgIHNwZWNpZmljIGlzc3VlcyAoc2VlIFNGICMxNTI0MDgxKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBzZWxmLnByaW9yaXR5X21hcC5nZXQobGV2ZWxOYW1lLCAid2FybmluZyIpCisKICAgICBkZWYgZW1pdChzZWxmLCByZWNvcmQpOgogICAgICAgICAiIiIKICAgICAgICAgRW1pdCBhIHJlY29yZC4KQEAgLTY0Myw4ICs2NTUsOCBAQAogICAgICAgICAiIiIKICAgICAgICAgbXNnID0gc2VsZi5sb2dfZm9ybWF0X3N0cmluZyAlICgKICAgICAgICAgICAgIHNlbGYuZW5jb2RlUHJpb3JpdHkoc2VsZi5mYWNpbGl0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nLmxvd2VyKHJlY29yZC5sZXZlbG5hbWUpKSwKLSAgICAgICAgICAgIG1zZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXBQcmlvcml0eShyZWNvcmQubGV2ZWxuYW1lKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc2VsZi51bml4c29ja2V0OgogICAgICAgICAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi9tYWlsYm94LnB5IGIvTGliL21haWxib3gucHkKaW5kZXggYmIxMTVlMS4uYjcyMTI4YiAxMDA3NTUKLS0tIGEvTGliL21haWxib3gucHkKKysrIGIvTGliL21haWxib3gucHkKQEAgLTE1LDcgKzE1LDEwIEBACiBpbXBvcnQgcmZjODIyCiBpbXBvcnQgU3RyaW5nSU8KIHRyeToKLSAgICBpbXBvcnQgZm5jdGwKKyAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ29zMmVteCc6CisgICAgICAgICMgT1MvMiBFTVggZmNudGwoKSBub3QgYWRlcXVhdGUKKyAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IKKyAgICBpbXBvcnQgZmNudGwKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBmY250bCA9IE5vbmUKIApAQCAtNTY1LDcgKzU2OCw4IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG9zLnJlbmFtZShuZXdfZmlsZS5uYW1lLCBzZWxmLl9wYXRoKQogICAgICAgICBleGNlcHQgT1NFcnJvciwgZToKLSAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FRVhJU1Qgb3IgXAorICAgICAgICAgICAgICAob3MubmFtZSA9PSAnb3MyJyBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUNDRVMpOgogICAgICAgICAgICAgICAgIG9zLnJlbW92ZShzZWxmLl9wYXRoKQogICAgICAgICAgICAgICAgIG9zLnJlbmFtZShuZXdfZmlsZS5uYW1lLCBzZWxmLl9wYXRoKQogICAgICAgICAgICAgZWxzZToKQEAgLTEwMzAsNiArMTAzNCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKG9zLCAnbGluaycpOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdHIocHJldiArIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ29zMmVteCc6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2Fubm90IHVubGluayBhbiBvcGVuIGZpbGUgb24gT1MvMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHN0cihrZXkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCkBAIC0xNzk4LDI2ICsxODA1LDE4IEBACiAKIAogZGVmIF9sb2NrX2ZpbGUoZiwgZG90bG9jaz1UcnVlKToKLSAgICAiIiJMb2NrIGZpbGUgZiB1c2luZyBsb2NrZiwgZmxvY2ssIGFuZCBkb3QgbG9ja2luZy4iIiIKKyAgICAiIiJMb2NrIGZpbGUgZiB1c2luZyBsb2NrZiBhbmQgZG90IGxvY2tpbmcuIiIiCiAgICAgZG90bG9ja19kb25lID0gRmFsc2UKICAgICB0cnk6CiAgICAgICAgIGlmIGZjbnRsOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZjbnRsLmxvY2tmKGYsIGZjbnRsLkxPQ0tfRVggfCBmY250bC5MT0NLX05CKQogICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgICAgICAgICAgaWYgZS5lcnJubyA9PSBlcnJuby5FQUdBSU46CisgICAgICAgICAgICAgICAgaWYgZS5lcnJubyBpbiAoZXJybm8uRUFHQUlOLCBlcnJuby5FQUNDRVMpOgogICAgICAgICAgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ2xvY2tmOiBsb2NrIHVuYXZhaWxhYmxlOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5uYW1lKQogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgIHJhaXNlCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19FWCB8IGZjbnRsLkxPQ0tfTkIpCi0gICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgZToKLSAgICAgICAgICAgICAgICBpZiBlLmVycm5vID09IGVycm5vLkVXT1VMREJMT0NLOgotICAgICAgICAgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ2Zsb2NrOiBsb2NrIHVuYXZhaWxhYmxlOiAlcycgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5uYW1lKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHJhaXNlCiAgICAgICAgIGlmIGRvdGxvY2s6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcHJlX2xvY2sgPSBfY3JlYXRlX3RlbXBvcmFyeShmLm5hbWUgKyAnLmxvY2snKQpAQCAtMTgzNiw3ICsxODM1LDggQEAKICAgICAgICAgICAgICAgICAgICAgb3MucmVuYW1lKHByZV9sb2NrLm5hbWUsIGYubmFtZSArICcubG9jaycpCiAgICAgICAgICAgICAgICAgICAgIGRvdGxvY2tfZG9uZSA9IFRydWUKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgotICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUOgorICAgICAgICAgICAgICAgIGlmIGUuZXJybm8gPT0gZXJybm8uRUVYSVNUIG9yIFwKKyAgICAgICAgICAgICAgICAgIChvcy5uYW1lID09ICdvczInIGFuZCBlLmVycm5vID09IGVycm5vLkVBQ0NFUyk6CiAgICAgICAgICAgICAgICAgICAgIG9zLnJlbW92ZShwcmVfbG9jay5uYW1lKQogICAgICAgICAgICAgICAgICAgICByYWlzZSBFeHRlcm5hbENsYXNoRXJyb3IoJ2RvdCBsb2NrIHVuYXZhaWxhYmxlOiAlcycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5uYW1lKQpAQCAtMTg0NSwxNiArMTg0NSwxNCBAQAogICAgIGV4Y2VwdDoKICAgICAgICAgaWYgZmNudGw6CiAgICAgICAgICAgICBmY250bC5sb2NrZihmLCBmY250bC5MT0NLX1VOKQotICAgICAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19VTikKICAgICAgICAgaWYgZG90bG9ja19kb25lOgogICAgICAgICAgICAgb3MucmVtb3ZlKGYubmFtZSArICcubG9jaycpCiAgICAgICAgIHJhaXNlCiAKIGRlZiBfdW5sb2NrX2ZpbGUoZik6Ci0gICAgIiIiVW5sb2NrIGZpbGUgZiB1c2luZyBsb2NrZiwgZmxvY2ssIGFuZCBkb3QgbG9ja2luZy4iIiIKKyAgICAiIiJVbmxvY2sgZmlsZSBmIHVzaW5nIGxvY2tmIGFuZCBkb3QgbG9ja2luZy4iIiIKICAgICBpZiBmY250bDoKICAgICAgICAgZmNudGwubG9ja2YoZiwgZmNudGwuTE9DS19VTikKLSAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19VTikKICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmLm5hbWUgKyAnLmxvY2snKToKICAgICAgICAgb3MucmVtb3ZlKGYubmFtZSArICcubG9jaycpCiAKZGlmZiAtLWdpdCBhL0xpYi9taW1ldHlwZXMucHkgYi9MaWIvbWltZXR5cGVzLnB5CmluZGV4IGJlZTJmZjcuLmIwZDJmMTggMTAwNjQ0Ci0tLSBhL0xpYi9taW1ldHlwZXMucHkKKysrIGIvTGliL21pbWV0eXBlcy5weQpAQCAtMzMsNiArMzMsMTAgQEAKIAoga25vd25maWxlcyA9IFsKICAgICAiL2V0Yy9taW1lLnR5cGVzIiwKKyAgICAiL2V0Yy9odHRwZC9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAgICMgTWFjIE9TIFgKKyAgICAiL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICMgQXBhY2hlCisgICAgIi9ldGMvYXBhY2hlL21pbWUudHlwZXMiLCAgICAgICAgICAgICAgICAgICAjIEFwYWNoZSAxCisgICAgIi9ldGMvYXBhY2hlMi9taW1lLnR5cGVzIiwgICAgICAgICAgICAgICAgICAjIEFwYWNoZSAyCiAgICAgIi91c3IvbG9jYWwvZXRjL2h0dHBkL2NvbmYvbWltZS50eXBlcyIsCiAgICAgIi91c3IvbG9jYWwvbGliL25ldHNjYXBlL21pbWUudHlwZXMiLAogICAgICIvdXNyL2xvY2FsL2V0Yy9odHRwZC9jb25mL21pbWUudHlwZXMiLCAgICAgIyBBcGFjaGUgMS4yCmRpZmYgLS1naXQgYS9MaWIvbXNpbGliL19faW5pdF9fLnB5IGIvTGliL21zaWxpYi9fX2luaXRfXy5weQppbmRleCAwODgxNDA5Li40YmU4MmIwIDEwMDY0NAotLS0gYS9MaWIvbXNpbGliL19faW5pdF9fLnB5CisrKyBiL0xpYi9tc2lsaWIvX19pbml0X18ucHkKQEAgLTE4Nyw3ICsxODcsNyBAQAogICAgICAgICBzZWxmLmZpbGVuYW1lcyA9IHNldHMuU2V0KCkKICAgICAgICAgc2VsZi5pbmRleCA9IDAKIAotICAgIGRlZiBnZW5faWQoc2VsZiwgZGlyLCBmaWxlKToKKyAgICBkZWYgZ2VuX2lkKHNlbGYsIGZpbGUpOgogICAgICAgICBsb2dpY2FsID0gX2xvZ2ljYWwgPSBtYWtlX2lkKGZpbGUpCiAgICAgICAgIHBvcyA9IDEKICAgICAgICAgd2hpbGUgbG9naWNhbCBpbiBzZWxmLmZpbGVuYW1lczoKQEAgLTE5Niw5ICsxOTYsMTEgQEAKICAgICAgICAgc2VsZi5maWxlbmFtZXMuYWRkKGxvZ2ljYWwpCiAgICAgICAgIHJldHVybiBsb2dpY2FsCiAKLSAgICBkZWYgYXBwZW5kKHNlbGYsIGZ1bGwsIGxvZ2ljYWwpOgorICAgIGRlZiBhcHBlbmQoc2VsZiwgZnVsbCwgZmlsZSwgbG9naWNhbCk6CiAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZnVsbCk6CiAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGxvZ2ljYWw6CisgICAgICAgICAgICBsb2dpY2FsID0gc2VsZi5nZW5faWQoZmlsZSkKICAgICAgICAgc2VsZi5pbmRleCArPSAxCiAgICAgICAgIHNlbGYuZmlsZXMuYXBwZW5kKChmdWxsLCBsb2dpY2FsKSkKICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXgsIGxvZ2ljYWwKQEAgLTMyOCw3ICszMzAsNyBAQAogICAgICAgICAgICAgbG9naWNhbCA9IHNlbGYua2V5ZmlsZXNbZmlsZV0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGxvZ2ljYWwgPSBOb25lCi0gICAgICAgIHNlcXVlbmNlLCBsb2dpY2FsID0gc2VsZi5jYWIuYXBwZW5kKGFic29sdXRlLCBsb2dpY2FsKQorICAgICAgICBzZXF1ZW5jZSwgbG9naWNhbCA9IHNlbGYuY2FiLmFwcGVuZChhYnNvbHV0ZSwgZmlsZSwgbG9naWNhbCkKICAgICAgICAgYXNzZXJ0IGxvZ2ljYWwgbm90IGluIHNlbGYuaWRzCiAgICAgICAgIHNlbGYuaWRzLmFkZChsb2dpY2FsKQogICAgICAgICBzaG9ydCA9IHNlbGYubWFrZV9zaG9ydChmaWxlKQpAQCAtNDAzLDcgKzQwNSw3IEBACiAgICAgICAgICAgICAgICAgIFsoc2VsZi5kbGcubmFtZSwgc2VsZi5uYW1lLCBldmVudCwgYXJndW1lbnQsCiAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uLCBvcmRlcmluZyldKQogCi0gICAgZGVmIG1hcHBpbmcoc2VsZiwgbWFwcGluZywgYXR0cmlidXRlKToKKyAgICBkZWYgbWFwcGluZyhzZWxmLCBldmVudCwgYXR0cmlidXRlKToKICAgICAgICAgYWRkX2RhdGEoc2VsZi5kbGcuZGIsICJFdmVudE1hcHBpbmciLAogICAgICAgICAgICAgICAgICBbKHNlbGYuZGxnLm5hbWUsIHNlbGYubmFtZSwgZXZlbnQsIGF0dHJpYnV0ZSldKQogCmRpZmYgLS1naXQgYS9MaWIvb3B0cGFyc2UucHkgYi9MaWIvb3B0cGFyc2UucHkKaW5kZXggNmI4ZjVkMS4uNjJkMmY3ZSAxMDA2NDQKLS0tIGEvTGliL29wdHBhcnNlLnB5CisrKyBiL0xpYi9vcHRwYXJzZS5weQpAQCAtMTYsNyArMTYsNyBAQAogIyBQeXRob24gZGV2ZWxvcGVyczogcGxlYXNlIGRvIG5vdCBtYWtlIGNoYW5nZXMgdG8gdGhpcyBmaWxlLCBzaW5jZQogIyBpdCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBPcHRpayBzb3VyY2UgY29kZS4KIAotX192ZXJzaW9uX18gPSAiMS41LjEiCitfX3ZlcnNpb25fXyA9ICIxLjUuMyIKIAogX19hbGxfXyA9IFsnT3B0aW9uJywKICAgICAgICAgICAgJ1NVUFBSRVNTX0hFTFAnLApAQCAtNzUsOSArNzUsOSBAQAogCiAKICMgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgZnJvbToKLSMgICBJZDogb3B0aW9uX3BhcnNlci5weSA1MDkgMjAwNi0wNC0yMCAwMDo1ODoyNFogZ3dhcmQKLSMgICBJZDogb3B0aW9uLnB5IDUwOSAyMDA2LTA0LTIwIDAwOjU4OjI0WiBnd2FyZAotIyAgIElkOiBoZWxwLnB5IDUwOSAyMDA2LTA0LTIwIDAwOjU4OjI0WiBnd2FyZAorIyAgIElkOiBvcHRpb25fcGFyc2VyLnB5IDUyNyAyMDA2LTA3LTIzIDE1OjIxOjMwWiBncmVnCisjICAgSWQ6IG9wdGlvbi5weSA1MjIgMjAwNi0wNi0xMSAxNjoyMjowM1ogZ3dhcmQKKyMgICBJZDogaGVscC5weSA1MjcgMjAwNi0wNy0yMyAxNToyMTozMFogZ3JlZwogIyAgIElkOiBlcnJvcnMucHkgNTA5IDIwMDYtMDQtMjAgMDA6NTg6MjRaIGd3YXJkCiAKIHRyeToKQEAgLTE2MjksNiArMTYyOSwxMyBAQAogICAgICAgICByZXN1bHQuYXBwZW5kKHNlbGYuZm9ybWF0X2VwaWxvZyhmb3JtYXR0ZXIpKQogICAgICAgICByZXR1cm4gIiIuam9pbihyZXN1bHQpCiAKKyAgICAjIHVzZWQgYnkgdGVzdCBzdWl0ZQorICAgIGRlZiBfZ2V0X2VuY29kaW5nKHNlbGYsIGZpbGUpOgorICAgICAgICBlbmNvZGluZyA9IGdldGF0dHIoZmlsZSwgImVuY29kaW5nIiwgTm9uZSkKKyAgICAgICAgaWYgbm90IGVuY29kaW5nOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nCisKICAgICBkZWYgcHJpbnRfaGVscChzZWxmLCBmaWxlPU5vbmUpOgogICAgICAgICAiIiJwcmludF9oZWxwKGZpbGUgOiBmaWxlID0gc3Rkb3V0KQogCkBAIC0xNjM3LDcgKzE2NDQsOCBAQAogICAgICAgICAiIiIKICAgICAgICAgaWYgZmlsZSBpcyBOb25lOgogICAgICAgICAgICAgZmlsZSA9IHN5cy5zdGRvdXQKLSAgICAgICAgZmlsZS53cml0ZShzZWxmLmZvcm1hdF9oZWxwKCkpCisgICAgICAgIGVuY29kaW5nID0gc2VsZi5fZ2V0X2VuY29kaW5nKGZpbGUpCisgICAgICAgIGZpbGUud3JpdGUoc2VsZi5mb3JtYXRfaGVscCgpLmVuY29kZShlbmNvZGluZywgInJlcGxhY2UiKSkKIAogIyBjbGFzcyBPcHRpb25QYXJzZXIKIApkaWZmIC0tZ2l0IGEvTGliL29zLnB5IGIvTGliL29zLnB5CmluZGV4IDMxMDAyYWMuLjJkMWIyOWIgMTAwNjQ0Ci0tLSBhL0xpYi9vcy5weQorKysgYi9MaWIvb3MucHkKQEAgLTcyMyw3ICs3MjMsNyBAQAogICAgICAgICAiIiIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgX3VyYW5kb21mZCA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKQotICAgICAgICBleGNlcHQ6CisgICAgICAgIGV4Y2VwdCAoT1NFcnJvciwgSU9FcnJvcik6CiAgICAgICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCIvZGV2L3VyYW5kb20gKG9yIGVxdWl2YWxlbnQpIG5vdCBmb3VuZCIpCiAgICAgICAgIGJ5dGVzID0gIiIKICAgICAgICAgd2hpbGUgbGVuKGJ5dGVzKSA8IG46CmRpZmYgLS1naXQgYS9MaWIvcGRiLnB5IGIvTGliL3BkYi5weQppbmRleCA5NGY2MWY3Li4wNjE4MWU3IDEwMDc1NQotLS0gYS9MaWIvcGRiLnB5CisrKyBiL0xpYi9wZGIucHkKQEAgLTIzNSw3ICsyMzUsOCBAQAogICAgICAgICAiIiJJbnRlcnByZXQgdGhlIGFyZ3VtZW50IGFzIHRob3VnaCBpdCBoYWQgYmVlbiB0eXBlZCBpbiByZXNwb25zZQogICAgICAgICB0byB0aGUgcHJvbXB0LgogCi0gICAgICAgIENoZWNrcyB3ZXRoZXIgIHRoaXMgbGluZSBpcyB0eXBlZCBpbiB0aGUgbm9ybWFsIHByb21wdCBvciBpbiBhIGJyZWFrcG9pbnQgY29tbWFuZCBsaXN0IGRlZmluaXRpb24KKyAgICAgICAgQ2hlY2tzIHdoZXRoZXIgdGhpcyBsaW5lIGlzIHR5cGVkIGF0IHRoZSBub3JtYWwgcHJvbXB0IG9yIGluCisgICAgICAgIGEgYnJlYWtwb2ludCBjb21tYW5kIGxpc3QgZGVmaW5pdGlvbi4KICAgICAgICAgIiIiCiAgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzX2RlZmluaW5nOgogICAgICAgICAgICAgcmV0dXJuIGNtZC5DbWQub25lY21kKHNlbGYsIGxpbmUpCmRpZmYgLS1naXQgYS9MaWIvcGtndXRpbC5weSBiL0xpYi9wa2d1dGlsLnB5CmluZGV4IDI2Yzc5N2YuLjM3NzM4ZTQgMTAwNjQ0Ci0tLSBhL0xpYi9wa2d1dGlsLnB5CisrKyBiL0xpYi9wa2d1dGlsLnB5CkBAIC02OSw3ICs2OSwzMyBAQAogCiAKIGRlZiB3YWxrX3BhY2thZ2VzKHBhdGg9Tm9uZSwgcHJlZml4PScnLCBvbmVycm9yPU5vbmUpOgotICAgICIiIllpZWxkIHN1Ym1vZHVsZSBuYW1lcytsb2FkZXJzIHJlY3Vyc2l2ZWx5LCBmb3IgcGF0aCBvciBzeXMucGF0aCIiIgorICAgICIiIllpZWxkcyAobW9kdWxlX2xvYWRlciwgbmFtZSwgaXNwa2cpIGZvciBhbGwgbW9kdWxlcyByZWN1cnNpdmVseQorICAgIG9uIHBhdGgsIG9yLCBpZiBwYXRoIGlzIE5vbmUsIGFsbCBhY2Nlc3NpYmxlIG1vZHVsZXMuCisKKyAgICAncGF0aCcgc2hvdWxkIGJlIGVpdGhlciBOb25lIG9yIGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvcgorICAgIG1vZHVsZXMgaW4uCisKKyAgICAncHJlZml4JyBpcyBhIHN0cmluZyB0byBvdXRwdXQgb24gdGhlIGZyb250IG9mIGV2ZXJ5IG1vZHVsZSBuYW1lCisgICAgb24gb3V0cHV0LgorCisgICAgTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gbXVzdCBpbXBvcnQgYWxsICpwYWNrYWdlcyogKE5PVCBhbGwKKyAgICBtb2R1bGVzISkgb24gdGhlIGdpdmVuIHBhdGgsIGluIG9yZGVyIHRvIGFjY2VzcyB0aGUgX19wYXRoX18KKyAgICBhdHRyaWJ1dGUgdG8gZmluZCBzdWJtb2R1bGVzLgorCisgICAgJ29uZXJyb3InIGlzIGEgZnVuY3Rpb24gd2hpY2ggZ2V0cyBjYWxsZWQgd2l0aCBvbmUgYXJndW1lbnQgKHRoZQorICAgIG5hbWUgb2YgdGhlIHBhY2thZ2Ugd2hpY2ggd2FzIGJlaW5nIGltcG9ydGVkKSBpZiBhbnkgZXhjZXB0aW9uCisgICAgb2NjdXJzIHdoaWxlIHRyeWluZyB0byBpbXBvcnQgYSBwYWNrYWdlLiAgSWYgbm8gb25lcnJvciBmdW5jdGlvbiBpcworICAgIHN1cHBsaWVkLCBJbXBvcnRFcnJvcnMgYXJlIGNhdWdodCBhbmQgaWdub3JlZCwgd2hpbGUgYWxsIG90aGVyCisgICAgZXhjZXB0aW9ucyBhcmUgcHJvcGFnYXRlZCwgdGVybWluYXRpbmcgdGhlIHNlYXJjaC4KKworICAgIEV4YW1wbGVzOgorCisgICAgIyBsaXN0IGFsbCBtb2R1bGVzIHB5dGhvbiBjYW4gYWNjZXNzCisgICAgd2Fsa19wYWNrYWdlcygpCisKKyAgICAjIGxpc3QgYWxsIHN1Ym1vZHVsZXMgb2YgY3R5cGVzCisgICAgd2Fsa19wYWNrYWdlcyhjdHlwZXMuX19wYXRoX18sIGN0eXBlcy5fX25hbWVfXysnLicpCisgICAgIiIiCiAKICAgICBkZWYgc2VlbihwLCBtPXt9KToKICAgICAgICAgaWYgcCBpbiBtOgpAQCAtODQsMTkgKzExMCwzMyBAQAogICAgICAgICAgICAgICAgIF9faW1wb3J0X18obmFtZSkKICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICAgICAgICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBvbmVycm9yKCkKKyAgICAgICAgICAgICAgICAgICAgb25lcnJvcihuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgICAgICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvbmVycm9yKG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbmFtZV0sICdfX3BhdGhfXycsIE5vbmUpIG9yIFtdCiAKICAgICAgICAgICAgICAgICAjIGRvbid0IHRyYXZlcnNlIHBhdGggaXRlbXMgd2UndmUgc2VlbiBiZWZvcmUKICAgICAgICAgICAgICAgICBwYXRoID0gW3AgZm9yIHAgaW4gcGF0aCBpZiBub3Qgc2VlbihwKV0KIAotICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHdhbGtfcGFja2FnZXMocGF0aCwgbmFtZSsnLicpOgorICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHdhbGtfcGFja2FnZXMocGF0aCwgbmFtZSsnLicsIG9uZXJyb3IpOgogICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCiAKIAogZGVmIGl0ZXJfbW9kdWxlcyhwYXRoPU5vbmUsIHByZWZpeD0nJyk6Ci0gICAgIiIiWWllbGQgc3VibW9kdWxlIG5hbWVzK2xvYWRlcnMgZm9yIHBhdGggb3Igc3lzLnBhdGgiIiIKKyAgICAiIiJZaWVsZHMgKG1vZHVsZV9sb2FkZXIsIG5hbWUsIGlzcGtnKSBmb3IgYWxsIHN1Ym1vZHVsZXMgb24gcGF0aCwKKyAgICBvciwgaWYgcGF0aCBpcyBOb25lLCBhbGwgdG9wLWxldmVsIG1vZHVsZXMgb24gc3lzLnBhdGguCisKKyAgICAncGF0aCcgc2hvdWxkIGJlIGVpdGhlciBOb25lIG9yIGEgbGlzdCBvZiBwYXRocyB0byBsb29rIGZvcgorICAgIG1vZHVsZXMgaW4uCisKKyAgICAncHJlZml4JyBpcyBhIHN0cmluZyB0byBvdXRwdXQgb24gdGhlIGZyb250IG9mIGV2ZXJ5IG1vZHVsZSBuYW1lCisgICAgb24gb3V0cHV0LgorICAgICIiIgorCiAgICAgaWYgcGF0aCBpcyBOb25lOgogICAgICAgICBpbXBvcnRlcnMgPSBpdGVyX2ltcG9ydGVycygpCiAgICAgZWxzZToKQEAgLTIwOCw2ICsyNDgsNyBAQAogCiAgICAgZGVmIF9yZW9wZW4oc2VsZik6CiAgICAgICAgIGlmIHNlbGYuZmlsZSBhbmQgc2VsZi5maWxlLmNsb3NlZDoKKyAgICAgICAgICAgIG1vZF90eXBlID0gc2VsZi5ldGNbMl0KICAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgogICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JVJykKICAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgaW4gKGltcC5QWV9DT01QSUxFRCwgaW1wLkNfRVhURU5TSU9OKToKQEAgLTM0MCw5ICszODEsNyBAQAogICAgICAgICAgICAgaW1wb3J0ZXIgPSBOb25lCiAgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnNldGRlZmF1bHQocGF0aF9pdGVtLCBpbXBvcnRlcikKIAotICAgICMgVGhlIGJvb2xlYW4gdmFsdWVzIGFyZSB1c2VkIGZvciBjYWNoaW5nIHZhbGlkIGFuZCBpbnZhbGlkCi0gICAgIyBmaWxlIHBhdGhzIGZvciB0aGUgYnVpbHQtaW4gaW1wb3J0IG1hY2hpbmVyeQotICAgIGlmIGltcG9ydGVyIGluIChOb25lLCBUcnVlLCBGYWxzZSk6CisgICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaW1wb3J0ZXIgPSBJbXBJbXBvcnRlcihwYXRoX2l0ZW0pCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9wb3BlbjIucHkgYi9MaWIvcG9wZW4yLnB5CmluZGV4IGI5NjZkNGMuLjY5NDk3OWUgMTAwNjQ0Ci0tLSBhL0xpYi9wb3BlbjIucHkKKysrIGIvTGliL3BvcGVuMi5weQpAQCAtNzIsMTQgKzcyLDE0IEBACiAgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCiAgICAgICAgIHNlbGYucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCiAgICAgICAgIGlmIHNlbGYuc3RzIDwgMDoKLSAgICAgICAgICAgIGlmIF9hY3RpdmU6CisgICAgICAgICAgICBpZiBfYWN0aXZlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KICAgICAgICAgICAgICAgICBfYWN0aXZlLmFwcGVuZChzZWxmKQogCiAgICAgZGVmIF9ydW5fY2hpbGQoc2VsZiwgY21kKToKICAgICAgICAgaWYgaXNpbnN0YW5jZShjbWQsIGJhc2VzdHJpbmcpOgogICAgICAgICAgICAgY21kID0gWycvYmluL3NoJywgJy1jJywgY21kXQotICAgICAgICBmb3IgaSBpbiByYW5nZSgzLCBNQVhGRCk6CisgICAgICAgIGZvciBpIGluIHhyYW5nZSgzLCBNQVhGRCk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgb3MuY2xvc2UoaSkKICAgICAgICAgICAgIGV4Y2VwdCBPU0Vycm9yOgpkaWZmIC0tZ2l0IGEvTGliL3BzdGF0cy5weSBiL0xpYi9wc3RhdHMucHkKaW5kZXggYzNhODgyOC4uNGU5NGIwYyAxMDA2NDQKLS0tIGEvTGliL3BzdGF0cy5weQorKysgYi9MaWIvcHN0YXRzLnB5CkBAIC01NDgsOCArNTQ4LDEwIEBACiAgICAgICAgICAgICBzZWxmLnByb21wdCA9ICIlICIKICAgICAgICAgICAgIGlmIHByb2ZpbGUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cyA9IFN0YXRzKHByb2ZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5zdHJlYW0gPSBzZWxmLnN0YXRzLnN0cmVhbQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRzID0gTm9uZQorICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtID0gc3lzLnN0ZG91dAogCiAgICAgICAgIGRlZiBnZW5lcmljKHNlbGYsIGZuLCBsaW5lKToKICAgICAgICAgICAgIGFyZ3MgPSBsaW5lLnNwbGl0KCkKQEAgLTY2NywxNCArNjY5LDE1IEBACiAgICAgICAgICAgICByZXR1cm4gTm9uZQogCiAgICAgaW1wb3J0IHN5cwotICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiV2VsY29tZSB0byB0aGUgcHJvZmlsZSBzdGF0aXN0aWNzIGJyb3dzZXIuIgogICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgogICAgICAgICBpbml0cHJvZmlsZSA9IHN5cy5hcmd2WzFdCiAgICAgZWxzZToKICAgICAgICAgaW5pdHByb2ZpbGUgPSBOb25lCiAgICAgdHJ5OgotICAgICAgICBQcm9maWxlQnJvd3Nlcihpbml0cHJvZmlsZSkuY21kbG9vcCgpCi0gICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiR29vZGJ5ZS4iCisgICAgICAgIGJyb3dzZXIgPSBQcm9maWxlQnJvd3Nlcihpbml0cHJvZmlsZSkKKyAgICAgICAgcHJpbnQgPj4gYnJvd3Nlci5zdHJlYW0sICJXZWxjb21lIHRvIHRoZSBwcm9maWxlIHN0YXRpc3RpY3MgYnJvd3Nlci4iCisgICAgICAgIGJyb3dzZXIuY21kbG9vcCgpCisgICAgICAgIHByaW50ID4+IGJyb3dzZXIuc3RyZWFtLCAiR29vZGJ5ZS4iCiAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi9weWRvYy5weSBiL0xpYi9weWRvYy5weQppbmRleCBjZjM4NjMwLi4yOWM2Y2M0IDEwMDc1NQotLS0gYS9MaWIvcHlkb2MucHkKKysrIGIvTGliL3B5ZG9jLnB5CkBAIC0zMTgsNiArMzE4LDggQEAKICAgICAgICAgIyBpZGVudGlmaWVzIHNvbWV0aGluZyBpbiBhIHdheSB0aGF0IHB5ZG9jIGl0c2VsZiBoYXMgaXNzdWVzIGhhbmRsaW5nOwogICAgICAgICAjIHRoaW5rICdzdXBlcicgYW5kIGhvdyBpdCBpcyBhIGRlc2NyaXB0b3IgKHdoaWNoIHJhaXNlcyB0aGUgZXhjZXB0aW9uCiAgICAgICAgICMgYnkgbGFja2luZyBhIF9fbmFtZV9fIGF0dHJpYnV0ZSkgYW5kIGFuIGluc3RhbmNlLgorICAgICAgICBpZiBpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NkYXRhKCphcmdzKQorICAgICAgICBpZiBpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvcihvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NkYXRhKCphcmdzKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpZiBpbnNwZWN0LmlzbW9kdWxlKG9iamVjdCk6IHJldHVybiBzZWxmLmRvY21vZHVsZSgqYXJncykKICAgICAgICAgICAgIGlmIGluc3BlY3QuaXNjbGFzcyhvYmplY3QpOiByZXR1cm4gc2VsZi5kb2NjbGFzcygqYXJncykKQEAgLTMzMyw3ICszMzUsNyBAQAogICAgICAgICAgICAgbmFtZSBhbmQgJyAnICsgcmVwcihuYW1lKSwgdHlwZShvYmplY3QpLl9fbmFtZV9fKQogICAgICAgICByYWlzZSBUeXBlRXJyb3IsIG1lc3NhZ2UKIAotICAgIGRvY21vZHVsZSA9IGRvY2NsYXNzID0gZG9jcm91dGluZSA9IGRvY290aGVyID0gZmFpbAorICAgIGRvY21vZHVsZSA9IGRvY2NsYXNzID0gZG9jcm91dGluZSA9IGRvY290aGVyID0gZG9jcHJvcGVydHkgPSBkb2NkYXRhID0gZmFpbAogCiAgICAgZGVmIGdldGRvY2xvYyhzZWxmLCBvYmplY3QpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGxvY2F0aW9uIG9mIG1vZHVsZSBkb2NzIG9yIE5vbmUiIiIKQEAgLTkxNSw2ICs5MTcsMTAgQEAKICAgICAgICAgbGhzID0gbmFtZSBhbmQgJzxzdHJvbmc+JXM8L3N0cm9uZz4gPSAnICUgbmFtZSBvciAnJwogICAgICAgICByZXR1cm4gbGhzICsgc2VsZi5yZXByKG9iamVjdCkKIAorICAgIGRlZiBkb2NkYXRhKHNlbGYsIG9iamVjdCwgbmFtZT1Ob25lLCBtb2Q9Tm9uZSwgY2w9Tm9uZSk6CisgICAgICAgICIiIlByb2R1Y2UgaHRtbCBkb2N1bWVudGF0aW9uIGZvciBhIGRhdGEgZGVzY3JpcHRvci4iIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2RvY2Rlc2NyaXB0b3IobmFtZSwgb2JqZWN0LCBtb2QpCisKICAgICBkZWYgaW5kZXgoc2VsZiwgZGlyLCBzaGFkb3dlZD1Ob25lKToKICAgICAgICAgIiIiR2VuZXJhdGUgYW4gSFRNTCBpbmRleCBmb3IgYSBkaXJlY3Rvcnkgb2YgbW9kdWxlcy4iIiIKICAgICAgICAgbW9kcGtncyA9IFtdCkBAIC0xMjY4LDYgKzEyNzQsMTAgQEAKICAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgcHJvcGVydHkuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLl9kb2NkZXNjcmlwdG9yKG5hbWUsIG9iamVjdCwgbW9kKQogCisgICAgZGVmIGRvY2RhdGEoc2VsZiwgb2JqZWN0LCBuYW1lPU5vbmUsIG1vZD1Ob25lLCBjbD1Ob25lKToKKyAgICAgICAgIiIiUHJvZHVjZSB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIGEgZGF0YSBkZXNjcmlwdG9yLiIiIgorICAgICAgICByZXR1cm4gc2VsZi5fZG9jZGVzY3JpcHRvcihuYW1lLCBvYmplY3QsIG1vZCkKKwogICAgIGRlZiBkb2NvdGhlcihzZWxmLCBvYmplY3QsIG5hbWU9Tm9uZSwgbW9kPU5vbmUsIHBhcmVudD1Ob25lLCBtYXhsZW49Tm9uZSwgZG9jPU5vbmUpOgogICAgICAgICAiIiJQcm9kdWNlIHRleHQgZG9jdW1lbnRhdGlvbiBmb3IgYSBkYXRhIG9iamVjdC4iIiIKICAgICAgICAgcmVwciA9IHNlbGYucmVwcihvYmplY3QpCkBAIC0xMzk3LDYgKzE0MDcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiAnbW9kdWxlICcgKyB0aGluZy5fX25hbWVfXwogICAgIGlmIGluc3BlY3QuaXNidWlsdGluKHRoaW5nKToKICAgICAgICAgcmV0dXJuICdidWlsdC1pbiBmdW5jdGlvbiAnICsgdGhpbmcuX19uYW1lX18KKyAgICBpZiBpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcih0aGluZyk6CisgICAgICAgIHJldHVybiAnZ2V0c2V0IGRlc2NyaXB0b3IgJXMuJXMuJXMnICUgKAorICAgICAgICAgICAgdGhpbmcuX19vYmpjbGFzc19fLl9fbW9kdWxlX18sIHRoaW5nLl9fb2JqY2xhc3NfXy5fX25hbWVfXywKKyAgICAgICAgICAgIHRoaW5nLl9fbmFtZV9fKQorICAgIGlmIGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKHRoaW5nKToKKyAgICAgICAgcmV0dXJuICdtZW1iZXIgZGVzY3JpcHRvciAlcy4lcy4lcycgJSAoCisgICAgICAgICAgICB0aGluZy5fX29iamNsYXNzX18uX19tb2R1bGVfXywgdGhpbmcuX19vYmpjbGFzc19fLl9fbmFtZV9fLAorICAgICAgICAgICAgdGhpbmcuX19uYW1lX18pCiAgICAgaWYgaW5zcGVjdC5pc2NsYXNzKHRoaW5nKToKICAgICAgICAgcmV0dXJuICdjbGFzcyAnICsgdGhpbmcuX19uYW1lX18KICAgICBpZiBpbnNwZWN0LmlzZnVuY3Rpb24odGhpbmcpOgpAQCAtMTQ1Myw2ICsxNDcxLDggQEAKICAgICAgICAgaWYgbm90IChpbnNwZWN0LmlzbW9kdWxlKG9iamVjdCkgb3IKICAgICAgICAgICAgICAgICBpbnNwZWN0LmlzY2xhc3Mob2JqZWN0KSBvcgogICAgICAgICAgICAgICAgIGluc3BlY3QuaXNyb3V0aW5lKG9iamVjdCkgb3IKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcihvYmplY3QpIG9yCisgICAgICAgICAgICAgICAgaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3Iob2JqZWN0KSBvcgogICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uob2JqZWN0LCBwcm9wZXJ0eSkpOgogICAgICAgICAgICAgIyBJZiB0aGUgcGFzc2VkIG9iamVjdCBpcyBhIHBpZWNlIG9mIGRhdGEgb3IgYW4gaW5zdGFuY2UsCiAgICAgICAgICAgICAjIGRvY3VtZW50IGl0cyBhdmFpbGFibGUgbWV0aG9kcyBpbnN0ZWFkIG9mIGl0cyB2YWx1ZS4KZGlmZiAtLWdpdCBhL0xpYi9yYW5kb20ucHkgYi9MaWIvcmFuZG9tLnB5CmluZGV4IDQ2NWY0NzcuLmFlMmQ0MzQgMTAwNjQ0Ci0tLSBhL0xpYi9yYW5kb20ucHkKKysrIGIvTGliL3JhbmRvbS5weQpAQCAtMjksMTMgKzI5LDEyIEBACiBHZW5lcmFsIG5vdGVzIG9uIHRoZSB1bmRlcmx5aW5nIE1lcnNlbm5lIFR3aXN0ZXIgY29yZSBnZW5lcmF0b3I6CiAKICogVGhlIHBlcmlvZCBpcyAyKioxOTkzNy0xLgotKiBJdCBpcyBvbmUgb2YgdGhlIG1vc3QgZXh0ZW5zaXZlbHkgdGVzdGVkIGdlbmVyYXRvcnMgaW4gZXhpc3RlbmNlCi0qIFdpdGhvdXQgYSBkaXJlY3Qgd2F5IHRvIGNvbXB1dGUgTiBzdGVwcyBmb3J3YXJkLCB0aGUKLSAgc2VtYW50aWNzIG9mIGp1bXBhaGVhZChuKSBhcmUgd2Vha2VuZWQgdG8gc2ltcGx5IGp1bXAKLSAgdG8gYW5vdGhlciBkaXN0YW50IHN0YXRlIGFuZCByZWx5IG9uIHRoZSBsYXJnZSBwZXJpb2QKLSAgdG8gYXZvaWQgb3ZlcmxhcHBpbmcgc2VxdWVuY2VzLgotKiBUaGUgcmFuZG9tKCkgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIEMsIGV4ZWN1dGVzIGluCi0gIGEgc2luZ2xlIFB5dGhvbiBzdGVwLCBhbmQgaXMsIHRoZXJlZm9yZSwgdGhyZWFkc2FmZS4KKyogSXQgaXMgb25lIG9mIHRoZSBtb3N0IGV4dGVuc2l2ZWx5IHRlc3RlZCBnZW5lcmF0b3JzIGluIGV4aXN0ZW5jZS4KKyogV2l0aG91dCBhIGRpcmVjdCB3YXkgdG8gY29tcHV0ZSBOIHN0ZXBzIGZvcndhcmQsIHRoZSBzZW1hbnRpY3Mgb2YKKyAganVtcGFoZWFkKG4pIGFyZSB3ZWFrZW5lZCB0byBzaW1wbHkganVtcCB0byBhbm90aGVyIGRpc3RhbnQgc3RhdGUgYW5kIHJlbHkKKyAgb24gdGhlIGxhcmdlIHBlcmlvZCB0byBhdm9pZCBvdmVybGFwcGluZyBzZXF1ZW5jZXMuCisqIFRoZSByYW5kb20oKSBtZXRob2QgaXMgaW1wbGVtZW50ZWQgaW4gQywgZXhlY3V0ZXMgaW4gYSBzaW5nbGUgUHl0aG9uIHN0ZXAsCisgIGFuZCBpcywgdGhlcmVmb3JlLCB0aHJlYWRzYWZlLgogCiAiIiIKIApAQCAtMjUzLDExICsyNTIsNiBAQAogCiAgICAgICAgIE9wdGlvbmFsIGFyZyByYW5kb20gaXMgYSAwLWFyZ3VtZW50IGZ1bmN0aW9uIHJldHVybmluZyBhIHJhbmRvbQogICAgICAgICBmbG9hdCBpbiBbMC4wLCAxLjApOyBieSBkZWZhdWx0LCB0aGUgc3RhbmRhcmQgcmFuZG9tLnJhbmRvbS4KLQotICAgICAgICBOb3RlIHRoYXQgZm9yIGV2ZW4gcmF0aGVyIHNtYWxsIGxlbih4KSwgdGhlIHRvdGFsIG51bWJlciBvZgotICAgICAgICBwZXJtdXRhdGlvbnMgb2YgeCBpcyBsYXJnZXIgdGhhbiB0aGUgcGVyaW9kIG9mIG1vc3QgcmFuZG9tIG51bWJlcgotICAgICAgICBnZW5lcmF0b3JzOyB0aGlzIGltcGxpZXMgdGhhdCAibW9zdCIgcGVybXV0YXRpb25zIG9mIGEgbG9uZwotICAgICAgICBzZXF1ZW5jZSBjYW4gbmV2ZXIgYmUgZ2VuZXJhdGVkLgogICAgICAgICAiIiIKIAogICAgICAgICBpZiByYW5kb20gaXMgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi9zZ21sbGliLnB5IGIvTGliL3NnbWxsaWIucHkKaW5kZXggM2U4NWE5MS4uMzAyMGQxMSAxMDA2NDQKLS0tIGEvTGliL3NnbWxsaWIucHkKKysrIGIvTGliL3NnbWxsaWIucHkKQEAgLTI5LDExICsyOSwxNiBAQAogc2hvcnR0YWdvcGVuID0gcmUuY29tcGlsZSgnPFthLXpBLVpdWy0uYS16QS1aMC05XSovJykKIHNob3J0dGFnID0gcmUuY29tcGlsZSgnPChbYS16QS1aXVstLmEtekEtWjAtOV0qKS8oW14vXSopLycpCiBwaWNsb3NlID0gcmUuY29tcGlsZSgnPicpCi1lbmRicmFja2V0ID0gcmUuY29tcGlsZSgnWzw+XScpCitzdGFydHRhZyA9IHJlLmNvbXBpbGUocic8W2EtekEtWl1bLV8uOmEtekEtWjAtOV0qXHMqKCcKKyAgICAgICAgcidccyooW2EtekEtWl9dWy06LmEtekEtWl8wLTldKikoXHMqPVxzKicKKyAgICAgICAgcicoXCdbXlwnXSpcJ3wiW14iXSoifFstYS16QS1aMC05Li8sOjsrKiU/ISYkXChcKV8jPX5AXScKKyAgICAgICAgcidbXVtcLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+XCciQF0qKD89W1xzPi88XSkpKT8nCisgICAgcicpKlxzKi8/XHMqKD89Wzw+XSknKQorZW5kdGFnID0gcmUuY29tcGlsZShyJzwvP1thLXpBLVpdWy1fLjphLXpBLVowLTldKlxzKi8/XHMqKD89Wzw+XSknKQogdGFnZmluZCA9IHJlLmNvbXBpbGUoJ1thLXpBLVpdWy1fLmEtekEtWjAtOV0qJykKIGF0dHJmaW5kID0gcmUuY29tcGlsZSgKICAgICByJ1xzKihbYS16QS1aX11bLTouYS16QS1aXzAtOV0qKShccyo9XHMqJwotICAgIHInKFwnW15cJ10qXCd8IlteIl0qInxbLWEtekEtWjAtOS4vLDo7KyolPyEmJFwoXClfIz1+XCciQF0qKSk/JykKKyAgICByJyhcJ1teXCddKlwnfCJbXiJdKiJ8W11bXC1hLXpBLVowLTkuLyw6OysqJT8hJiRcKFwpXyM9flwnIkBdKikpPycpCiAKIAogY2xhc3MgU0dNTFBhcnNlRXJyb3IoUnVudGltZUVycm9yKToKQEAgLTUzLDYgKzU4LDEwIEBACiAjIHNlbGYuaGFuZGxlX2VudGl0eXJlZigpIHdpdGggdGhlIGVudGl0eSByZWZlcmVuY2UgYXMgYXJndW1lbnQuCiAKIGNsYXNzIFNHTUxQYXJzZXIobWFya3VwYmFzZS5QYXJzZXJCYXNlKToKKyAgICAjIERlZmluaXRpb24gb2YgZW50aXRpZXMgLS0gZGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZQorICAgIGVudGl0eV9vcl9jaGFycmVmID0gcmUuY29tcGlsZSgnJig/OicKKyAgICAgICcoW2EtekEtWl1bLS5hLXpBLVowLTldKil8IyhbMC05XSspJworICAgICAgJykoOz8pJykKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2ZXJib3NlPTApOgogICAgICAgICAiIiJJbml0aWFsaXplIGFuZCByZXNldCB0aGlzIGluc3RhbmNlLiIiIgpAQCAtMjQ1LDExICsyNTQsMTAgQEAKICAgICAgICAgICAgIHNlbGYuZmluaXNoX3Nob3J0dGFnKHRhZywgZGF0YSkKICAgICAgICAgICAgIHNlbGYuX19zdGFydHRhZ190ZXh0ID0gcmF3ZGF0YVtzdGFydF9wb3M6bWF0Y2guZW5kKDEpICsgMV0KICAgICAgICAgICAgIHJldHVybiBrCi0gICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHNraXAgbWF0Y2hpbmcgcXVvdGVzICgnIG9yICIpCi0gICAgICAgIG1hdGNoID0gZW5kYnJhY2tldC5zZWFyY2gocmF3ZGF0YSwgaSsxKQorICAgICAgICBtYXRjaCA9IHN0YXJ0dGFnLm1hdGNoKHJhd2RhdGEsIGkpCiAgICAgICAgIGlmIG5vdCBtYXRjaDoKICAgICAgICAgICAgIHJldHVybiAtMQotICAgICAgICBqID0gbWF0Y2guc3RhcnQoMCkKKyAgICAgICAgaiA9IG1hdGNoLmVuZCgwKQogICAgICAgICAjIE5vdyBwYXJzZSB0aGUgZGF0YSBiZXR3ZWVuIGkrMSBhbmQgaiBpbnRvIGEgdGFnIGFuZCBhdHRycwogICAgICAgICBhdHRycyA9IFtdCiAgICAgICAgIGlmIHJhd2RhdGFbaTppKzJdID09ICc8Pic6CkBAIC0yNzQsMzIgKzI4Miw4IEBACiAgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdKToKICAgICAgICAgICAgICAgICAgICAgIyBzdHJpcCBxdW90ZXMKICAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCi0gICAgICAgICAgICAgICAgbCA9IDAKLSAgICAgICAgICAgICAgICBuZXdfYXR0cnZhbHVlID0gJycKLSAgICAgICAgICAgICAgICB3aGlsZSBsIDwgbGVuKGF0dHJ2YWx1ZSk6Ci0gICAgICAgICAgICAgICAgICAgIGF2X21hdGNoID0gZW50aXR5cmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF2X21hdGNoIGFuZCBhdl9tYXRjaC5ncm91cCgxKSBpbiBzZWxmLmVudGl0eWRlZnMgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbYXZfbWF0Y2guZW5kKDEpXSA9PSAnOycpOgotICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHN1YnN0aXR1dGUgZW50aXR5cmVmcyBlbmRpbmcgaW4gJzsnIHNpbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSB3ZSBtYXkgYnJlYWsgPGEgaHJlZj0nP3A9eCZxPXknPgotICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBpcyB2ZXJ5IGNvbW1vbgotICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBzZWxmLmVudGl0eWRlZnNbYXZfbWF0Y2guZ3JvdXAoMSldCi0gICAgICAgICAgICAgICAgICAgICAgICBsID0gYXZfbWF0Y2guZW5kKDApCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgICAgICBjaF9tYXRjaCA9IGNoYXJyZWYubWF0Y2goYXR0cnZhbHVlLCBsKQotICAgICAgICAgICAgICAgICAgICBpZiBjaF9tYXRjaDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gY2hyKGludChjaF9tYXRjaC5ncm91cCgxKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBjaGFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGNoX21hdGNoLmVuZCgwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGludmFsaWQgY2hhcmFjdGVyIHJlZmVyZW5jZSwgZG9uJ3Qgc3Vic3RpdHV0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICAgICAgICAgIyBhbGwgb3RoZXIgY2FzZXMKLSAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBhdHRydmFsdWVbbF0KLSAgICAgICAgICAgICAgICAgICAgbCArPSAxCi0gICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gbmV3X2F0dHJ2YWx1ZQorICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZSA9IHNlbGYuZW50aXR5X29yX2NoYXJyZWYuc3ViKAorICAgICAgICAgICAgICAgICAgICBzZWxmLl9jb252ZXJ0X3JlZiwgYXR0cnZhbHVlKQogICAgICAgICAgICAgYXR0cnMuYXBwZW5kKChhdHRybmFtZS5sb3dlcigpLCBhdHRydmFsdWUpKQogICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgwKQogICAgICAgICBpZiByYXdkYXRhW2pdID09ICc+JzoKQEAgLTMwOCwxMyArMjkyLDI0IEBACiAgICAgICAgIHNlbGYuZmluaXNoX3N0YXJ0dGFnKHRhZywgYXR0cnMpCiAgICAgICAgIHJldHVybiBqCiAKKyAgICAjIEludGVybmFsIC0tIGNvbnZlcnQgZW50aXR5IG9yIGNoYXJhY3RlciByZWZlcmVuY2UKKyAgICBkZWYgX2NvbnZlcnRfcmVmKHNlbGYsIG1hdGNoKToKKyAgICAgICAgaWYgbWF0Y2guZ3JvdXAoMik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0X2NoYXJyZWYobWF0Y2guZ3JvdXAoMikpIG9yIFwKKyAgICAgICAgICAgICAgICAnJiMlcyVzJyAlIG1hdGNoLmdyb3VwcygpWzE6XQorICAgICAgICBlbGlmIG1hdGNoLmdyb3VwKDMpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuY29udmVydF9lbnRpdHlyZWYobWF0Y2guZ3JvdXAoMSkpIG9yIFwKKyAgICAgICAgICAgICAgICAnJiVzOycgJSBtYXRjaC5ncm91cCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICcmJXMnICUgbWF0Y2guZ3JvdXAoMSkKKwogICAgICMgSW50ZXJuYWwgLS0gcGFyc2UgZW5kdGFnCiAgICAgZGVmIHBhcnNlX2VuZHRhZyhzZWxmLCBpKToKICAgICAgICAgcmF3ZGF0YSA9IHNlbGYucmF3ZGF0YQotICAgICAgICBtYXRjaCA9IGVuZGJyYWNrZXQuc2VhcmNoKHJhd2RhdGEsIGkrMSkKKyAgICAgICAgbWF0Y2ggPSBlbmR0YWcubWF0Y2gocmF3ZGF0YSwgaSkKICAgICAgICAgaWYgbm90IG1hdGNoOgogICAgICAgICAgICAgcmV0dXJuIC0xCi0gICAgICAgIGogPSBtYXRjaC5zdGFydCgwKQorICAgICAgICBqID0gbWF0Y2guZW5kKDApCiAgICAgICAgIHRhZyA9IHJhd2RhdGFbaSsyOmpdLnN0cmlwKCkubG93ZXIoKQogICAgICAgICBpZiByYXdkYXRhW2pdID09ICc+JzoKICAgICAgICAgICAgIGogPSBqKzEKQEAgLTM5MSwzNSArMzg2LDUxIEBACiAgICAgICAgICAgICBwcmludCAnKioqIFVuYmFsYW5jZWQgPC8nICsgdGFnICsgJz4nCiAgICAgICAgICAgICBwcmludCAnKioqIFN0YWNrOicsIHNlbGYuc3RhY2sKIAotICAgIGRlZiBoYW5kbGVfY2hhcnJlZihzZWxmLCBuYW1lKToKLSAgICAgICAgIiIiSGFuZGxlIGNoYXJhY3RlciByZWZlcmVuY2UsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgZGVmIGNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiQ29udmVydCBjaGFyYWN0ZXIgcmVmZXJlbmNlLCBtYXkgYmUgb3ZlcnJpZGRlbi4iIiIKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgbiA9IGludChuYW1lKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgICAgIHNlbGYudW5rbm93bl9jaGFycmVmKG5hbWUpCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgbm90IDAgPD0gbiA8PSAyNTU6Ci0gICAgICAgICAgICBzZWxmLnVua25vd25fY2hhcnJlZihuYW1lKQogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoY2hyKG4pKQorICAgICAgICByZXR1cm4gc2VsZi5jb252ZXJ0X2NvZGVwb2ludChuKQorCisgICAgZGVmIGNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCk6CisgICAgICAgIHJldHVybiBjaHIoY29kZXBvaW50KQorCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIG5hbWUpOgorICAgICAgICAiIiJIYW5kbGUgY2hhcmFjdGVyIHJlZmVyZW5jZSwgbm8gbmVlZCB0byBvdmVycmlkZS4iIiIKKyAgICAgICAgcmVwbGFjZW1lbnQgPSBzZWxmLmNvbnZlcnRfY2hhcnJlZihuYW1lKQorICAgICAgICBpZiByZXBsYWNlbWVudCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi51bmtub3duX2NoYXJyZWYobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEocmVwbGFjZW1lbnQpCiAKICAgICAjIERlZmluaXRpb24gb2YgZW50aXRpZXMgLS0gZGVyaXZlZCBjbGFzc2VzIG1heSBvdmVycmlkZQogICAgIGVudGl0eWRlZnMgPSBcCiAgICAgICAgICAgICB7J2x0JzogJzwnLCAnZ3QnOiAnPicsICdhbXAnOiAnJicsICdxdW90JzogJyInLCAnYXBvcyc6ICdcJyd9CiAKLSAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBuYW1lKToKLSAgICAgICAgIiIiSGFuZGxlIGVudGl0eSByZWZlcmVuY2VzLgorICAgIGRlZiBjb252ZXJ0X2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiQ29udmVydCBlbnRpdHkgcmVmZXJlbmNlcy4KIAotICAgICAgICBUaGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZDsgaXQgY2FuIGJlCi0gICAgICAgIHRhaWxvcmVkIGJ5IHNldHRpbmcgdXAgdGhlIHNlbGYuZW50aXR5ZGVmcyBtYXBwaW5nIGFwcHJvcHJpYXRlbHkuCisgICAgICAgIEFzIGFuIGFsdGVybmF0aXZlIHRvIG92ZXJyaWRpbmcgdGhpcyBtZXRob2Q7IG9uZSBjYW4gdGFpbG9yIHRoZQorICAgICAgICByZXN1bHRzIGJ5IHNldHRpbmcgdXAgdGhlIHNlbGYuZW50aXR5ZGVmcyBtYXBwaW5nIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICIiIgogICAgICAgICB0YWJsZSA9IHNlbGYuZW50aXR5ZGVmcwogICAgICAgICBpZiBuYW1lIGluIHRhYmxlOgotICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YSh0YWJsZVtuYW1lXSkKKyAgICAgICAgICAgIHJldHVybiB0YWJsZVtuYW1lXQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi51bmtub3duX2VudGl0eXJlZihuYW1lKQogICAgICAgICAgICAgcmV0dXJuCiAKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiSGFuZGxlIGVudGl0eSByZWZlcmVuY2VzLCBubyBuZWVkIHRvIG92ZXJyaWRlLiIiIgorICAgICAgICByZXBsYWNlbWVudCA9IHNlbGYuY29udmVydF9lbnRpdHlyZWYobmFtZSkKKyAgICAgICAgaWYgcmVwbGFjZW1lbnQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudW5rbm93bl9lbnRpdHlyZWYobmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoc2VsZi5jb252ZXJ0X2VudGl0eXJlZihuYW1lKSkKKwogICAgICMgRXhhbXBsZSAtLSBoYW5kbGUgZGF0YSwgc2hvdWxkIGJlIG92ZXJyaWRkZW4KICAgICBkZWYgaGFuZGxlX2RhdGEoc2VsZiwgZGF0YSk6CiAgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL0xpYi9zaGVsdmUucHkgYi9MaWIvc2hlbHZlLnB5CmluZGV4IDQ5NTljMjYuLjdhNzU0NDUgMTAwNjQ0Ci0tLSBhL0xpYi9zaGVsdmUucHkKKysrIGIvTGliL3NoZWx2ZS5weQpAQCAtMTM5LDYgKzEzOSw5IEBACiAgICAgICAgIHNlbGYuZGljdCA9IDAKIAogICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAnd3JpdGViYWNrJyk6CisgICAgICAgICAgICAjIF9faW5pdF9fIGRpZG4ndCBzdWNjZWVkLCBzbyBkb24ndCBib3RoZXIgY2xvc2luZworICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIHNlbGYuY2xvc2UoKQogCiAgICAgZGVmIHN5bmMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvc2h1dGlsLnB5IGIvTGliL3NodXRpbC5weQppbmRleCBjNTAxODRjLi5jM2ZmNjg3IDEwMDY0NAotLS0gYS9MaWIvc2h1dGlsLnB5CisrKyBiL0xpYi9zaHV0aWwucHkKQEAgLTEyNyw3ICsxMjcsMTMgQEAKICAgICAgICAgIyBjb250aW51ZSB3aXRoIG90aGVyIGZpbGVzCiAgICAgICAgIGV4Y2VwdCBFcnJvciwgZXJyOgogICAgICAgICAgICAgZXJyb3JzLmV4dGVuZChlcnIuYXJnc1swXSkKLSAgICBjb3B5c3RhdChzcmMsIGRzdCkKKyAgICB0cnk6CisgICAgICAgIGNvcHlzdGF0KHNyYywgZHN0KQorICAgIGV4Y2VwdCBXaW5kb3dzRXJyb3I6CisgICAgICAgICMgY2FuJ3QgY29weSBmaWxlIGFjY2VzcyB0aW1lcyBvbiBXaW5kb3dzCisgICAgICAgIHBhc3MKKyAgICBleGNlcHQgT1NFcnJvciwgd2h5OgorICAgICAgICBlcnJvcnMuZXh0ZW5kKChzcmMsIGRzdCwgc3RyKHdoeSkpKQogICAgIGlmIGVycm9yczoKICAgICAgICAgcmFpc2UgRXJyb3IsIGVycm9ycwogCmRpZmYgLS1naXQgYS9MaWIvc2l0ZS5weSBiL0xpYi9zaXRlLnB5CmluZGV4IDQ3ZWRhMjQuLjAxMDg2YjcgMTAwNjQ0Ci0tLSBhL0xpYi9zaXRlLnB5CisrKyBiL0xpYi9zaXRlLnB5CkBAIC0xMSwxMCArMTEsMTEgQEAKIHdvcmtzKS4KIAogVGhpcyB3aWxsIGFwcGVuZCBzaXRlLXNwZWNpZmljIHBhdGhzIHRvIHRoZSBtb2R1bGUgc2VhcmNoIHBhdGguICBPbgotVW5peCwgaXQgc3RhcnRzIHdpdGggc3lzLnByZWZpeCBhbmQgc3lzLmV4ZWNfcHJlZml4IChpZiBkaWZmZXJlbnQpIGFuZAotYXBwZW5kcyBsaWIvcHl0aG9uPHZlcnNpb24+L3NpdGUtcGFja2FnZXMgYXMgd2VsbCBhcyBsaWIvc2l0ZS1weXRob24uCi1PbiBvdGhlciBwbGF0Zm9ybXMgKG1haW5seSBNYWMgYW5kIFdpbmRvd3MpLCBpdCB1c2VzIGp1c3Qgc3lzLnByZWZpeAotKGFuZCBzeXMuZXhlY19wcmVmaXgsIGlmIGRpZmZlcmVudCwgYnV0IHRoaXMgaXMgdW5saWtlbHkpLiAgVGhlCitVbml4IChpbmNsdWRpbmcgTWFjIE9TWCksIGl0IHN0YXJ0cyB3aXRoIHN5cy5wcmVmaXggYW5kCitzeXMuZXhlY19wcmVmaXggKGlmIGRpZmZlcmVudCkgYW5kIGFwcGVuZHMKK2xpYi9weXRob248dmVyc2lvbj4vc2l0ZS1wYWNrYWdlcyBhcyB3ZWxsIGFzIGxpYi9zaXRlLXB5dGhvbi4KK09uIG90aGVyIHBsYXRmb3JtcyAoc3VjaCBhcyBXaW5kb3dzKSwgaXQgdHJpZXMgZWFjaCBvZiB0aGUKK3ByZWZpeGVzIGRpcmVjdGx5LCBhcyB3ZWxsIGFzIHdpdGggbGliL3NpdGUtcGFja2FnZXMgYXBwZW5kZWQuICBUaGUKIHJlc3VsdGluZyBkaXJlY3RvcmllcywgaWYgdGhleSBleGlzdCwgYXJlIGFwcGVuZGVkIHRvIHN5cy5wYXRoLCBhbmQKIGFsc28gaW5zcGVjdGVkIGZvciBwYXRoIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAKZGlmZiAtLWdpdCBhL0xpYi9zb2NrZXQucHkgYi9MaWIvc29ja2V0LnB5CmluZGV4IGZhMGU2NjMuLjUyZmI4ZTMgMTAwNjQ0Ci0tLSBhL0xpYi9zb2NrZXQucHkKKysrIGIvTGliL3NvY2tldC5weQpAQCAtMTMwLDM1ICsxMzAsNDAgQEAKIGlmIHN5cy5wbGF0Zm9ybSA9PSAicmlzY29zIjoKICAgICBfc29ja2V0bWV0aG9kcyA9IF9zb2NrZXRtZXRob2RzICsgKCdzbGVlcHRhc2t3JywpCiAKKyMgQWxsIHRoZSBtZXRob2QgbmFtZXMgdGhhdCBtdXN0IGJlIGRlbGVnYXRlZCB0byBlaXRoZXIgdGhlIHJlYWwgc29ja2V0CisjIG9iamVjdCBvciB0aGUgX2Nsb3NlZHNvY2tldCBvYmplY3QuCitfZGVsZWdhdGVfbWV0aG9kcyA9ICgicmVjdiIsICJyZWN2ZnJvbSIsICJyZWN2X2ludG8iLCAicmVjdmZyb21faW50byIsCisgICAgICAgICAgICAgICAgICAgICAic2VuZCIsICJzZW5kdG8iKQorCiBjbGFzcyBfY2xvc2Vkc29ja2V0KG9iamVjdCk6CiAgICAgX19zbG90c19fID0gW10KICAgICBkZWYgX2R1bW15KCphcmdzKToKICAgICAgICAgcmFpc2UgZXJyb3IoRUJBREYsICdCYWQgZmlsZSBkZXNjcmlwdG9yJykKLSAgICBzZW5kID0gcmVjdiA9IHNlbmR0byA9IHJlY3Zmcm9tID0gX19nZXRhdHRyX18gPSBfZHVtbXkKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHBhc3MKKyAgICAjIEFsbCBfZGVsZWdhdGVfbWV0aG9kcyBtdXN0IGFsc28gYmUgaW5pdGlhbGl6ZWQgaGVyZS4KKyAgICBzZW5kID0gcmVjdiA9IHJlY3ZfaW50byA9IHNlbmR0byA9IHJlY3Zmcm9tID0gcmVjdmZyb21faW50byA9IF9kdW1teQorICAgIF9fZ2V0YXR0cl9fID0gX2R1bW15CiAKIGNsYXNzIF9zb2NrZXRvYmplY3Qob2JqZWN0KToKIAogICAgIF9fZG9jX18gPSBfcmVhbHNvY2tldC5fX2RvY19fCiAKLSAgICBfX3Nsb3RzX18gPSBbIl9zb2NrIiwKLSAgICAgICAgICAgICAgICAgInJlY3YiLCAicmVjdl9pbnRvIiwgInJlY3Zmcm9tX2ludG8iLAotICAgICAgICAgICAgICAgICAic2VuZCIsICJzZW5kdG8iLCAicmVjdmZyb20iLAotICAgICAgICAgICAgICAgICAiX193ZWFrcmVmX18iXQorICAgIF9fc2xvdHNfXyA9IFsiX3NvY2siLCAiX193ZWFrcmVmX18iXSArIGxpc3QoX2RlbGVnYXRlX21ldGhvZHMpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmFtaWx5PUFGX0lORVQsIHR5cGU9U09DS19TVFJFQU0sIHByb3RvPTAsIF9zb2NrPU5vbmUpOgogICAgICAgICBpZiBfc29jayBpcyBOb25lOgogICAgICAgICAgICAgX3NvY2sgPSBfcmVhbHNvY2tldChmYW1pbHksIHR5cGUsIHByb3RvKQogICAgICAgICBzZWxmLl9zb2NrID0gX3NvY2sKLSAgICAgICAgc2VsZi5zZW5kID0gc2VsZi5fc29jay5zZW5kCi0gICAgICAgIHNlbGYucmVjdiA9IHNlbGYuX3NvY2sucmVjdgotICAgICAgICBzZWxmLnJlY3ZfaW50byA9IHNlbGYuX3NvY2sucmVjdl9pbnRvCi0gICAgICAgIHNlbGYuc2VuZHRvID0gc2VsZi5fc29jay5zZW5kdG8KLSAgICAgICAgc2VsZi5yZWN2ZnJvbSA9IHNlbGYuX3NvY2sucmVjdmZyb20KLSAgICAgICAgc2VsZi5yZWN2ZnJvbV9pbnRvID0gc2VsZi5fc29jay5yZWN2ZnJvbV9pbnRvCisgICAgICAgIGZvciBtZXRob2QgaW4gX2RlbGVnYXRlX21ldGhvZHM6CisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG1ldGhvZCwgZ2V0YXR0cihfc29jaywgbWV0aG9kKSkKIAogICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fc29jay5jbG9zZSgpCiAgICAgICAgIHNlbGYuX3NvY2sgPSBfY2xvc2Vkc29ja2V0KCkKLSAgICAgICAgc2VsZi5zZW5kID0gc2VsZi5yZWN2ID0gc2VsZi5zZW5kdG8gPSBzZWxmLnJlY3Zmcm9tID0gc2VsZi5fc29jay5fZHVtbXkKKyAgICAgICAgZHVtbXkgPSBzZWxmLl9zb2NrLl9kdW1teQorICAgICAgICBmb3IgbWV0aG9kIGluIF9kZWxlZ2F0ZV9tZXRob2RzOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBtZXRob2QsIGR1bW15KQogICAgIGNsb3NlLl9fZG9jX18gPSBfcmVhbHNvY2tldC5jbG9zZS5fX2RvY19fCiAKICAgICBkZWYgYWNjZXB0KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkKaW5kZXggYjEwYjNlZi4uNzYxYmRhYSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC9ob29rcy5weQorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC00OCw2ICs0OCw4IEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgQ2hlY2tDb2xsYXRpb25Jc1VzZWQoc2VsZik6CisgICAgICAgIGlmIHNxbGl0ZS52ZXJzaW9uX2luZm8gPCAoMywgMiwgMSk6ICAjIG9sZCBTUUxpdGUgdmVyc2lvbnMgY3Jhc2ggb24gdGhpcyB0ZXN0CisgICAgICAgICAgICByZXR1cm4KICAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKICAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgogICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQppbmRleCAyNWU0YjYzLi5jODczM2I5IDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3JlZ3Jlc3Npb24ucHkKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC02MSw2ICs2MSwxNCBAQAogCiAgICAgICAgIGNvbi5yb2xsYmFjaygpCiAKKyAgICBkZWYgQ2hlY2tDb2x1bW5OYW1lV2l0aFNwYWNlcyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmFyIFtkYXRldGltZV0iJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAiZm9vIGJhciIpCisKKyAgICAgICAgY3VyLmV4ZWN1dGUoJ3NlbGVjdCAxIGFzICJmb28gYmF6IicpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGN1ci5kZXNjcmlwdGlvblswXVswXSwgImZvbyBiYXoiKQorCiBkZWYgc3VpdGUoKToKICAgICByZWdyZXNzaW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFJlZ3Jlc3Npb25UZXN0cywgIkNoZWNrIikKICAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChyZWdyZXNzaW9uX3N1aXRlLCkpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weQppbmRleCBlNDlmN2RkLi44ZGE1NzIyIDEwMDY0NAotLS0gYS9MaWIvc3FsaXRlMy90ZXN0L3R5cGVzLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTIxLDcgKzIxLDcgQEAKICMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgogIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgogCi1pbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBiejIsIGRhdGV0aW1lCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQogCkBAIC0xMDEsMTYgKzEwMSwxNiBAQAogICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludCwgcyBzdHIsIGYgZmxvYXQsIGIgYm9vbCwgdSB1bmljb2RlLCBmb28gZm9vLCBiaW4gYmxvYikiKQogCiAgICAgICAgICMgb3ZlcnJpZGUgZmxvYXQsIG1ha2UgdGhlbSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG51bWJlcgotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXSA9IGxhbWJkYSB4OiA0Ny4yCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGTE9BVCJdID0gbGFtYmRhIHg6IDQ3LjIKIAogICAgICAgICAjIGFuZCBpbXBsZW1lbnQgdHdvIGN1c3RvbSBvbmVzCi0gICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJib29sIl0gPSBsYW1iZGEgeDogYm9vbChpbnQoeCkpCi0gICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmb28iXSA9IERlY2xUeXBlc1Rlc3RzLkZvbworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siQk9PTCJdID0gbGFtYmRhIHg6IGJvb2woaW50KHgpKQorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siRk9PIl0gPSBEZWNsVHlwZXNUZXN0cy5Gb28KIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmbG9hdCJdCi0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siYm9vbCJdCi0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGTE9BVCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siQk9PTCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRk9PIl0KICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKQEAgLTIwOCwxNCArMjA4LDE0IEBACiAgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoeCBmb28pIikKIAotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBsYW1iZGEgeDogIlslc10iICUgeAotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYmFyIl0gPSBsYW1iZGEgeDogIjwlcz4iICUgeAotICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZXhjIl0gPSBsYW1iZGEgeDogNS8wCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXSA9IGxhbWJkYSB4OiAiWyVzXSIgJSB4CisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJCQVIiXSA9IGxhbWJkYSB4OiAiPCVzPiIgJSB4CisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJFWEMiXSA9IGxhbWJkYSB4OiA1LzAKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKLSAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmb28iXQotICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJhciJdCi0gICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZXhjIl0KKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJGT08iXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbIkJBUiJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siRVhDIl0KICAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQogICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCiAKQEAgLTIzMSwxMiArMjMxLDYgQEAKICAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCiAKLSAgICBkZWYgQ2hlY2tFeGMoc2VsZik6Ci0gICAgICAgICMgRXhjZXB0aW9ucyBpbiB0eXBlIGNvbnZlcnRlcnMgcmVzdWx0IGluIHJldHVybmVkIE5vbmVzCi0gICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCA1IGFzICJ4IFtleGNdIicpCi0gICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQotCiAgICAgZGVmIENoZWNrQ29sTmFtZShzZWxmKToKICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCiAgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IFtiYXJdIiBmcm9tIHRlc3QnKQpAQCAtMjc5LDYgKzI3MywyMyBAQAogICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgZmxvYXQpCiAKK2NsYXNzIEJpbmFyeUNvbnZlcnRlclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgY29udmVydChzKToKKyAgICAgICAgcmV0dXJuIGJ6Mi5kZWNvbXByZXNzKHMpCisgICAgY29udmVydCA9IHN0YXRpY21ldGhvZChjb252ZXJ0KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVMpCisgICAgICAgIHNxbGl0ZS5yZWdpc3Rlcl9jb252ZXJ0ZXIoImJpbiIsIEJpbmFyeUNvbnZlcnRlclRlc3RzLmNvbnZlcnQpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY29uLmNsb3NlKCkKKworICAgIGRlZiBDaGVja0JpbmFyeUlucHV0Rm9yQ29udmVydGVyKHNlbGYpOgorICAgICAgICB0ZXN0ZGF0YSA9ICJhYmNkZWZnIiAqIDEwCisgICAgICAgIHJlc3VsdCA9IHNlbGYuY29uLmV4ZWN1dGUoJ3NlbGVjdCA/IGFzICJ4IFtiaW5dIicsIChidWZmZXIoYnoyLmNvbXByZXNzKHRlc3RkYXRhKSksKSkuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0ZXN0ZGF0YSwgcmVzdWx0KQorCiBjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCkBAIC0zMjgsOCArMzM5LDkgQEAKICAgICBkZWNsdHlwZXNfdHlwZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShEZWNsVHlwZXNUZXN0cywgIkNoZWNrIikKICAgICBjb2xuYW1lc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbE5hbWVzVGVzdHMsICJDaGVjayIpCiAgICAgYWRhcHRhdGlvbl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShPYmplY3RBZGFwdGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgYmluX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEJpbmFyeUNvbnZlcnRlclRlc3RzLCAiQ2hlY2siKQogICAgIGRhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRGF0ZVRpbWVUZXN0cywgIkNoZWNrIikKLSAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChzcWxpdGVfdHlwZV9zdWl0ZSwgZGVjbHR5cGVzX3R5cGVfc3VpdGUsIGNvbG5hbWVzX3R5cGVfc3VpdGUsIGFkYXB0YXRpb25fc3VpdGUsIGRhdGVfc3VpdGUpKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHNxbGl0ZV90eXBlX3N1aXRlLCBkZWNsdHlwZXNfdHlwZV9zdWl0ZSwgY29sbmFtZXNfdHlwZV9zdWl0ZSwgYWRhcHRhdGlvbl9zdWl0ZSwgYmluX3N1aXRlLCBkYXRlX3N1aXRlKSkKIAogZGVmIHRlc3QoKToKICAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKaW5kZXggNzg2NTZlNy4uMzFiZjI4OSAxMDA2NDQKLS0tIGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdXNlcmZ1bmN0aW9ucy5weQpAQCAtNTUsNiArNTUsOSBAQAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgcGFzcwogCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gMQorCiBjbGFzcyBBZ2dyTm9GaW5hbGl6ZToKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHBhc3MKQEAgLTE0NCw5ICsxNDcsMTIgQEAKICAgICBkZWYgQ2hlY2tGdW5jUmVmQ291bnQoc2VsZik6CiAgICAgICAgIGRlZiBnZXRmdW5jKCk6CiAgICAgICAgICAgICBkZWYgZigpOgotICAgICAgICAgICAgICAgIHJldHVybiB2YWwKKyAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgcmV0dXJuIGYKLSAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZ2V0ZnVuYygpKQorICAgICAgICBmID0gZ2V0ZnVuYygpCisgICAgICAgIGdsb2JhbHMoKVsiZm9vIl0gPSBmCisgICAgICAgICMgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZWZ0ZXN0IiwgMCwgZ2V0ZnVuYygpKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJlZnRlc3QiLCAwLCBmKQogICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQogICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJlZnRlc3QoKSIpCiAKQEAgLTE5NSw5ICsyMDEsMTIgQEAKIAogICAgIGRlZiBDaGVja0Z1bmNFeGNlcHRpb24oc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmFpc2VleGNlcHRpb24oKSIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByYWlzZWV4Y2VwdGlvbigpIikKKyAgICAgICAgICAgIGN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAndXNlci1kZWZpbmVkIGZ1bmN0aW9uIHJhaXNlZCBleGNlcHRpb24nKQogCiAgICAgZGVmIENoZWNrUGFyYW1TdHJpbmcoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0yNjcsMzEgKzI3Niw0NyBAQAogCiAgICAgZGVmIENoZWNrQWdnck5vU3RlcChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKLSAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub3N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEF0dHJpYnV0ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAiQWdnck5vU3RlcCBpbnN0YW5jZSBoYXMgbm8gYXR0cmlidXRlICdzdGVwJyIpCiAKICAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKLSAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub2ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub2ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluSW5pdChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKLSAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNJbml0KHQpIGZyb20gdGVzdCIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNJbml0KHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnX19pbml0X18nIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluU3RlcChzZWxmKToKICAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKLSAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBleGNTdGVwKHQpIGZyb20gdGVzdCIpCi0gICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNDIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjU3RlcCh0KSBmcm9tIHRlc3QiKQorICAgICAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IsIGU6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ3N0ZXAnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckV4Y2VwdGlvbkluRmluYWxpemUoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCi0gICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjRmluYWxpemUodCkgZnJvbSB0ZXN0IikKLSAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gT3BlcmF0aW9uYWxFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuT3BlcmF0aW9uYWxFcnJvciwgZToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGUuYXJnc1swXSwgInVzZXItZGVmaW5lZCBhZ2dyZWdhdGUncyAnZmluYWxpemUnIG1ldGhvZCByYWlzZWQgZXJyb3IiKQogCiAgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1TdHIoc2VsZik6CiAgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCkBAIC0zMzEsMTAgKzM1Niw1NCBAQAogICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDYwKQogCitkZWYgYXV0aG9yaXplcl9jYihhY3Rpb24sIGFyZzEsIGFyZzIsIGRibmFtZSwgc291cmNlKToKKyAgICBpZiBhY3Rpb24gIT0gc3FsaXRlLlNRTElURV9TRUxFQ1Q6CisgICAgICAgIHJldHVybiBzcWxpdGUuU1FMSVRFX0RFTlkKKyAgICBpZiBhcmcyID09ICdjMicgb3IgYXJnMSA9PSAndDInOgorICAgICAgICByZXR1cm4gc3FsaXRlLlNRTElURV9ERU5ZCisgICAgcmV0dXJuIHNxbGl0ZS5TUUxJVEVfT0sKKworY2xhc3MgQXV0aG9yaXplclRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jb24uZXhlY3V0ZXNjcmlwdCgiIiIKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MSAoYzEsIGMyKTsKKyAgICAgICAgICAgIGNyZWF0ZSB0YWJsZSB0MiAoYzEsIGMyKTsKKyAgICAgICAgICAgIGluc2VydCBpbnRvIHQxIChjMSwgYzIpIHZhbHVlcyAoMSwgMik7CisgICAgICAgICAgICBpbnNlcnQgaW50byB0MiAoYzEsIGMyKSB2YWx1ZXMgKDQsIDUpOworICAgICAgICAgICAgIiIiKQorCisgICAgICAgICMgRm9yIG91ciBzZWN1cml0eSB0ZXN0OgorICAgICAgICBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgYzIgZnJvbSB0MiIpCisKKyAgICAgICAgc2VsZi5jb24uc2V0X2F1dGhvcml6ZXIoYXV0aG9yaXplcl9jYikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrVGFibGVBY2Nlc3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAqIGZyb20gdDIiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLmVuZHN3aXRoKCJwcm9oaWJpdGVkIik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24gdGV4dDogJXMiICUgZS5hcmdzWzBdKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKKworICAgIGRlZiBDaGVja0NvbHVtbkFjY2VzcyhzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0IGMyIGZyb20gdDEiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkRhdGFiYXNlRXJyb3IsIGU6CisgICAgICAgICAgICBpZiBub3QgZS5hcmdzWzBdLmVuZHN3aXRoKCJwcm9oaWJpdGVkIik6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJ3cm9uZyBleGNlcHRpb24gdGV4dDogJXMiICUgZS5hcmdzWzBdKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIGV4Y2VwdGlvbiBkdWUgdG8gbWlzc2luZyBwcml2aWxlZ2VzIikKKwogZGVmIHN1aXRlKCk6CiAgICAgZnVuY3Rpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoRnVuY3Rpb25UZXN0cywgIkNoZWNrIikKICAgICBhZ2dyZWdhdGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQWdncmVnYXRlVGVzdHMsICJDaGVjayIpCi0gICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZnVuY3Rpb25fc3VpdGUsIGFnZ3JlZ2F0ZV9zdWl0ZSkpCisgICAgYXV0aG9yaXplcl9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShBdXRob3JpemVyVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZnVuY3Rpb25fc3VpdGUsIGFnZ3JlZ2F0ZV9zdWl0ZSwgYXV0aG9yaXplcl9zdWl0ZSkpCiAKIGRlZiB0ZXN0KCk6CiAgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQpkaWZmIC0tZ2l0IGEvTGliL3N0cmluZy5weSBiL0xpYi9zdHJpbmcucHkKaW5kZXggYmE4NWE0OS4uYTU4MzdlOSAxMDA2NDQKLS0tIGEvTGliL3N0cmluZy5weQorKysgYi9MaWIvc3RyaW5nLnB5CkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICAgICAgICAgICAgICB2YWwgPSBtYXBwaW5nW25hbWVkXQogICAgICAgICAgICAgICAgICMgV2UgdXNlIHRoaXMgaWRpb20gaW5zdGVhZCBvZiBzdHIoKSBiZWNhdXNlIHRoZSBsYXR0ZXIgd2lsbAogICAgICAgICAgICAgICAgICMgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJIGNoYXJhY3RlcnMuCi0gICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSB2YWwKKyAgICAgICAgICAgICAgICByZXR1cm4gJyVzJyAlICh2YWwsKQogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VzY2FwZWQnKSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxpbWl0ZXIKICAgICAgICAgICAgIGlmIG1vLmdyb3VwKCdpbnZhbGlkJykgaXMgbm90IE5vbmU6CkBAIC0xODYsMTMgKzE4NiwxMyBAQAogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgIyBXZSB1c2UgdGhpcyBpZGlvbSBpbnN0ZWFkIG9mIHN0cigpIGJlY2F1c2UgdGhlIGxhdHRlcgogICAgICAgICAgICAgICAgICAgICAjIHdpbGwgZmFpbCBpZiB2YWwgaXMgYSBVbmljb2RlIGNvbnRhaW5pbmcgbm9uLUFTQ0lJCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnJXMnICUgbWFwcGluZ1tuYW1lZF0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1tuYW1lZF0sKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGVsaW1pdGVyICsgbmFtZWQKICAgICAgICAgICAgIGJyYWNlZCA9IG1vLmdyb3VwKCdicmFjZWQnKQogICAgICAgICAgICAgaWYgYnJhY2VkIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSBtYXBwaW5nW2JyYWNlZF0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICclcycgJSAobWFwcGluZ1ticmFjZWRdLCkKICAgICAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmRlbGltaXRlciArICd7JyArIGJyYWNlZCArICd9JwogICAgICAgICAgICAgaWYgbW8uZ3JvdXAoJ2VzY2FwZWQnKSBpcyBub3QgTm9uZToKZGlmZiAtLWdpdCBhL0xpYi9zdHJ1Y3QucHkgYi9MaWIvc3RydWN0LnB5CmluZGV4IDkxMTNlNzEuLjA3YzIxYmYgMTAwNjQ0Ci0tLSBhL0xpYi9zdHJ1Y3QucHkKKysrIGIvTGliL3N0cnVjdC5weQpAQCAtNjQsNyArNjQsNyBAQAogCiBkZWYgcGFja19pbnRvKGZtdCwgYnVmLCBvZmZzZXQsICphcmdzKToKICAgICAiIiIKLSAgICBQYWNrIHRoZSB2YWx1ZXMgdjIsIHYyLCAuLi4gYWNjb3JkaW5nIHRvIGZtdCwgd3JpdGUKKyAgICBQYWNrIHRoZSB2YWx1ZXMgdjEsIHYyLCAuLi4gYWNjb3JkaW5nIHRvIGZtdCwgd3JpdGUKICAgICB0aGUgcGFja2VkIGJ5dGVzIGludG8gdGhlIHdyaXRhYmxlIGJ1ZmZlciBidWYgc3RhcnRpbmcgYXQgb2Zmc2V0LgogICAgIFNlZSBzdHJ1Y3QuX19kb2NfXyBmb3IgbW9yZSBvbiBmb3JtYXQgc3RyaW5ncy4KICAgICAiIiIKZGlmZiAtLWdpdCBhL0xpYi9zdWJwcm9jZXNzLnB5IGIvTGliL3N1YnByb2Nlc3MucHkKaW5kZXggYTZhZjdlNy4uMGQxOTEyOSAxMDA2NDQKLS0tIGEvTGliL3N1YnByb2Nlc3MucHkKKysrIGIvTGliL3N1YnByb2Nlc3MucHkKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIFJ1biBjb21tYW5kIHdpdGggYXJndW1lbnRzLiAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gIElmIHRoZQogICAgIGV4aXQgY29kZSB3YXMgemVybyB0aGVuIHJldHVybiwgb3RoZXJ3aXNlIHJhaXNlCiAgICAgQ2FsbGVkUHJvY2Vzc0Vycm9yLiAgVGhlIENhbGxlZFByb2Nlc3NFcnJvciBvYmplY3Qgd2lsbCBoYXZlIHRoZQotICAgIHJldHVybiBjb2RlIGluIHRoZSBlcnJubyBhdHRyaWJ1dGUuCisgICAgcmV0dXJuIGNvZGUgaW4gdGhlIHJldHVybmNvZGUgYXR0cmlidXRlLgogCiAgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIHNhbWUgYXMgZm9yIHRoZSBQb3BlbiBjb25zdHJ1Y3Rvci4gIEV4YW1wbGU6CiAKQEAgLTE0MSw4ICsxNDEsOCBAQAogCiBBIFZhbHVlRXJyb3Igd2lsbCBiZSByYWlzZWQgaWYgUG9wZW4gaXMgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHMuCiAKLWNoZWNrX2NhbGwoKSB3aWxsIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvciwgd2hpY2ggaXMgYSBzdWJjbGFzcyBvZgotT1NFcnJvciwgaWYgdGhlIGNhbGxlZCBwcm9jZXNzIHJldHVybnMgYSBub24temVybyByZXR1cm4gY29kZS4KK2NoZWNrX2NhbGwoKSB3aWxsIHJhaXNlIENhbGxlZFByb2Nlc3NFcnJvciwgaWYgdGhlIGNhbGxlZCBwcm9jZXNzCityZXR1cm5zIGEgbm9uLXplcm8gcmV0dXJuIGNvZGUuCiAKIAogU2VjdXJpdHkKQEAgLTIzNCw3ICsyMzQsNyBAQAogc3RzID0gb3Muc3lzdGVtKCJteWNtZCIgKyAiIG15YXJnIikKID09PgogcCA9IFBvcGVuKCJteWNtZCIgKyAiIG15YXJnIiwgc2hlbGw9VHJ1ZSkKLXN0cyA9IG9zLndhaXRwaWQocC5waWQsIDApCitwaWQsIHN0cyA9IG9zLndhaXRwaWQocC5waWQsIDApCiAKIE5vdGU6CiAKQEAgLTM2MCwxMSArMzYwLDE2IEBACiBpbXBvcnQgdHJhY2ViYWNrCiAKICMgRXhjZXB0aW9uIGNsYXNzZXMgdXNlZCBieSB0aGlzIG1vZHVsZS4KLWNsYXNzIENhbGxlZFByb2Nlc3NFcnJvcihPU0Vycm9yKToKK2NsYXNzIENhbGxlZFByb2Nlc3NFcnJvcihFeGNlcHRpb24pOgogICAgICIiIlRoaXMgZXhjZXB0aW9uIGlzIHJhaXNlZCB3aGVuIGEgcHJvY2VzcyBydW4gYnkgY2hlY2tfY2FsbCgpIHJldHVybnMKICAgICBhIG5vbi16ZXJvIGV4aXQgc3RhdHVzLiAgVGhlIGV4aXQgc3RhdHVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZQotICAgIGVycm5vIGF0dHJpYnV0ZS4gIFRoaXMgZXhjZXB0aW9uIGlzIGEgc3ViY2xhc3Mgb2YKLSAgICBPU0Vycm9yLiIiIgorICAgIHJldHVybmNvZGUgYXR0cmlidXRlLiIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCByZXR1cm5jb2RlLCBjbWQpOgorICAgICAgICBzZWxmLnJldHVybmNvZGUgPSByZXR1cm5jb2RlCisgICAgICAgIHNlbGYuY21kID0gY21kCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiQ29tbWFuZCAnJXMnIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgc3RhdHVzICVkIiAlIChzZWxmLmNtZCwgc2VsZi5yZXR1cm5jb2RlKQorCiAKIGlmIG1zd2luZG93czoKICAgICBpbXBvcnQgdGhyZWFkaW5nCkBAIC00NDIsNyArNDQ3LDcgQEAKICAgICAiIiJSdW4gY29tbWFuZCB3aXRoIGFyZ3VtZW50cy4gIFdhaXQgZm9yIGNvbW1hbmQgdG8gY29tcGxldGUuICBJZgogICAgIHRoZSBleGl0IGNvZGUgd2FzIHplcm8gdGhlbiByZXR1cm4sIG90aGVyd2lzZSByYWlzZQogICAgIENhbGxlZFByb2Nlc3NFcnJvci4gIFRoZSBDYWxsZWRQcm9jZXNzRXJyb3Igb2JqZWN0IHdpbGwgaGF2ZSB0aGUKLSAgICByZXR1cm4gY29kZSBpbiB0aGUgZXJybm8gYXR0cmlidXRlLgorICAgIHJldHVybiBjb2RlIGluIHRoZSByZXR1cm5jb2RlIGF0dHJpYnV0ZS4KIAogICAgIFRoZSBhcmd1bWVudHMgYXJlIHRoZSBzYW1lIGFzIGZvciB0aGUgUG9wZW4gY29uc3RydWN0b3IuICBFeGFtcGxlOgogCkBAIC00NTMsNyArNDU4LDcgQEAKICAgICBpZiBjbWQgaXMgTm9uZToKICAgICAgICAgY21kID0gcG9wZW5hcmdzWzBdCiAgICAgaWYgcmV0Y29kZToKLSAgICAgICAgcmFpc2UgQ2FsbGVkUHJvY2Vzc0Vycm9yKHJldGNvZGUsICJDb21tYW5kICVzIHJldHVybmVkIG5vbi16ZXJvIGV4aXQgc3RhdHVzIiAlIGNtZCkKKyAgICAgICAgcmFpc2UgQ2FsbGVkUHJvY2Vzc0Vycm9yKHJldGNvZGUsIGNtZCkKICAgICByZXR1cm4gcmV0Y29kZQogCiAKQEAgLTYxMyw3ICs2MTgsNyBAQAogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICMgSW4gY2FzZSB0aGUgY2hpbGQgaGFzbid0IGJlZW4gd2FpdGVkIG9uLCBjaGVjayBpZiBpdCdzIGRvbmUuCiAgICAgICAgIHNlbGYucG9sbChfZGVhZHN0YXRlPXN5cy5tYXhpbnQpCi0gICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZSBhbmQgX2FjdGl2ZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KICAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCiAKQEAgLTk0MSw3ICs5NDYsNyBAQAogCiAKICAgICAgICAgZGVmIF9jbG9zZV9mZHMoc2VsZiwgYnV0KToKLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDMsIE1BWEZEKToKKyAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZSgzLCBNQVhGRCk6CiAgICAgICAgICAgICAgICAgaWYgaSA9PSBidXQ6CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL3RhcmZpbGUucHkgYi9MaWIvdGFyZmlsZS5weQppbmRleCAwNjFkMGY1Li5jMTg1ZmJkIDEwMDY0NAotLS0gYS9MaWIvdGFyZmlsZS5weQorKysgYi9MaWIvdGFyZmlsZS5weQpAQCAtNDE3LDcgKzQxNywxMyBAQAogICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHNlbGYuYnVmKQogICAgICAgICAgICAgc2VsZi5idWYgPSAiIgogICAgICAgICAgICAgaWYgc2VsZi5jb21wdHlwZSA9PSAiZ3oiOgotICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPGwiLCBzZWxmLmNyYykpCisgICAgICAgICAgICAgICAgIyBUaGUgbmF0aXZlIHpsaWIgY3JjIGlzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBidXQKKyAgICAgICAgICAgICAgICAjIHRoZSBQeXRob24gd3JhcHBlciBpbXBsaWNpdGx5IGNhc3RzIHRoYXQgdG8gYSBzaWduZWQgQworICAgICAgICAgICAgICAgICMgbG9uZy4gIFNvLCBvbiBhIDMyLWJpdCBib3ggc2VsZi5jcmMgbWF5ICJsb29rIG5lZ2F0aXZlIiwKKyAgICAgICAgICAgICAgICAjIHdoaWxlIHRoZSBzYW1lIGNyYyBvbiBhIDY0LWJpdCBib3ggbWF5ICJsb29rIHBvc2l0aXZlIi4KKyAgICAgICAgICAgICAgICAjIFRvIGF2b2lkIGlya3NvbWUgd2FybmluZ3MgZnJvbSB0aGUgYHN0cnVjdGAgbW9kdWxlLCBmb3JjZQorICAgICAgICAgICAgICAgICMgaXQgdG8gbG9vayBwb3NpdGl2ZSBvbiBhbGwgYm94ZXMuCisgICAgICAgICAgICAgICAgc2VsZi5maWxlb2JqLndyaXRlKHN0cnVjdC5wYWNrKCI8TCIsIHNlbGYuY3JjICYgMHhmZmZmZmZmZkwpKQogICAgICAgICAgICAgICAgIHNlbGYuZmlsZW9iai53cml0ZShzdHJ1Y3QucGFjaygiPEwiLCBzZWxmLnBvcyAmIDB4ZmZmZkZGRkZMKSkKIAogICAgICAgICBpZiBub3Qgc2VsZi5fZXh0ZmlsZW9iajoKQEAgLTE3NTAsMTMgKzE3NTYsNiBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHRhcmluZm8gPSBUYXJJbmZvLmZyb21idWYoYnVmKQogCi0gICAgICAgICAgICAgICAgIyBXZSBzaG91bGRuJ3QgcmVseSBvbiB0aGlzIGNoZWNrc3VtLCBiZWNhdXNlIHNvbWUgdGFyIHByb2dyYW1zCi0gICAgICAgICAgICAgICAgIyBjYWxjdWxhdGUgaXQgZGlmZmVyZW50bHkgYW5kIGl0IGlzIG1lcmVseSB2YWxpZGF0aW5nIHRoZQotICAgICAgICAgICAgICAgICMgaGVhZGVyIGJsb2NrLiBXZSBjb3VsZCBqdXN0IGFzIHdlbGwgc2tpcCB0aGlzIHBhcnQsIHdoaWNoIHdvdWxkCi0gICAgICAgICAgICAgICAgIyBoYXZlIGEgc2xpZ2h0IGVmZmVjdCBvbiBwZXJmb3JtYW5jZS4uLgotICAgICAgICAgICAgICAgIGlmIHRhcmluZm8uY2hrc3VtIG5vdCBpbiBjYWxjX2Noa3N1bXMoYnVmKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5fZGJnKDEsICJ0YXJmaWxlOiBCYWQgQ2hlY2tzdW0gJXIiICUgdGFyaW5mby5uYW1lKQotCiAgICAgICAgICAgICAgICAgIyBTZXQgdGhlIFRhckluZm8gb2JqZWN0J3Mgb2Zmc2V0IHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZQogICAgICAgICAgICAgICAgICMgVGFyRmlsZSBhbmQgc2V0IHNlbGYub2Zmc2V0IHRvIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgZGF0YSBibG9ja3MKICAgICAgICAgICAgICAgICAjIHNob3VsZCBiZWdpbi4KZGlmZiAtLWdpdCBhL0xpYi90ZWxuZXRsaWIucHkgYi9MaWIvdGVsbmV0bGliLnB5CmluZGV4IDM1MjMwMzcuLmExM2U4NWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZWxuZXRsaWIucHkKKysrIGIvTGliL3RlbG5ldGxpYi5weQpAQCAtMzExLDYgKzMxMSw4IEBACiAgICAgICAgIHNfYXJncyA9IHNfcmVwbHkKICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKICAgICAgICAgICAgIHNfYXJncyA9IHNfYXJncyArICh0aW1lb3V0LCkKKyAgICAgICAgICAgIGZyb20gdGltZSBpbXBvcnQgdGltZQorICAgICAgICAgICAgdGltZV9zdGFydCA9IHRpbWUoKQogICAgICAgICB3aGlsZSBub3Qgc2VsZi5lb2YgYW5kIHNlbGVjdC5zZWxlY3QoKnNfYXJncykgPT0gc19yZXBseToKICAgICAgICAgICAgIGkgPSBtYXgoMCwgbGVuKHNlbGYuY29va2VkcSktbikKICAgICAgICAgICAgIHNlbGYuZmlsbF9yYXdxKCkKQEAgLTMyMSw2ICszMjMsMTEgQEAKICAgICAgICAgICAgICAgICBidWYgPSBzZWxmLmNvb2tlZHFbOmldCiAgICAgICAgICAgICAgICAgc2VsZi5jb29rZWRxID0gc2VsZi5jb29rZWRxW2k6XQogICAgICAgICAgICAgICAgIHJldHVybiBidWYKKyAgICAgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgZWxhcHNlZCA9IHRpbWUoKSAtIHRpbWVfc3RhcnQKKyAgICAgICAgICAgICAgICBpZiBlbGFwc2VkID49IHRpbWVvdXQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc19hcmdzID0gc19yZXBseSArICh0aW1lb3V0LWVsYXBzZWQsKQogICAgICAgICByZXR1cm4gc2VsZi5yZWFkX3ZlcnlfbGF6eSgpCiAKICAgICBkZWYgcmVhZF9hbGwoc2VsZik6CkBAIC02MDEsNiArNjA4LDkgQEAKICAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGxpc3RbaV0sICJzZWFyY2giKToKICAgICAgICAgICAgICAgICBpZiBub3QgcmU6IGltcG9ydCByZQogICAgICAgICAgICAgICAgIGxpc3RbaV0gPSByZS5jb21waWxlKGxpc3RbaV0pCisgICAgICAgIGlmIHRpbWVvdXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmcm9tIHRpbWUgaW1wb3J0IHRpbWUKKyAgICAgICAgICAgIHRpbWVfc3RhcnQgPSB0aW1lKCkKICAgICAgICAgd2hpbGUgMToKICAgICAgICAgICAgIHNlbGYucHJvY2Vzc19yYXdxKCkKICAgICAgICAgICAgIGZvciBpIGluIGluZGljZXM6CkBAIC02MTMsNyArNjIzLDExIEBACiAgICAgICAgICAgICBpZiBzZWxmLmVvZjoKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgaWYgdGltZW91dCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdChbc2VsZi5maWxlbm8oKV0sIFtdLCBbXSwgdGltZW91dCkKKyAgICAgICAgICAgICAgICBlbGFwc2VkID0gdGltZSgpIC0gdGltZV9zdGFydAorICAgICAgICAgICAgICAgIGlmIGVsYXBzZWQgPj0gdGltZW91dDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBzX2FyZ3MgPSAoW3NlbGYuZmlsZW5vKCldLCBbXSwgW10sIHRpbWVvdXQtZWxhcHNlZCkKKyAgICAgICAgICAgICAgICByLCB3LCB4ID0gc2VsZWN0LnNlbGVjdCgqc19hcmdzKQogICAgICAgICAgICAgICAgIGlmIG5vdCByOgogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgc2VsZi5maWxsX3Jhd3EoKQpkaWZmIC0tZ2l0IGEvTGliL3RlbXBmaWxlLnB5IGIvTGliL3RlbXBmaWxlLnB5CmluZGV4IGRkN2U4NjQuLjJlOGNkNmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVtcGZpbGUucHkKQEAgLTQ0Niw3ICs0NDYsNyBAQAogICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD10ZW1wbGF0ZSwgZGlyPU5vbmUpOgogICAgICAgICAiIiJDcmVhdGUgYW5kIHJldHVybiBhIHRlbXBvcmFyeSBmaWxlLgogICAgICAgICBBcmd1bWVudHM6Ci0gICAgICAgICdwcmVmaXgnLCAnc3VmZml4JywgJ2RpcmVjdG9yeScgLS0gYXMgZm9yIG1rc3RlbXAuCisgICAgICAgICdwcmVmaXgnLCAnc3VmZml4JywgJ2RpcicgLS0gYXMgZm9yIG1rc3RlbXAuCiAgICAgICAgICdtb2RlJyAtLSB0aGUgbW9kZSBhcmd1bWVudCB0byBvcy5mZG9wZW4gKGRlZmF1bHQgIncrYiIpLgogICAgICAgICAnYnVmc2l6ZScgLS0gdGhlIGJ1ZmZlciBzaXplIGFyZ3VtZW50IHRvIG9zLmZkb3BlbiAoZGVmYXVsdCAtMSkuCiAgICAgICAgIFRoZSBmaWxlIGlzIGNyZWF0ZWQgYXMgbWtzdGVtcCgpIHdvdWxkIGRvIGl0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfY29kZV9vYmoucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9ib2d1c19jb2RlX29iai5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTNhZTUxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ndXNfY29kZV9vYmoucHkKQEAgLTAsMCArMSwxOSBAQAorIiIiCitCcm9rZW4gYnl0ZWNvZGUgb2JqZWN0cyBjYW4gZWFzaWx5IGNyYXNoIHRoZSBpbnRlcnByZXRlci4KKworVGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgZml4ZWQuICBJdCBpcyBnZW5lcmFsbHkgYWdyZWVkIHRoYXQgdGhlcmUgaXMgbm8KK3BvaW50IGluIHdyaXRpbmcgYSBieXRlY29kZSB2ZXJpZmllciBhbmQgcHV0dGluZyBpdCBpbiBDUHl0aG9uIGp1c3QgZm9yCit0aGlzLiAgTW9yZW92ZXIsIGEgdmVyaWZpZXIgaXMgYm91bmQgdG8gYWNjZXB0IG9ubHkgYSBzdWJzZXQgb2YgYWxsIHNhZmUKK2J5dGVjb2Rlcywgc28gaXQgY291bGQgbGVhZCB0byB1bm5lY2Vzc2FyeSBicmVha2FnZS4KKworRm9yIHNlY3VyaXR5IHB1cnBvc2VzLCAicmVzdHJpY3RlZCIgaW50ZXJwcmV0ZXJzIGFyZSBub3QgZ29pbmcgdG8gbGV0Cit0aGUgdXNlciBidWlsZCBvciBsb2FkIHJhbmRvbSBieXRlY29kZXMgYW55d2F5LiAgT3RoZXJ3aXNlLCB0aGlzIGlzIGEKKyJ3b24ndCBmaXgiIGNhc2UuCisKKyIiIgorCitpbXBvcnQgdHlwZXMKKworY28gPSB0eXBlcy5Db2RlVHlwZSgwLCAwLCAwLCAwLCAnXHgwNFx4NzFceDAwXHgwMCcsICgpLAorICAgICAgICAgICAgICAgICAgICAoKSwgKCksICcnLCAnJywgMSwgJycpCitleGVjIGNvCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9ib3Jyb3dlZF9yZWZfMS5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2JvcnJvd2VkX3JlZl8xLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNmVkZTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9ib3Jyb3dlZF9yZWZfMS5weQpAQCAtMCwwICsxLDI5IEBACisiIiIKK19QeVR5cGVfTG9va3VwKCkgcmV0dXJucyBhIGJvcnJvd2VkIHJlZmVyZW5jZS4KK1RoaXMgYXR0YWNrcyB0aGUgY2FsbCBpbiBkaWN0b2JqZWN0LmMuCisiIiIKKworY2xhc3MgQShvYmplY3QpOgorICAgIHBhc3MKKworY2xhc3MgQihvYmplY3QpOgorICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBwcmludCAnaGknCisgICAgICAgIGRlbCBELl9fbWlzc2luZ19fCisKK2NsYXNzIEQoZGljdCk6CisgICAgY2xhc3MgX19taXNzaW5nX186CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgICAgICBwYXNzCisKKworZCA9IEQoKQorYSA9IEEoKQorYS5jeWNsZSA9IGEKK2Eub3RoZXIgPSBCKCkKK2RlbCBhCisKK3ByZXYgPSBOb25lCit3aGlsZSAxOgorICAgIGRbNV0KKyAgICBwcmV2ID0gKHByZXYsKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzIucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9ib3Jyb3dlZF9yZWZfMi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTdiM2ZmCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvYm9ycm93ZWRfcmVmXzIucHkKQEAgLTAsMCArMSwzOCBAQAorIiIiCitfUHlUeXBlX0xvb2t1cCgpIHJldHVybnMgYSBib3Jyb3dlZCByZWZlcmVuY2UuCitUaGlzIGF0dGFja3MgUHlPYmplY3RfR2VuZXJpY1NldEF0dHIoKS4KKworTkIuIG9uIG15IG1hY2hpbmUgdGhpcyBjcmFzaGVzIGluIDIuNSBkZWJ1ZyBidXQgbm90IHJlbGVhc2UuCisiIiIKKworY2xhc3MgQShvYmplY3QpOgorICAgIHBhc3MKKworY2xhc3MgQihvYmplY3QpOgorICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBwcmludCAiaGkiCisgICAgICAgIGRlbCBDLmQKKworY2xhc3MgRChvYmplY3QpOgorICAgIGRlZiBfX3NldF9fKHNlbGYsIG9iaiwgdmFsdWUpOgorICAgICAgICBzZWxmLmhlbGxvID0gNDIKKworY2xhc3MgQyhvYmplY3QpOgorICAgIGQgPSBEKCkKKworICAgIGRlZiBnKCk6CisgICAgICAgIHBhc3MKKworCitjID0gQygpCithID0gQSgpCithLmN5Y2xlID0gYQorYS5vdGhlciA9IEIoKQorCitsc3QgPSBbTm9uZV0gKiAxMDAwMDAwCitpID0gMAorZGVsIGEKK3doaWxlIDE6CisgICAgYy5kID0gNDIgICAgICAgICAjIHNlZ2ZhdWx0cyBpbiBQeU1ldGhvZF9OZXcoaW1fZnVuYz1ELl9fc2V0X18sIGltX3NlbGY9ZCkKKyAgICBsc3RbaV0gPSBjLmcgICAgICMgY29uc3VtZSB0aGUgZnJlZSBsaXN0IG9mIGluc3RhbmNlbWV0aG9kIG9iamVjdHMKKyAgICBpICs9IDEKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL2NvZXJjZS5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2NvZXJjZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc0OTU2Yi4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9jcmFzaGVycy9jb2VyY2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotIyBodHRwOi8vcHl0aG9uLm9yZy9zZi85OTIwMTcKLQotY2xhc3MgZm9vOgotICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgcmV0dXJuIG90aGVyLCBzZWxmCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgZm9vKCkrMSAgICMgc2VnZmF1bHQ6IGluZmluaXRlIHJlY3Vyc2lvbiBpbiBDCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9nY19pbnNwZWN0aW9uLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvZ2NfaW5zcGVjdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGNhYTc5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvZ2NfaW5zcGVjdGlvbi5weQpAQCAtMCwwICsxLDMyIEBACisiIiIKK2djLmdldF9yZWZlcnJlcnMoKSBjYW4gYmUgdXNlZCB0byBzZWUgb2JqZWN0cyBiZWZvcmUgdGhleSBhcmUgZnVsbHkgYnVpbHQuCisKK05vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYW4gZXhhbXBsZS4gIFRoZXJlIGFyZSBtYW55IHdheXMgdG8gY3Jhc2ggUHl0aG9uCitieSB1c2luZyBnYy5nZXRfcmVmZXJyZXJzKCksIGFzIHdlbGwgYXMgbWFueSBleHRlbnNpb24gbW9kdWxlcyAoZXZlbgord2hlbiB0aGV5IGFyZSB1c2luZyBwZXJmZWN0bHkgZG9jdW1lbnRlZCBwYXR0ZXJucyB0byBidWlsZCBvYmplY3RzKS4KKworSWRlbnRpZnlpbmcgYW5kIHJlbW92aW5nIGFsbCBwbGFjZXMgdGhhdCBleHBvc2UgdG8gdGhlIEdDIGEKK3BhcnRpYWxseS1idWlsdCBvYmplY3QgaXMgYSBsb25nLXRlcm0gcHJvamVjdC4gIEEgcGF0Y2ggd2FzIHByb3Bvc2VkIG9uCitTRiBzcGVjaWZpY2FsbHkgZm9yIHRoaXMgZXhhbXBsZSBidXQgSSBjb25zaWRlciBmaXhpbmcganVzdCB0aGlzIHNpbmdsZQorZXhhbXBsZSBhIGJpdCBwb2ludGxlc3MgKCMxNTE3MDQyKS4KKworQSBmaXggd291bGQgaW5jbHVkZSBhIHdob2xlLXNjYWxlIGNvZGUgcmV2aWV3LCBwb3NzaWJseSB3aXRoIGFuIEFQSQorY2hhbmdlIHRvIGRlY291cGxlIG9iamVjdCBjcmVhdGlvbiBhbmQgR0MgcmVnaXN0cmF0aW9uLCBhbmQgYWNjb3JkaW5nCitmaXhlcyB0byB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZXh0ZW5zaW9uIG1vZHVsZSB3cml0ZXJzLiAgSXQncyB1bmxpa2VseQordG8gaGFwcGVuLCB0aG91Z2guICBTbyB0aGlzIGlzIGN1cnJlbnRseSBjbGFzc2lmaWVkIGFzCisiZ2MuZ2V0X3JlZmVycmVycygpIGlzIGRhbmdlcm91cywgdXNlIG9ubHkgZm9yIGRlYnVnZ2luZyIuCisiIiIKKworaW1wb3J0IGdjCisKKworZGVmIGcoKToKKyAgICBtYXJrZXIgPSBvYmplY3QoKQorICAgIHlpZWxkIG1hcmtlcgorICAgICMgbm93IHRoZSBtYXJrZXIgaXMgaW4gdGhlIHR1cGxlIGJlaW5nIGNvbnN0cnVjdGVkCisgICAgW3R1cF0gPSBbeCBmb3IgeCBpbiBnYy5nZXRfcmVmZXJyZXJzKG1hcmtlcikgaWYgdHlwZSh4KSBpcyB0dXBsZV0KKyAgICBwcmludCB0dXAKKyAgICBwcmludCB0dXBbMV0KKworCit0dXBsZShnKCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9pbmZpbml0ZV9yZWNfMy5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL2luZmluaXRlX3JlY18zLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjA0ZTRjLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2NyYXNoZXJzL2luZmluaXRlX3JlY18zLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0KLSMgaHR0cDovL3B5dGhvbi5vcmcvc2YvMTIwMjUzMwotCi1jbGFzcyBBKG9iamVjdCk6Ci0gICAgcGFzcwotQS5fX2NhbGxfXyA9IEEoKQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIEEoKSgpICAgIyBzZWdmYXVsdDogaW5maW5pdGUgcmVjdXJzaW9uIGluIEMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2lvbl9saW1pdF90b29faGlnaC5weSBiL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2lvbl9saW1pdF90b29faGlnaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmE0ZDMyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvcmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoLnB5CkBAIC0wLDAgKzEsMTYgQEAKKyMgVGhlIGZvbGxvd2luZyBleGFtcGxlIG1heSBjcmFzaCBvciBub3QgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4KKyMgRS5nLiBvbiAzMi1iaXQgSW50ZWwgTGludXggaW4gYSAic3RhbmRhcmQiIGNvbmZpZ3VyYXRpb24gaXQgc2VlbXMgdG8KKyMgY3Jhc2ggb24gUHl0aG9uIDIuNSAoYnV0IG5vdCAyLjQgbm9yIDIuMykuICBPbiBXaW5kb3dzIHRoZSBpbXBvcnQKKyMgZXZlbnR1YWxseSBmYWlscyB0byBmaW5kIHRoZSBtb2R1bGUsIHBvc3NpYmx5IGJlY2F1c2Ugd2UgcnVuIG91dCBvZgorIyBmaWxlIGhhbmRsZXMuCisKKyMgVGhlIHBvaW50IG9mIHRoaXMgZXhhbXBsZSBpcyB0byBzaG93IHRoYXQgc3lzLnNldHJlY3Vyc2lvbmxpbWl0KCkgaXMgYQorIyBoYWNrLCBhbmQgbm90IGEgcm9idXN0IHNvbHV0aW9uLiAgVGhpcyBleGFtcGxlIHNpbXBseSBleGVyY2ljZXMgYSBwYXRoCisjIHdoZXJlIGl0IHRha2VzIG1hbnkgQy1sZXZlbCByZWN1cnNpb25zLCBjb25zdW1pbmcgYSBsb3Qgb2Ygc3RhY2sKKyMgc3BhY2UsIGZvciBlYWNoIFB5dGhvbi1sZXZlbCByZWN1cnNpb24uICBTbyAxMDAwIHRpbWVzIHRoaXMgYW1vdW50IG9mCisjIHN0YWNrIHNwYWNlIG1heSBiZSB0b28gbXVjaCBmb3Igc3RhbmRhcmQgcGxhdGZvcm1zIGFscmVhZHkuCisKK2ltcG9ydCBzeXMKK2lmICdyZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gnIGluIHN5cy5tb2R1bGVzOgorICAgIGRlbCBzeXMubW9kdWxlc1sncmVjdXJzaW9uX2xpbWl0X3Rvb19oaWdoJ10KK2ltcG9ydCByZWN1cnNpb25fbGltaXRfdG9vX2hpZ2gKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL3JlY3Vyc2l2ZV9jYWxsLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMvcmVjdXJzaXZlX2NhbGwucHkKaW5kZXggMDc3NjQ3OS4uMzFjODk2MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvY3Jhc2hlcnMvcmVjdXJzaXZlX2NhbGwucHkKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvcmVjdXJzaXZlX2NhbGwucHkKQEAgLTEsNiArMSwxMSBAQAogIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiAKICMgTm8gYnVnIHJlcG9ydCBBRkFJSywgbWFpbCBvbiBweXRob24tZGV2IG9uIDIwMDYtMDEtMTAKKworIyBUaGlzIGlzIGEgIndvbid0IGZpeCIgY2FzZS4gIEl0IGlzIGtub3duIHRoYXQgc2V0dGluZyBhIGhpZ2ggZW5vdWdoCisjIHJlY3Vyc2lvbiBsaW1pdCBjcmFzaGVzIGJ5IG92ZXJmbG93aW5nIHRoZSBzdGFjay4gIFVubGVzcyB0aGlzIGlzCisjIHJlZGVzaWduZWQgc29tZWhvdywgaXQgd29uJ3QgZ28gYXdheS4KKwogaW1wb3J0IHN5cwogCiBzeXMuc2V0cmVjdXJzaW9ubGltaXQoMSA8PCAzMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL3htbF9wYXJzZXJzLnB5IGIvTGliL3Rlc3QvY3Jhc2hlcnMveG1sX3BhcnNlcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YjU3MjcuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvY3Jhc2hlcnMveG1sX3BhcnNlcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi1mcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAotCi0jIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyOTY0MzMKLQotZGVmIHRlc3RfcGFyc2Vfb25seV94bWxfZGF0YSgpOgotICAgICMKLSAgICB4bWwgPSAiPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0naXNvODg1OSc/PjxzPiVzPC9zPiIgJSAoJ2EnICogMTAyNSkKLSAgICAjIHRoaXMgb25lIGRvZXNuJ3QgY3Jhc2gKLSAgICAjeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCc/PjxzPiVzPC9zPiIgJSAoJ2EnICogMTAwMDApCi0KLSAgICBkZWYgaGFuZGxlcih0ZXh0KToKLSAgICAgICAgcmFpc2UgRXhjZXB0aW9uCi0KLSAgICBwYXJzZXIgPSBleHBhdC5QYXJzZXJDcmVhdGUoKQotICAgIHBhcnNlci5DaGFyYWN0ZXJEYXRhSGFuZGxlciA9IGhhbmRsZXIKLQotICAgIHRyeToKLSAgICAgICAgcGFyc2VyLlBhcnNlKHhtbCkKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICB0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKQotCi0jIEludmFsaWQgcmVhZCBvZiBzaXplIDQKLSMgICAgYXQgMHg0M0Y5MzY6IFB5T2JqZWN0X0ZyZWUgKG9ibWFsbG9jLmM6NzM1KQotIyAgICBieSAweDQ1QTdDNzogdW5pY29kZV9kZWFsbG9jICh1bmljb2Rlb2JqZWN0LmM6MjQ2KQotIyAgICBieSAweDEyOTkwMjFEOiBQeVVua25vd25FbmNvZGluZ0hhbmRsZXIgKHB5ZXhwYXQuYzoxMzE0KQotIyAgICBieSAweDEyOTkzQTY2OiBwcm9jZXNzWG1sRGVjbCAoeG1scGFyc2UuYzozMzMwKQotIyAgICBieSAweDEyOTk5MjExOiBkb1Byb2xvZyAoeG1scGFyc2UuYzozNjc4KQotIyAgICBieSAweDEyOTlDM0YwOiBwcm9sb2dJbml0UHJvY2Vzc29yICh4bWxwYXJzZS5jOjM1NTApCi0jICAgIGJ5IDB4MTI5OTFFQTM6IFhNTF9QYXJzZUJ1ZmZlciAoeG1scGFyc2UuYzoxNTYyKQotIyAgICBieSAweDEyOThGOEVDOiB4bWxwYXJzZV9QYXJzZSAocHlleHBhdC5jOjg5NSkKLSMgICAgYnkgMHg0N0IzQTE6IFB5RXZhbF9FdmFsRnJhbWVFeCAoY2V2YWwuYzozNTY1KQotIyAgICBieSAweDQ3Q0NBQzogUHlFdmFsX0V2YWxDb2RlRXggKGNldmFsLmM6MjczOSkKLSMgICAgYnkgMHg0N0NERTE6IFB5RXZhbF9FdmFsQ29kZSAoY2V2YWwuYzo0OTApCi0jICAgIGJ5IDB4NDk5ODIwOiBQeVJ1bl9TaW1wbGVGaWxlRXhGbGFncyAocHl0aG9ucnVuLmM6MTE5OCkKLSMgICAgYnkgMHg0MTE3RjE6IFB5X01haW4gKG1haW4uYzo0OTIpCi0jICAgIGJ5IDB4MTI0NzZEMUY6IF9fbGliY19zdGFydF9tYWluIChpbiAvbGliL2xpYmMtMi4zLjUuc28pCi0jICAgIGJ5IDB4NDEwREM5OiAod2l0aGluIC9ob21lL25lYWwvYnVpbGQvcHl0aG9uL3N2bi9jbGVhbi9weXRob24pCi0jICBBZGRyZXNzIDB4MTI3MDQwMjAgaXMgMjY0IGJ5dGVzIGluc2lkZSBhIGJsb2NrIG9mIHNpemUgNTkyIGZyZWUnZAotIyAgICBhdCAweDExQjFCQThBOiBmcmVlICh2Z19yZXBsYWNlX21hbGxvYy5jOjIzNSkKLSMgICAgYnkgMHgxMjRCNUYxODogKHdpdGhpbiAvbGliL2xpYmMtMi4zLjUuc28pCi0jICAgIGJ5IDB4NDhERTQzOiBmaW5kX21vZHVsZSAoaW1wb3J0LmM6MTMyMCkKLSMgICAgYnkgMHg0OEU5OTc6IGltcG9ydF9zdWJtb2R1bGUgKGltcG9ydC5jOjIyNDkpCi0jICAgIGJ5IDB4NDhFQzE1OiBsb2FkX25leHQgKGltcG9ydC5jOjIwODMpCi0jICAgIGJ5IDB4NDhGMDkxOiBpbXBvcnRfbW9kdWxlX2V4IChpbXBvcnQuYzoxOTE0KQotIyAgICBieSAweDQ4RjM4NTogUHlJbXBvcnRfSW1wb3J0TW9kdWxlRXggKGltcG9ydC5jOjE5NTUpCi0jICAgIGJ5IDB4NDZEMDcwOiBidWlsdGluX19faW1wb3J0X18gKGJsdGlubW9kdWxlLmM6NDQpCi0jICAgIGJ5IDB4NDE4NkNGOiBQeU9iamVjdF9DYWxsIChhYnN0cmFjdC5jOjE3NzcpCi0jICAgIGJ5IDB4NDc0RTlCOiBQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyAoY2V2YWwuYzozNDMyKQotIyAgICBieSAweDQ3OTI4RTogUHlFdmFsX0V2YWxGcmFtZUV4IChjZXZhbC5jOjIwMzgpCi0jICAgIGJ5IDB4NDdDQ0FDOiBQeUV2YWxfRXZhbENvZGVFeCAoY2V2YWwuYzoyNzM5KQotIyAgICBieSAweDQ3Q0RFMTogUHlFdmFsX0V2YWxDb2RlIChjZXZhbC5jOjQ5MCkKLSMgICAgYnkgMHg0OEQwRjc6IFB5SW1wb3J0X0V4ZWNDb2RlTW9kdWxlRXggKGltcG9ydC5jOjYzNSkKLSMgICAgYnkgMHg0OEQ0RjQ6IGxvYWRfc291cmNlX21vZHVsZSAoaW1wb3J0LmM6OTEzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZm9ya193YWl0LnB5IGIvTGliL3Rlc3QvZm9ya193YWl0LnB5CmluZGV4IDU2MDBiZGIuLjdlYjU1ZjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L2Zvcmtfd2FpdC5weQorKysgYi9MaWIvdGVzdC9mb3JrX3dhaXQucHkKQEAgLTM0LDcgKzM0LDE0IEBACiAgICAgICAgICAgICAgICAgcGFzcwogCiAgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKLSAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXRwaWQoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChjcGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDIgKiBTSE9SVFNMRUVQKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X29zc2F1ZGlvZGV2IGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3NzYXVkaW9kZXYKaW5kZXggOWY1NWFmYS4uZjBkZjVkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3NzYXVkaW9kZXYKKysrIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3Rfb3NzYXVkaW9kZXYKQEAgLTEsMyArMSwyIEBACiB0ZXN0X29zc2F1ZGlvZGV2Ci1wbGF5aW5nIHRlc3Qgc291bmQgZmlsZS4uLgotZWxhcHNlZCB0aW1lOiAzLjEgc2VjCitwbGF5aW5nIHRlc3Qgc291bmQgZmlsZSAoZXhwZWN0ZWQgcnVubmluZyB0aW1lOiAyLjkzIHNlYykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X3RocmVhZCBiL0xpYi90ZXN0L291dHB1dC90ZXN0X3RocmVhZAppbmRleCBkNDk2NTFkLi42OGM2YTkyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF90aHJlYWQKKysrIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfdGhyZWFkCkBAIC00LDMgKzQsMTUgQEAKIAogKioqIEJhcnJpZXIgVGVzdCAqKioKIGFsbCB0YXNrcyBkb25lCisKKyoqKiBDaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZSAqKioKK2NhdWdodCBleHBlY3RlZCBWYWx1ZUVycm9yIHNldHRpbmcgc3RhY2tfc2l6ZSg0MDk2KQorc3VjY2Vzc2Z1bGx5IHNldCBzdGFja19zaXplKDI2MjE0NCkKK3N1Y2Nlc3NmdWxseSBzZXQgc3RhY2tfc2l6ZSgxMDQ4NTc2KQorc3VjY2Vzc2Z1bGx5IHNldCBzdGFja19zaXplKDApCit0cnlpbmcgc3RhY2tfc2l6ZSA9IDI2MjE0NAord2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlCithbGwgdGFza3MgZG9uZQordHJ5aW5nIHN0YWNrX3NpemUgPSAxMDQ4NTc2Cit3YWl0aW5nIGZvciBhbGwgdGFza3MgdG8gY29tcGxldGUKK2FsbCB0YXNrcyBkb25lCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9yZWdydGVzdC5weSBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CmluZGV4IGNhNGEzYjUuLjQ1NTM4MzggMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5CkBAIC02Niw3ICs2Niw5IEBACiAKIC1NIHJ1bnMgdGVzdHMgdGhhdCByZXF1aXJlIGFuIGV4b3JiaXRhbnQgYW1vdW50IG9mIG1lbW9yeS4gVGhlc2UgdGVzdHMKIHR5cGljYWxseSB0cnkgdG8gYXNjZXJ0YWluIGNvbnRhaW5lcnMga2VlcCB3b3JraW5nIHdoZW4gY29udGFpbmluZyBtb3JlIHRoYW4KLTIgYmlsaW9uIG9iamVjdHMsIGFuZCBvbmx5IHdvcmsgb24gNjQtYml0IHN5c3RlbXMuIFRoZSBwYXNzZWQtaW4gbWVtbGltaXQsCisyIGJpbGxpb24gb2JqZWN0cywgd2hpY2ggb25seSB3b3JrcyBvbiA2NC1iaXQgc3lzdGVtcy4gVGhlcmUgYXJlIGFsc28gc29tZQordGVzdHMgdGhhdCB0cnkgdG8gZXhoYXVzdCB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcHJvY2Vzcywgd2hpY2ggb25seSBtYWtlcworc2Vuc2Ugb24gMzItYml0IHN5c3RlbXMgd2l0aCBhdCBsZWFzdCAyR2Igb2YgbWVtb3J5LiBUaGUgcGFzc2VkLWluIG1lbWxpbWl0LAogd2hpY2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvcm0gb2YgJzIuNUdiJywgZGV0ZXJtaW5lcyBob3dtdWNoIG1lbW9yeSB0aGUKIHRlc3RzIHdpbGwgbGltaXQgdGhlbXNlbHZlcyB0byAoYnV0IHRoZXkgbWF5IGdvIHNsaWdodGx5IG92ZXIuKSBUaGUgbnVtYmVyCiBzaG91bGRuJ3QgYmUgbW9yZSBtZW1vcnkgdGhhbiB0aGUgbWFjaGluZSBoYXMgKGluY2x1ZGluZyBzd2FwIG1lbW9yeSkuIFlvdQpAQCAtNDk2LDE0ICs0OTgsMzAgQEAKIAogZGVmIHJ1bnRlc3QodGVzdCwgZ2VuZXJhdGUsIHZlcmJvc2UsIHF1aWV0LCB0ZXN0ZGlyPU5vbmUsIGh1bnRybGVha3M9RmFsc2UpOgogICAgICIiIlJ1biBhIHNpbmdsZSB0ZXN0LgorCiAgICAgdGVzdCAtLSB0aGUgbmFtZSBvZiB0aGUgdGVzdAogICAgIGdlbmVyYXRlIC0tIGlmIHRydWUsIGdlbmVyYXRlIG91dHB1dCwgaW5zdGVhZCBvZiBydW5uaW5nIHRoZSB0ZXN0Ci0gICAgYW5kIGNvbXBhcmluZyBpdCB0byBhIHByZXZpb3VzbHkgY3JlYXRlZCBvdXRwdXQgZmlsZQorICAgICAgICAgICAgICAgIGFuZCBjb21wYXJpbmcgaXQgdG8gYSBwcmV2aW91c2x5IGNyZWF0ZWQgb3V0cHV0IGZpbGUKICAgICB2ZXJib3NlIC0tIGlmIHRydWUsIHByaW50IG1vcmUgbWVzc2FnZXMKICAgICBxdWlldCAtLSBpZiB0cnVlLCBkb24ndCBwcmludCAnc2tpcHBlZCcgbWVzc2FnZXMgKHByb2JhYmx5IHJlZHVuZGFudCkKICAgICB0ZXN0ZGlyIC0tIHRlc3QgZGlyZWN0b3J5CisgICAgaHVudHJsZWFrcyAtLSBydW4gbXVsdGlwbGUgdGltZXMgdG8gdGVzdCBmb3IgbGVha3M7IHJlcXVpcmVzIGEgZGVidWcKKyAgICAgICAgICAgICAgICAgIGJ1aWxkOyBhIHRyaXBsZSBjb3JyZXNwb25kaW5nIHRvIC1SJ3MgdGhyZWUgYXJndW1lbnRzCisgICAgUmV0dXJuOgorICAgICAgICAtMiAgdGVzdCBza2lwcGVkIGJlY2F1c2UgcmVzb3VyY2UgZGVuaWVkCisgICAgICAgIC0xICB0ZXN0IHNraXBwZWQgZm9yIHNvbWUgb3RoZXIgcmVhc29uCisgICAgICAgICAwICB0ZXN0IGZhaWxlZAorICAgICAgICAgMSAgdGVzdCBwYXNzZWQKICAgICAiIiIKIAorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIHJ1bnRlc3RfaW5uZXIodGVzdCwgZ2VuZXJhdGUsIHZlcmJvc2UsIHF1aWV0LCB0ZXN0ZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodW50cmxlYWtzKQorICAgIGZpbmFsbHk6CisgICAgICAgIGNsZWFudXBfdGVzdF9kcm9wcGluZ3ModGVzdCwgdmVyYm9zZSkKKworZGVmIHJ1bnRlc3RfaW5uZXIodGVzdCwgZ2VuZXJhdGUsIHZlcmJvc2UsIHF1aWV0LAorICAgICAgICAgICAgICAgICAgICAgdGVzdGRpcj1Ob25lLCBodW50cmxlYWtzPUZhbHNlKToKICAgICB0ZXN0X3N1cHBvcnQudW5sb2FkKHRlc3QpCiAgICAgaWYgbm90IHRlc3RkaXI6CiAgICAgICAgIHRlc3RkaXIgPSBmaW5kdGVzdGRpcigpCkBAIC01OTUsNiArNjEzLDM3IEBACiAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogICAgICAgICByZXR1cm4gMAogCitkZWYgY2xlYW51cF90ZXN0X2Ryb3BwaW5ncyh0ZXN0bmFtZSwgdmVyYm9zZSk6CisgICAgaW1wb3J0IHNodXRpbAorCisgICAgIyBUcnkgdG8gY2xlYW4gdXAganVuayBjb21tb25seSBsZWZ0IGJlaGluZC4gIFdoaWxlIHRlc3RzIHNob3VsZG4ndCBsZWF2ZQorICAgICMgYW55IGZpbGVzIG9yIGRpcmVjdG9yaWVzIGJlaGluZCwgd2hlbiBhIHRlc3QgZmFpbHMgdGhhdCBjYW4gYmUgdGVkaW91cworICAgICMgZm9yIGl0IHRvIGFycmFuZ2UuICBUaGUgY29uc2VxdWVuY2VzIGNhbiBiZSBlc3BlY2lhbGx5IG5hc3R5IG9uIFdpbmRvd3MsCisgICAgIyBzaW5jZSBpZiBhIHRlc3QgbGVhdmVzIGEgZmlsZSBvcGVuLCBpdCBjYW5ub3QgYmUgZGVsZXRlZCBieSBuYW1lICh3aGlsZQorICAgICMgdGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGF0IGhlcmUgZWl0aGVyLCB3ZSBjYW4gZGlzcGxheSB0aGUKKyAgICAjIG5hbWUgb2YgdGhlIG9mZmVuZGluZyB0ZXN0LCB3aGljaCBpcyBhIHJlYWwgaGVscCkuCisgICAgZm9yIG5hbWUgaW4gKHRlc3Rfc3VwcG9ydC5URVNURk4sCisgICAgICAgICAgICAgICAgICJkYl9ob21lIiwKKyAgICAgICAgICAgICAgICApOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMobmFtZSk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIobmFtZSk6CisgICAgICAgICAgICBraW5kLCBudWtlciA9ICJkaXJlY3RvcnkiLCBzaHV0aWwucm10cmVlCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUobmFtZSk6CisgICAgICAgICAgICBraW5kLCBudWtlciA9ICJmaWxlIiwgb3MudW5saW5rCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBTeXN0ZW1FcnJvcigib3MucGF0aCBzYXlzICVyIGV4aXN0cyBidXQgaXMgbmVpdGhlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGlyZWN0b3J5IG5vciBmaWxlIiAlIG5hbWUpCisKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICIlciBsZWZ0IGJlaGluZCAlcyAlciIgJSAodGVzdG5hbWUsIGtpbmQsIG5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG51a2VyKG5hbWUpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sIG1zZzoKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICgiJXIgbGVmdCBiZWhpbmQgJXMgJXIgYW5kIGl0IGNvdWxkbid0IGJlICIKKyAgICAgICAgICAgICAgICAicmVtb3ZlZDogJXMiICUgKHRlc3RuYW1lLCBraW5kLCBuYW1lLCBtc2cpKQorCiBkZWYgZGFzaF9SKHRoZV9tb2R1bGUsIHRlc3QsIGluZGlyZWN0X3Rlc3QsIGh1bnRybGVha3MpOgogICAgICMgVGhpcyBjb2RlIGlzIGhhY2tpc2ggYW5kIGluZWxlZ2FudCwgYnV0IGl0IHNlZW1zIHRvIGRvIHRoZSBqb2IuCiAgICAgaW1wb3J0IGNvcHlfcmVnCkBAIC02MzcsNyArNjg2LDcgQEAKIAogZGVmIGRhc2hfUl9jbGVhbnVwKGZzLCBwcywgcGljKToKICAgICBpbXBvcnQgZ2MsIGNvcHlfcmVnCi0gICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlLCB3YXJuaW5ncywgZGlyY2FjaGUKKyAgICBpbXBvcnQgX3N0cnB0aW1lLCBsaW5lY2FjaGUsIGRpcmNhY2hlCiAgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIsIHVybGxpYjIsIG1pbWV0eXBlcywgZG9jdGVzdAogICAgIGltcG9ydCBzdHJ1Y3QsIGZpbGVjbXAKICAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZApAQCAtMTIyNyw2ICsxMjc2LDM3IEBACiAgICAgICAgIHRlc3Rfd2lucmVnCiAgICAgICAgIHRlc3Rfd2luc291bmQKICAgICAgICAgIiIiLAorICAgICduZXRic2QzJzoKKyAgICAgICAgIiIiCisgICAgICAgIHRlc3RfYWVwYWNrCisgICAgICAgIHRlc3RfYWwKKyAgICAgICAgdGVzdF9hcHBsZXNpbmdsZQorICAgICAgICB0ZXN0X2JzZGRiCisgICAgICAgIHRlc3RfYnNkZGIxODUKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jZAorICAgICAgICB0ZXN0X2NsCisgICAgICAgIHRlc3RfY3R5cGVzCisgICAgICAgIHRlc3RfY3Vyc2VzCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZ2wKKyAgICAgICAgdGVzdF9pbWdmaWxlCisgICAgICAgIHRlc3RfbGludXhhdWRpb2RldgorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X21hY2ZzCisgICAgICAgIHRlc3RfbWFjb3N0b29scworICAgICAgICB0ZXN0X25pcworICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CisgICAgICAgIHRlc3RfcGVwMjc3CisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCisgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKKyAgICAgICAgdGVzdF90Y2wKKyAgICAgICAgdGVzdF91bmljb2RlX2ZpbGUKKyAgICAgICAgdGVzdF93aW5yZWcKKyAgICAgICAgdGVzdF93aW5zb3VuZAorICAgICAgICAiIiIsCiB9CiBfZXhwZWN0YXRpb25zWydmcmVlYnNkNSddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQogX2V4cGVjdGF0aW9uc1snZnJlZWJzZDYnXSA9IF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q0J10KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weSBiL0xpYi90ZXN0L3N0cmluZ190ZXN0cy5weQppbmRleCBhYWEyZGMyLi43MzQ0N2FkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9zdHJpbmdfdGVzdHMucHkKKysrIGIvTGliL3Rlc3Qvc3RyaW5nX3Rlc3RzLnB5CkBAIC0xNDcsOCArMTQ3LDggQEAKICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICByMiwgcmVtID0gbGVuKGkpKzEsIDAKICAgICAgICAgICAgICAgICBpZiByZW0gb3IgcjEgIT0gcjI6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVtLCAwKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIxLCByMikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZW0sIDAsICclcyAhPSAwIGZvciAlcycgJSAocmVtLCBpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSwgcjIsICclcyAhPSAlcyBmb3IgJXMnICUgKHIxLCByMiwgaSkpCiAKICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoMCwgJ2FiY2RlZmdoaWFiYycsICdmaW5kJywgJ2FiYycpCkBAIC02MzYsNiArNjM2LDExIEBACiAgICAgICAgIEVRKCJib2JvYlhib2JvYiIsICJib2JvYm9iWGJvYm9ib2IiLCAicmVwbGFjZSIsICJib2JvYiIsICJib2IiKQogICAgICAgICBFUSgiQk9CT0JPQiIsICJCT0JPQk9CIiwgInJlcGxhY2UiLCAiYm9iIiwgImJvYmJ5IikKIAorICAgICAgICBiYSA9IGJ1ZmZlcignYScpCisgICAgICAgIGJiID0gYnVmZmVyKCdiJykKKyAgICAgICAgRVEoImJiYyIsICJhYmMiLCAicmVwbGFjZSIsIGJhLCBiYikKKyAgICAgICAgRVEoImFhYyIsICJhYmMiLCAicmVwbGFjZSIsIGJiLCBiYSkKKwogICAgICAgICAjCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnb25lQHR3byF0aHJlZSEnLCAnb25lIXR3byF0aHJlZSEnLCAncmVwbGFjZScsICchJywgJ0AnLCAxKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ29uZXR3b3RocmVlJywgJ29uZSF0d28hdGhyZWUhJywgJ3JlcGxhY2UnLCAnIScsICcnKQpAQCAtODE5LDYgKzgyNCwyMSBAQAogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnKQogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCA0MikKIAorICAgICAgICAjIHRlc3QgdHVwbGUgYXJndW1lbnRzCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGUnLCAnaGEnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnbG8nLCAnbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnc3RhcnRzd2l0aCcsICgnaGVsbG94JywgJ2hlbGxvJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ3N0YXJ0c3dpdGgnLCAoJ2hlbGxvd28nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmxkJywgJ2xvd28nKSwgMykKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG93b3JsZCcsICdzdGFydHN3aXRoJywgKCdoZWxsb3dvJywgJ2VsbG8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcpLCAzKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoJ2xvJywgJ2hlJyksIDAsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoRmFsc2UsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsbycsICdzdGFydHN3aXRoJywgKCdoZScsICdoZWwnKSwgMCwgMikKKworICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ3N0YXJ0c3dpdGgnLCAoNDIsKSkKKwogICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgJ2xvJykKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAnaGUnKQpAQCAtODUzLDYgKzg3MywyMSBAQAogICAgICAgICBzZWxmLmNoZWNrcmFpc2VzKFR5cGVFcnJvciwgJ2hlbGxvJywgJ2VuZHN3aXRoJykKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcsIDQyKQogCisgICAgICAgICMgdGVzdCB0dXBsZSBhcmd1bWVudHMKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2hlJywgJ2hhJykpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChUcnVlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2xvJywgJ2xsbycpKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZWxsb3gnLCAnaGVsbG8nKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKFRydWUsICdoZWxsb3dvcmxkJywgJ2VuZHN3aXRoJywgKCdoZWxsb3dvJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JsZCcsICdsb3dvJyksIDMpCisgICAgICAgIHNlbGYuY2hlY2tlcXVhbChGYWxzZSwgJ2hlbGxvd29ybGQnLCAnZW5kc3dpdGgnLCAoJ2hlbGxvd28nLCAnZWxsbycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmxkJyksIDMsIC0xKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZWxsJywgJ2VsbCcpLCAwLCAtMSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKEZhbHNlLCAnaGVsbG8nLCAnZW5kc3dpdGgnLCAoJ2hlJywgJ2hlbCcpLCAwLCAxKQorICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2hlbGxvJywgJ2VuZHN3aXRoJywgKCdoZScsICdoZWxsJyksIDAsIDQpCisKKyAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdoZWxsbycsICdlbmRzd2l0aCcsICg0MiwpKQorCiAgICAgZGVmIHRlc3RfX19jb250YWluc19fKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJycsICdfX2NvbnRhaW5zX18nLCAnJykgICAgICAgICAjIHZlcmVxKCcnIGluICcnLCBUcnVlKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoVHJ1ZSwgJ2FiYycsICdfX2NvbnRhaW5zX18nLCAnJykgICAgICAjIHZlcmVxKCcnIGluICdhYmMnLCBUcnVlKQpAQCAtODcyLDcgKzkwNyw3IEBACiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCh1J2FiYycsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAxMDAwKSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnYScsICdhYmMnLCAnX19nZXRpdGVtX18nLCBzbGljZSgwLCAxKSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKHUnJywgJ2FiYycsICdfX2dldGl0ZW1fXycsIHNsaWNlKDAsIDApKQotICAgICAgICAjIEZJWE1FIFdoYXQgYWJvdXQgbmVnYXRpdmUgaW5kaXplcz8gVGhpcyBpcyBoYW5kbGVkIGRpZmZlcmVudGx5IGJ5IFtdIGFuZCBfX2dldGl0ZW1fXyhzbGljZSkKKyAgICAgICAgIyBGSVhNRSBXaGF0IGFib3V0IG5lZ2F0aXZlIGluZGljZXM/IFRoaXMgaXMgaGFuZGxlZCBkaWZmZXJlbnRseSBieSBbXSBhbmQgX19nZXRpdGVtX18oc2xpY2UpCiAKICAgICAgICAgc2VsZi5jaGVja3JhaXNlcyhUeXBlRXJyb3IsICdhYmMnLCAnX19nZXRpdGVtX18nLCAnZGVmJykKIApAQCAtOTA4LDYgKzk0Myw4IEBACiAgICAgICAgICMgdGVzdC50ZXN0X3N0cmluZy5TdHJpbmdUZXN0LnRlc3Rfam9pbikKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhIGIgYyBkJywgJyAnLCAnam9pbicsIFsnYScsICdiJywgJ2MnLCAnZCddKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ2FiY2QnLCAnJywgJ2pvaW4nLCAoJ2EnLCAnYicsICdjJywgJ2QnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdiZCcsICcnLCAnam9pbicsICgnJywgJ2InLCAnJywgJ2QnKSkKKyAgICAgICAgc2VsZi5jaGVja2VxdWFsKCdhYycsICcnLCAnam9pbicsICgnYScsICcnLCAnYycsICcnKSkKICAgICAgICAgc2VsZi5jaGVja2VxdWFsKCd3IHggeSB6JywgJyAnLCAnam9pbicsIFNlcXVlbmNlKCkpCiAgICAgICAgIHNlbGYuY2hlY2tlcXVhbCgnYWJjJywgJ2EnLCAnam9pbicsICgnYWJjJywpKQogICAgICAgICBzZWxmLmNoZWNrZXF1YWwoJ3onLCAnYScsICdqb2luJywgVXNlckxpc3QoWyd6J10pKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9fbG9jYWxlLnB5CmluZGV4IDk3OTlmODkuLmVjNTlkNzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX2xvY2FsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X19sb2NhbGUucHkKQEAgLTExMyw2ICsxMTMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmcgZXZhbCgnMy4xNCcpIGZhaWxlZCBmb3IgJXMiICUgbG9jKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW50KGZsb2F0KCczLjE0JykgKiAxMDApLCAzMTQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZyBmbG9hdCgnMy4xNCcpIGZhaWxlZCBmb3IgJXMiICUgbG9jKQorICAgICAgICAgICAgaWYgbG9jYWxlY29udigpWydkZWNpbWFsX3BvaW50J10gIT0gJy4nOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddLmpvaW4oWycxJywgJzIzJ10pKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KF9Mb2NhbGVUZXN0cykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggYzY0YWQyOC4uMTRmYzAxMCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTE2MCw3ICsxNjAsNyBAQAogKCdNb2R1bGUnLCBbKCdGdW5jdGlvbkRlZicsICgxLCAwKSwgJ2YnLCAoJ2FyZ3VtZW50cycsIFtdLCBOb25lLCBOb25lLCBbXSksIFsoJ1JldHVybicsICgxLCA4KSwgKCdOdW0nLCAoMSwgMTUpLCAxKSldLCBbXSldKSwKICgnTW9kdWxlJywgWygnRGVsZXRlJywgKDEsIDApLCBbKCdOYW1lJywgKDEsIDQpLCAndicsICgnRGVsJywpKV0pXSksCiAoJ01vZHVsZScsIFsoJ0Fzc2lnbicsICgxLCAwKSwgWygnTmFtZScsICgxLCAwKSwgJ3YnLCAoJ1N0b3JlJywpKV0sICgnTnVtJywgKDEsIDQpLCAxKSldKSwKLSgnTW9kdWxlJywgWygnQXVnQXNzaWduJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICd2JywgKCdMb2FkJywpKSwgKCdBZGQnLCksICgnTnVtJywgKDEsIDUpLCAxKSldKSwKKygnTW9kdWxlJywgWygnQXVnQXNzaWduJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgMCksICd2JywgKCdTdG9yZScsKSksICgnQWRkJywpLCAoJ051bScsICgxLCA1KSwgMSkpXSksCiAoJ01vZHVsZScsIFsoJ1ByaW50JywgKDEsIDApLCAoJ05hbWUnLCAoMSwgOCksICdmJywgKCdMb2FkJywpKSwgWygnTnVtJywgKDEsIDExKSwgMSldLCBGYWxzZSldKSwKICgnTW9kdWxlJywgWygnRm9yJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNCksICd2JywgKCdTdG9yZScsKSksICgnTmFtZScsICgxLCA5KSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDExKSldLCBbXSldKSwKICgnTW9kdWxlJywgWygnV2hpbGUnLCAoMSwgMCksICgnTmFtZScsICgxLCA2KSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDgpKV0sIFtdKV0pLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weSBiL0xpYi90ZXN0L3Rlc3RfYXN5bmNoYXQucHkKaW5kZXggZjkzNTg3YS4uOTkyNjE2NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3luY2hhdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzeW5jaGF0LnB5CkBAIC0xMyw3ICsxMyw4IEBACiAgICAgZGVmIHJ1bihzZWxmKToKICAgICAgICAgc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc29jay5zZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSLCAxKQotICAgICAgICBzb2NrLmJpbmQoKEhPU1QsIFBPUlQpKQorICAgICAgICBnbG9iYWwgUE9SVAorICAgICAgICBQT1JUID0gdGVzdF9zdXBwb3J0LmJpbmRfcG9ydChzb2NrLCBIT1NULCBQT1JUKQogICAgICAgICBzb2NrLmxpc3RlbigxKQogICAgICAgICBjb25uLCBjbGllbnQgPSBzb2NrLmFjY2VwdCgpCiAgICAgICAgIGJ1ZmZlciA9ICIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnYWRkcnNwYWNlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjE1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2JpZ2FkZHJzcGFjZS5weQpAQCAtMCwwICsxLDQ2IEBACitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgYmlnYWRkcnNwYWNldGVzdCwgTUFYX1B5X3NzaXplX3QKKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgb3BlcmF0b3IKK2ltcG9ydCBzeXMKKworCitjbGFzcyBTdHJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIEBiaWdhZGRyc3BhY2V0ZXN0CisgICAgZGVmIHRlc3RfY29uY2F0KHNlbGYpOgorICAgICAgICBzMSA9ICd4JyAqIE1BWF9QeV9zc2l6ZV90CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIG9wZXJhdG9yLmFkZCwgczEsICc/JykKKworICAgIEBiaWdhZGRyc3BhY2V0ZXN0CisgICAgZGVmIHRlc3Rfb3B0aW1pemVkX2NvbmNhdChzZWxmKToKKyAgICAgICAgeCA9ICd4JyAqIE1BWF9QeV9zc2l6ZV90CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHggPSB4ICsgJz8nICAgICAjIHRoaXMgc3RhdGVtZW50IHVzZXMgYSBmYXN0IHBhdGggaW4gY2V2YWwuYworICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIE92ZXJmbG93RXJyb3IiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB4ICs9ICc/JyAgICAgICAgIyB0aGlzIHN0YXRlbWVudCB1c2VzIGEgZmFzdCBwYXRoIGluIGNldmFsLmMKKyAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBPdmVyZmxvd0Vycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHgpLCBNQVhfUHlfc3NpemVfdCkKKworICAgICMjIyB0aGUgZm9sbG93aW5nIHRlc3QgaXMgcGVuZGluZyBhIHBhdGNoCisgICAgIyAgIChodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDYtSnVseS8wNjc3NzQuaHRtbCkKKyAgICAjQGJpZ2FkZHJzcGFjZXRlc3QKKyAgICAjZGVmIHRlc3RfcmVwZWF0KHNlbGYpOgorICAgICMgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgb3BlcmF0b3IubXVsLCAneCcsIE1BWF9QeV9zc2l6ZV90ICsgMSkKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJUZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGlmIGxlbihzeXMuYXJndikgPiAxOgorICAgICAgICB0ZXN0X3N1cHBvcnQuc2V0X21lbWxpbWl0KHN5cy5hcmd2WzFdKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDI1NTQyOGYuLjZkNmMzN2MgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0yOCw3ICsyOCw3IEBACiAjICAtIFdoaWxlIHRoZSBiaWdtZW10ZXN0IGRlY29yYXRvciBzcGVha3Mgb2YgJ21pbnNpemUnLCBhbGwgdGVzdHMgd2lsbAogIyAgICBhY3R1YWxseSBiZSBjYWxsZWQgd2l0aCBhIG11Y2ggc21hbGxlciBudW1iZXIgdG9vLCBpbiB0aGUgbm9ybWFsCiAjICAgIHRlc3QgcnVuICg1S2IgY3VycmVudGx5LikgVGhpcyBpcyBzbyB0aGUgdGVzdHMgdGhlbXNlbHZlcyBnZXQgZnJlcXVlbnQKLSMgICAgdGVzdGluZyBDb25zZXF1ZW50bHksIGFsd2F5cyBtYWtlIGFsbCBsYXJnZSBhbGxvY2F0aW9ucyBiYXNlZCBvbiB0aGUKKyMgICAgdGVzdGluZy4gQ29uc2VxdWVudGx5LCBhbHdheXMgbWFrZSBhbGwgbGFyZ2UgYWxsb2NhdGlvbnMgYmFzZWQgb24gdGhlCiAjICAgIHBhc3NlZC1pbiAnc2l6ZScsIGFuZCBkb24ndCByZWx5IG9uIHRoZSBzaXplIGJlaW5nIHZlcnkgbGFyZ2UuIEFsc28sCiAjICAgIG1lbXVzZS1wZXItc2l6ZSBzaG91bGQgcmVtYWluIHNhbmUgKGxlc3MgdGhhbiBhIGZldyB0aG91c2FuZCk7IGlmIHlvdXIKICMgICAgdGVzdCB1c2VzIG1vcmUsIGFkanVzdCAnc2l6ZScgdXB3YXJkLCBpbnN0ZWFkLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weSBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKaW5kZXggNTEzZTU0MS4uNDc0ZjNkYSAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CkBAIC04LDcgKzgsNiBAQAogaW1wb3J0IGRiaGFzaCAjIEp1c3Qgc28gd2Uga25vdyBpdCdzIGltcG9ydGVkCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1mcm9tIHNldHMgaW1wb3J0IFNldAogCiBjbGFzcyBUZXN0QlNEREIodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIG9wZW5mbGFnID0gJ2MnCkBAIC01Myw3ICs1Miw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZltrXSwgdikKIAogICAgIGRlZiBhc3NlcnRTZXRFcXVhbHMoc2VsZiwgc2VxbjEsIHNlcW4yKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTZXQoc2VxbjEpLCBTZXQoc2VxbjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNldChzZXFuMSksIHNldChzZXFuMikpCiAKICAgICBkZWYgdGVzdF9tYXBwaW5nX2l0ZXJhdGlvbl9tZXRob2RzKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5mCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggZTZlNDQ0MC4uYzdlNDM5NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtNTMyLDEzICs1MzIsMjQgQEAKICAgICBAcnVuX3dpdGhfbG9jYWxlKCdMQ19OVU1FUklDJywgJ2ZyX0ZSJywgJ2RlX0RFJykKICAgICBkZWYgdGVzdF9mbG9hdF93aXRoX2NvbW1hKHNlbGYpOgogICAgICAgICAjIHNldCBsb2NhbGUgdG8gc29tZXRoaW5nIHRoYXQgZG9lc24ndCB1c2UgJy4nIGZvciB0aGUgZGVjaW1hbCBwb2ludAorICAgICAgICAjIGZsb2F0IG11c3Qgbm90IGFjY2VwdCB0aGUgbG9jYWxlIHNwZWNpZmljIGRlY2ltYWwgcG9pbnQgYnV0CisgICAgICAgICMgaXQgc3RpbGwgaGFzIHRvIGFjY2VwdCB0aGUgbm9ybWFsIHB5dGhvbiBzeW50YWMKICAgICAgICAgaW1wb3J0IGxvY2FsZQogICAgICAgICBpZiBub3QgbG9jYWxlLmxvY2FsZWNvbnYoKVsnZGVjaW1hbF9wb2ludCddID09ICcsJzoKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMywxNCAgIiksIDMuMTQpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgKzMsMTQgICIpLCAzLjE0KQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIC0zLDE0ICAiKSwgLTMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiAgMy4xNCAgIiksIDMuMTQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIiszLjE0ICAiKSwgMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiLTMuMTQgICIpLCAtMy4xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiLjE0ICAiKSwgLjE0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIzLiAgIiksIDMuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy5lMyAgIiksIDMwMDAuMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdCgiMy4yZTMgICIpLCAzMjAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjIuNWUtMSAgIiksIDAuMjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmxvYXQoIjVlLTEiKSwgMC41KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgMywxNCAgIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgICszLDE0ICAiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBmbG9hdCwgIiAgLTMsMTQgICIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGZsb2F0LCAiICAweDMuMSAgIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQsICIgIC0weDMucC0xICAiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZsb2F0KCIgIDI1LmUtMSAgIiksIDIuNSkKQEAgLTYwMyw2ICs2MTQsMTkgQEAKICAgICAgICAgZGVmIGYoKTogcGFzcwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIFtdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIHt9KQorICAgICAgICAjIEJ1ZyAxNTM2MDIxOiBBbGxvdyBoYXNoIHRvIHJldHVybiBsb25nIG9iamVjdHMKKyAgICAgICAgY2xhc3MgWDoKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMioqMTAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHR5cGUoaGFzaChYKCkpKSwgaW50KQorICAgICAgICBjbGFzcyBZKG9iamVjdCk6CisgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIDIqKjEwMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0eXBlKGhhc2goWSgpKSksIGludCkKKyAgICAgICAgY2xhc3MgWihsb25nKToKKyAgICAgICAgICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoYXNoKFooNDIpKSwgaGFzaCg0MkwpKQogCiAgICAgZGVmIHRlc3RfaGV4KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhleCgxNiksICcweDEwJykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnoyLnB5IGIvTGliL3Rlc3QvdGVzdF9iejIucHkKaW5kZXggMzU2YzJlMy4uZjE5ODExNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iejIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iejIucHkKQEAgLTI1MCw3ICsyNTAsNyBAQAogICAgICAgICBiejJmID0gQloyRmlsZShzZWxmLmZpbGVuYW1lKQogICAgICAgICB4bGluZXMgPSBsaXN0KGJ6MmYucmVhZGxpbmVzKCkpCiAgICAgICAgIGJ6MmYuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmVzLCBbJ1Rlc3QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4bGluZXMsIFsnVGVzdCddKQogCiAKIGNsYXNzIEJaMkNvbXByZXNzb3JUZXN0KEJhc2VUZXN0KToKQEAgLTM0NCw2ICszNDQsNyBAQAogICAgICAgICBCWjJEZWNvbXByZXNzb3JUZXN0LAogICAgICAgICBGdW5jVGVzdAogICAgICkKKyAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IGVjODYwZDEuLjVlODk4NjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtODcsNiArODcsNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENtZExpbmVUZXN0KQorICAgIHRlc3QudGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGUucHkKaW5kZXggNTJiYzg5NC4uNGU2ODYzOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29kZS5weQpAQCAtNjEsNiArNjEsMjMgQEAKIGZsYWdzOiA2NwogY29uc3RzOiAoJ05vbmUnLCkKIAorPj4+IGRlZiBvcHRpbWl6ZV9hd2F5KCk6CisuLi4gICAgICdkb2Mgc3RyaW5nJworLi4uICAgICAnbm90IGEgZG9jc3RyaW5nJworLi4uICAgICA1MworLi4uICAgICA1M0wKKworPj4+IGR1bXAob3B0aW1pemVfYXdheS5mdW5jX2NvZGUpCituYW1lOiBvcHRpbWl6ZV9hd2F5Cithcmdjb3VudDogMAorbmFtZXM6ICgpCit2YXJuYW1lczogKCkKK2NlbGx2YXJzOiAoKQorZnJlZXZhcnM6ICgpCitubG9jYWxzOiAwCitmbGFnczogNjcKK2NvbnN0czogKCInZG9jIHN0cmluZyciLCAnTm9uZScpCisKICIiIgogCiBkZWYgY29uc3RzKHQpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQppbmRleCA2ZWE0OWNjLi44MTUzOTc5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQpAQCAtMTE2Niw2ICsxMTY2LDEyIEBACiAgICAgICAgICAgICBlbmNvZGVyID0gY29kZWNzLmdldGVuY29kZXIoZW5jb2RpbmcpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGVuY29kZXIpCiAKKyAgICBkZWYgdGVzdF9lbmNvZGluZ19tYXBfdHlwZV9pbml0aWFsaXplZChzZWxmKToKKyAgICAgICAgZnJvbSBlbmNvZGluZ3MgaW1wb3J0IGNwMTE0MAorICAgICAgICAjIFRoaXMgdXNlZCB0byBjcmFzaCwgd2UgYXJlIG9ubHkgdmVyaWZ5aW5nIHRoZXJlJ3Mgbm8gY3Jhc2guCisgICAgICAgIHRhYmxlX3R5cGUgPSB0eXBlKGNwMTE0MC5lbmNvZGluZ190YWJsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0YWJsZV90eXBlLCB0YWJsZV90eXBlKQorCiBjbGFzcyBCYXNpY1N0clRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2Jhc2ljcyhzZWxmKToKICAgICAgICAgcyA9ICJhYmMxMjMiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQppbmRleCAwZjdkMTVmLi5iNzJhMWI5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKQEAgLTUsNyArNSw3IEBACiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCBvcywgdGVtcGZpbGUsIHJlCiAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIGZyb20gY29tbWFuZHMgaW1wb3J0ICoKIAogIyBUaGUgbW9kdWxlIHNheXM6CkBAIC01OCw2ICs1OCw3IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoQ29tbWFuZFRlc3RzKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggNzJjNGY3ZS4uYTNmMTViZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtMTY2LDYgKzE2NiwxNiBAQAogICAgICAgICBwYXNzIiIiCiAgICAgICAgIGNvbXBpbGUocywgIjxzdHJpbmc+IiwgImV4ZWMiKQogCisgICAgIyBUaGlzIHRlc3QgaXMgcHJvYmFibHkgc3BlY2lmaWMgdG8gQ1B5dGhvbiBhbmQgbWF5IG5vdCBnZW5lcmFsaXplCisgICAgIyB0byBvdGhlciBpbXBsZW1lbnRhdGlvbnMuICBXZSBhcmUgdHJ5aW5nIHRvIGVuc3VyZSB0aGF0IHdoZW4KKyAgICAjIHRoZSBmaXJzdCBsaW5lIG9mIGNvZGUgc3RhcnRzIGFmdGVyIDI1NiwgY29ycmVjdCBsaW5lIG51bWJlcnMKKyAgICAjIGluIHRyYWNlYmFja3MgYXJlIHN0aWxsIHByb2R1Y2VkLgorICAgIGRlZiB0ZXN0X2xlYWRpbmdfbmV3bGluZXMoc2VsZik6CisgICAgICAgIHMyNTYgPSAiIi5qb2luKFsiXG4iXSAqIDI1NiArIFsic3BhbSJdKQorICAgICAgICBjbyA9IGNvbXBpbGUoczI1NiwgJ2ZuJywgJ2V4ZWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvLmNvX2ZpcnN0bGluZW5vLCAyNTcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28uY29fbG5vdGFiLCAnJykKKwogICAgIGRlZiB0ZXN0X2xpdGVyYWxzX3dpdGhfbGVhZGluZ196ZXJvZXMoc2VsZik6CiAgICAgICAgIGZvciBhcmcgaW4gWyIwNzc3ODciLCAiMHhqIiwgIjB4LiIsICIwZSIsICAiMDkwMDAwMDAwMDAwMDAwIiwKICAgICAgICAgICAgICAgICAgICAgIjA4MDAwMDAwMDAwMDAwMCIsICIwMDAwMDAwMDAwMDAwMDkiLCAiMDAwMDAwMDAwMDAwMDA4Il06CkBAIC0yMTEsNiArMjIxLDI1IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoIi0iICsgYWxsX29uZV9iaXRzKSwgLTE4NDQ2NzQ0MDczNzA5NTUxNjE1TCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiSG93IG1hbnkgYml0cyAqZG9lcyogdGhpcyBtYWNoaW5lIGhhdmU/Pz8iKQorICAgICAgICAjIFZlcmlmeSB0cmVhdG1lbnQgb2YgY29udGFudCBmb2xkaW5nIG9uIC0oc3lzLm1heGludCsxKQorICAgICAgICAjIGkuZS4gLTIxNDc0ODM2NDggb24gMzIgYml0IHBsYXRmb3Jtcy4gIFNob3VsZCByZXR1cm4gaW50LCBub3QgbG9uZy4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXZhbCgiJXMiICUgKC1zeXMubWF4aW50IC0gMSkpLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShldmFsKCIlcyIgJSAoLXN5cy5tYXhpbnQgLSAyKSksIGxvbmcpKQorCisgICAgaWYgc3lzLm1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgorICAgICAgICBkZWYgdGVzdF8zMl82M19iaXRfdmFsdWVzKHNlbGYpOgorICAgICAgICAgICAgYSA9ICs0Mjk0OTY3Mjk2ICAjIDEgPDwgMzIKKyAgICAgICAgICAgIGIgPSAtNDI5NDk2NzI5NiAgIyAxIDw8IDMyCisgICAgICAgICAgICBjID0gKzI4MTQ3NDk3NjcxMDY1NiAgIyAxIDw8IDQ4CisgICAgICAgICAgICBkID0gLTI4MTQ3NDk3NjcxMDY1NiAgIyAxIDw8IDQ4CisgICAgICAgICAgICBlID0gKzQ2MTE2ODYwMTg0MjczODc5MDQgICMgMSA8PCA2MgorICAgICAgICAgICAgZiA9IC00NjExNjg2MDE4NDI3Mzg3OTA0ICAjIDEgPDwgNjIKKyAgICAgICAgICAgIGcgPSArOTIyMzM3MjAzNjg1NDc3NTgwNyAgIyAxIDw8IDYzIC0gMQorICAgICAgICAgICAgaCA9IC05MjIzMzcyMDM2ODU0Nzc1ODA3ICAjIDEgPDwgNjMgLSAxCisKKyAgICAgICAgICAgIGZvciB2YXJpYWJsZSBpbiBzZWxmLnRlc3RfMzJfNjNfYml0X3ZhbHVlcy5mdW5jX2NvZGUuY29fY29uc3RzOgorICAgICAgICAgICAgICAgIGlmIHZhcmlhYmxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YXJpYWJsZSwgaW50KSkKIAogICAgIGRlZiB0ZXN0X3NlcXVlbmNlX3VucGFja2luZ19lcnJvcihzZWxmKToKICAgICAgICAgIyBWZXJpZnkgc2VxdWVuY2UgcGFja2luZy91bnBhY2tpbmcgd2l0aCAib3IiLiAgU0YgYnVnICM3NTc4MTgKQEAgLTIzOCw2ICsyNjcsOCBAQAogICAgICAgICBzdWNjZWVkID0gWwogICAgICAgICAgICAgJ2ltcG9ydCBzeXMnLAogICAgICAgICAgICAgJ2ltcG9ydCBvcywgc3lzJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MgYXMgYmFyJywKKyAgICAgICAgICAgICdpbXBvcnQgb3MucGF0aCBhcyBiYXInLAogICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcywgZ2VuZXJhdG9ycycsCiAgICAgICAgICAgICAnZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCAobmVzdGVkX3Njb3BlcyxcbmdlbmVyYXRvcnMpJywKICAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IChuZXN0ZWRfc2NvcGVzLFxuZ2VuZXJhdG9ycywpJywKQEAgLTI1Nyw2ICsyODgsMTAgQEAKICAgICAgICAgICAgICdpbXBvcnQgKHN5cycsCiAgICAgICAgICAgICAnaW1wb3J0IHN5cyknLAogICAgICAgICAgICAgJ2ltcG9ydCAob3MsKScsCisgICAgICAgICAgICAnaW1wb3J0IG9zIEFzIGJhcicsCisgICAgICAgICAgICAnaW1wb3J0IG9zLnBhdGggYSBiYXInLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiBBcyBzdGRvdXQnLAorICAgICAgICAgICAgJ2Zyb20gc3lzIGltcG9ydCBzdGRpbiBhIHN0ZG91dCcsCiAgICAgICAgICAgICAnZnJvbSAoc3lzKSBpbXBvcnQgc3RkaW4nLAogICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgKG5lc3RlZF9zY29wZXMnLAogICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgbmVzdGVkX3Njb3BlcyknLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKaW5kZXggNDhmMTY0My4uMWVmYjZhNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CkBAIC01NiwxMyArNTYsMzAgQEAKICAgICBkZWYgdGVzdFlpZWxkRXhwcihzZWxmKToKICAgICAgICAgY29tcGlsZXIuY29tcGlsZSgiZGVmIGcoKTogeWllbGRcblxuIiwgIjxzdHJpbmc+IiwgImV4ZWMiKQogCisgICAgZGVmIHRlc3RUcnlFeGNlcHRGaW5hbGx5KHNlbGYpOgorICAgICAgICAjIFRlc3QgdGhhdCBleGNlcHQgYW5kIGZpbmFsbHkgY2xhdXNlcyBpbiBvbmUgdHJ5IHN0bXQgYXJlIHJlY29nbml6ZWQKKyAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoInRyeTpcbiAxLzBcbmV4Y2VwdDpcbiBlID0gMVxuZmluYWxseTpcbiBmID0gMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3RyaW5nPiIsICJleGVjIikKKyAgICAgICAgZGN0ID0ge30KKyAgICAgICAgZXhlYyBjIGluIGRjdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkY3QuZ2V0KCdlJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRjdC5nZXQoJ2YnKSwgMSkKKwogICAgIGRlZiB0ZXN0RGVmYXVsdEFyZ3Moc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBjb21waWxlci5wYXJzZSwgImRlZiBmb28oYT0xLCBiKTogcGFzcyIpCiAKKyAgICBkZWYgdGVzdERvY3N0cmluZ3Moc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCciZG9jIicsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdfX2RvY19fJyBpbiBjLmNvX25hbWVzKQorICAgICAgICBjID0gY29tcGlsZXIuY29tcGlsZSgnZGVmIGYoKTpcbiAiZG9jIicsICc8c3RyaW5nPicsICdleGVjJykKKyAgICAgICAgZyA9IHt9CisgICAgICAgIGV4ZWMgYyBpbiBnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGdbJ2YnXS5fX2RvY19fLCAiZG9jIikKKwogICAgIGRlZiB0ZXN0TGluZU5vKHNlbGYpOgogICAgICAgICAjIFRlc3QgdGhhdCBhbGwgbm9kZXMgZXhjZXB0IE1vZHVsZSBoYXZlIGEgY29ycmVjdCBsaW5lbm8gYXR0cmlidXRlLgogICAgICAgICBmaWxlbmFtZSA9IF9fZmlsZV9fCi0gICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHljIikgb3IgZmlsZW5hbWUuZW5kc3dpdGgoIi5weW8iKToKKyAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoKCIucHljIiwgIi5weW8iKSk6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzotMV0KICAgICAgICAgdHJlZSA9IGNvbXBpbGVyLnBhcnNlRmlsZShmaWxlbmFtZSkKICAgICAgICAgc2VsZi5jaGVja19saW5lbm8odHJlZSkKQEAgLTg3LDYgKzEwNCwxOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmbGF0dGVuKFsxLCBbMl1dKSwgWzEsIDJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmbGF0dGVuKCgxLCAoMiwpKSksIFsxLCAyXSkKIAorICAgIGRlZiB0ZXN0TmVzdGVkU2NvcGUoc2VsZik6CisgICAgICAgIGMgPSBjb21waWxlci5jb21waWxlKCdkZWYgZygpOlxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICAgIGEgPSAxXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgZGVmIGYoKTogcmV0dXJuIGEgKyAyXG4nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgICAgcmV0dXJuIGYoKVxuJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzdWx0ID0gZygpJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJzxzdHJpbmc+JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2V4ZWMnKQorICAgICAgICBkY3QgPSB7fQorICAgICAgICBleGVjIGMgaW4gZGN0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRjdC5nZXQoJ3Jlc3VsdCcpLCAzKQorCisKIE5PTElORU5PID0gKGNvbXBpbGVyLmFzdC5Nb2R1bGUsIGNvbXBpbGVyLmFzdC5TdG10LCBjb21waWxlci5hc3QuRGlzY2FyZCkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpAQCAtMTAzLDYgKzEzMywxMiBAQAogbCA9IFsoeCwgeSkgZm9yIHgsIHkgaW4gemlwKHJhbmdlKDUpLCByYW5nZSg1LDEwKSldCiBsWzBdCiBsWzM6NF0KK2QgPSB7J2EnOiAyfQorZCA9IHt9Cit0ID0gKCkKK3QgPSAoMSwgMikKK2wgPSBbXQorbCA9IFsxLCAyXQogaWYgbDoKICAgICBwYXNzCiBlbHNlOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jdXJzZXMucHkgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQppbmRleCBkYzJmMjBiLi40MDIyMTQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weQpAQCAtMjEyLDYgKzIxMiwxMyBAQAogICAgICAgICAgICAgbSA9IGN1cnNlcy5nZXRtb3VzZSgpCiAgICAgICAgICAgICBjdXJzZXMudW5nZXRtb3VzZSgqbSkKIAorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAnaXNfdGVybV9yZXNpemVkJyk6CisgICAgICAgIGN1cnNlcy5pc190ZXJtX3Jlc2l6ZWQoKnN0ZHNjci5nZXRtYXh5eCgpKQorICAgIGlmIGhhc2F0dHIoY3Vyc2VzLCAncmVzaXpldGVybScpOgorICAgICAgICBjdXJzZXMucmVzaXpldGVybSgqc3Rkc2NyLmdldG1heHl4KCkpCisgICAgaWYgaGFzYXR0cihjdXJzZXMsICdyZXNpemVfdGVybScpOgorICAgICAgICBjdXJzZXMucmVzaXplX3Rlcm0oKnN0ZHNjci5nZXRtYXh5eCgpKQorCiBkZWYgdW5pdF90ZXN0cygpOgogICAgIGZyb20gY3Vyc2VzIGltcG9ydCBhc2NpaQogICAgIGZvciBjaCwgZXhwZWN0ZWQgaW4gWygnYScsICdhJyksICgnQScsICdBJyksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQppbmRleCBiNWE2NjI4Li4xMzRiNWE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKQEAgLTQsNiArNCw3IEBACiBpbXBvcnQgY29weQogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlZmF1bHRkaWN0CiAKQEAgLTEzMSw1ICsxMzIsOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLCBkMSkKIAogCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0RGVmYXVsdERpY3QpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgdW5pdHRlc3QubWFpbigpCisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CmluZGV4IDhlZTQzMWIuLjRhMzliZTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQpAQCAtMTg5OSw2ICsxODk5LDE2IEBACiAgICAgICAgIHByb3AyID0gcHJvcGVydHkoZnNldD1zZXR0ZXIpCiAgICAgICAgIHZlcmVxKHByb3AyLl9fZG9jX18sIE5vbmUpCiAKKyAgICAjIHRoaXMgc2VnZmF1bHRlZCBpbiAyLjViMgorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IF90ZXN0Y2FwaQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIGNsYXNzIFgob2JqZWN0KToKKyAgICAgICAgICAgIHAgPSBwcm9wZXJ0eShfdGVzdGNhcGkudGVzdF93aXRoX2RvY3N0cmluZykKKworCiBkZWYgc3VwZXJzKCk6CiAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlRlc3Rpbmcgc3VwZXIuLi4iCiAKQEAgLTMwNDYsNiArMzA1NiwyMSBAQAogICAgIGxpc3QuX19pbml0X18oYSwgc2VxdWVuY2U9WzAsIDEsIDJdKQogICAgIHZlcmVxKGEsIFswLCAxLCAyXSkKIAorZGVmIHJlY3Vyc2l2ZV9fY2FsbF9fKCk6CisgICAgaWYgdmVyYm9zZTogcHJpbnQgKCJUZXN0aW5nIHJlY3Vyc2l2ZSBfX2NhbGxfXygpIGJ5IHNldHRpbmcgdG8gaW5zdGFuY2Ugb2YgIgorICAgICAgICAgICAgICAgICAgICAgICAgImNsYXNzIC4uLiIpCisgICAgY2xhc3MgQShvYmplY3QpOgorICAgICAgICBwYXNzCisKKyAgICBBLl9fY2FsbF9fID0gQSgpCisgICAgdHJ5OgorICAgICAgICBBKCkoKQorICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJSZWN1cnNpb24gbGltaXQgc2hvdWxkIGhhdmUgYmVlbiByZWFjaGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIl9fY2FsbF9fKCkiKQorCiBkZWYgZGVsaG9vaygpOgogICAgIGlmIHZlcmJvc2U6IHByaW50ICJUZXN0aW5nIF9fZGVsX18gaG9vay4uLiIKICAgICBsb2cgPSBbXQpAQCAtMzgwMyw2ICszODI4LDEzIEBACiAgICAgby53aGF0ZXZlciA9IFByb3Zva2VyKG8pCiAgICAgZGVsIG8KIAorZGVmIHdyYXBwZXJfc2VnZmF1bHQoKToKKyAgICAjIFNGIDkyNzI0ODogZGVlcGx5IG5lc3RlZCB3cmFwcGVycyBjb3VsZCBjYXVzZSBzdGFjayBvdmVyZmxvdworICAgIGYgPSBsYW1iZGE6Tm9uZQorICAgIGZvciBpIGluIHhyYW5nZSgxMDAwMDAwKToKKyAgICAgICAgZiA9IGYuX19jYWxsX18KKyAgICBmID0gTm9uZQorCiAjIEZpeCBTRiAjNzYyNDU1LCBzZWdmYXVsdCB3aGVuIHN5cy5zdGRvdXQgaXMgY2hhbmdlZCBpbiBnZXRhdHRyCiBkZWYgZmlsZWZhdWx0KCk6CiAgICAgaWYgdmVyYm9zZToKQEAgLTM5NTcsNiArMzk4OSw3IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB3ZWFrcmVmX3NlZ2ZhdWx0KCkgIyBNdXN0IGJlIGZpcnN0LCBzb21laG93CisgICAgd3JhcHBlcl9zZWdmYXVsdCgpCiAgICAgZG9fdGhpc19maXJzdCgpCiAgICAgY2xhc3NfZG9jc3RyaW5ncygpCiAgICAgbGlzdHMoKQpAQCAtNDAxNSw2ICs0MDQ4LDcgQEAKICAgICBidWZmZXJfaW5oZXJpdCgpCiAgICAgc3RyX29mX3N0cl9zdWJjbGFzcygpCiAgICAga3dkYXJncygpCisgICAgcmVjdXJzaXZlX19jYWxsX18oKQogICAgIGRlbGhvb2soKQogICAgIGhhc2hpbmhlcml0KCkKICAgICBzdHJvcHMoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaXMucHkgYi9MaWIvdGVzdC90ZXN0X2Rpcy5weQppbmRleCAwODE5NDFkLi5jMzEwOTJjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rpcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rpcy5weQpAQCAtODEsNiArODEsMTMgQEAKICAgICAgYnVnMTMzMzk4Mi5mdW5jX2NvZGUuY29fZmlyc3RsaW5lbm8gKyAyLAogICAgICBidWcxMzMzOTgyLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubyArIDMpCiAKK19CSUdfTElORU5PX0ZPUk1BVCA9ICIiIlwKKyUzZCAgICAgICAgICAgMCBMT0FEX0dMT0JBTCAgICAgICAgICAgICAgMCAoc3BhbSkKKyAgICAgICAgICAgICAgMyBQT1BfVE9QCisgICAgICAgICAgICAgIDQgTE9BRF9DT05TVCAgICAgICAgICAgICAgIDAgKE5vbmUpCisgICAgICAgICAgICAgIDcgUkVUVVJOX1ZBTFVFCisiIiIKKwogY2xhc3MgRGlzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBkb19kaXNhc3NlbWJseV90ZXN0KHNlbGYsIGZ1bmMsIGV4cGVjdGVkKToKICAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKQEAgLTEyNCw2ICsxMzEsMjMgQEAKICAgICAgICAgaWYgX19kZWJ1Z19fOgogICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGJ1ZzEzMzM5ODIsIGRpc19idWcxMzMzOTgyKQogCisgICAgZGVmIHRlc3RfYmlnX2xpbmVub3Moc2VsZik6CisgICAgICAgIGRlZiBmdW5jKGNvdW50KToKKyAgICAgICAgICAgIG5hbWVzcGFjZSA9IHt9CisgICAgICAgICAgICBmdW5jID0gImRlZiBmb28oKTpcbiAiICsgIiIuam9pbihbIlxuICJdICogY291bnQgKyBbInNwYW1cbiJdKQorICAgICAgICAgICAgZXhlYyBmdW5jIGluIG5hbWVzcGFjZQorICAgICAgICAgICAgcmV0dXJuIG5hbWVzcGFjZVsnZm9vJ10KKworICAgICAgICAjIFRlc3QgYWxsIHNtYWxsIHJhbmdlcworICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMSwgMzAwKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gX0JJR19MSU5FTk9fRk9STUFUICUgKGkgKyAyKQorICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGZ1bmMoaSksIGV4cGVjdGVkKQorCisgICAgICAgICMgVGVzdCBzb21lIGxhcmdlciByYW5nZXMgdG9vCisgICAgICAgIGZvciBpIGluIHhyYW5nZSgzMDAsIDUwMDAsIDEwKToKKyAgICAgICAgICAgIGV4cGVjdGVkID0gX0JJR19MSU5FTk9fRk9STUFUICUgKGkgKyAyKQorICAgICAgICAgICAgc2VsZi5kb19kaXNhc3NlbWJseV90ZXN0KGZ1bmMoaSksIGV4cGVjdGVkKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KERpc1Rlc3RzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggMDFmN2FjZC4uZTgzNzljNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtNDE5LDcgKzQxOSw2IEBACiAKICAgICA+Pj4gZmluZGVyID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkKICAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpAQCAtNDM1LDcgKzQzNCw2IEBACiBOZXctc3R5bGUgY2xhc3NlcyBhcmUgYWxzbyBzdXBwb3J0ZWQ6CiAKICAgICA+Pj4gdGVzdHMgPSBmaW5kZXIuZmluZChTYW1wbGVOZXdTdHlsZUNsYXNzKQotICAgID4+PiB0ZXN0cy5zb3J0KCkKICAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CiAgICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCiAgICAgIDEgIFNhbXBsZU5ld1N0eWxlQ2xhc3MKQEAgLTQ3NSw3ICs0NzMsNiBAQAogICAgID4+PiAjIGlnbm9yaW5nIHRoZSBvYmplY3RzIHNpbmNlIHRoZXkgd2VyZW4ndCBkZWZpbmVkIGluIG0uCiAgICAgPj4+IGltcG9ydCB0ZXN0LnRlc3RfZG9jdGVzdAogICAgID4+PiB0ZXN0cyA9IGZpbmRlci5maW5kKG0sIG1vZHVsZT10ZXN0LnRlc3RfZG9jdGVzdCkKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAxICBzb21lX21vZHVsZQpAQCAtNDk5LDcgKzQ5Niw2IEBACiAKICAgICA+Pj4gZnJvbSB0ZXN0IGltcG9ydCBkb2N0ZXN0X2FsaWFzZXMKICAgICA+Pj4gdGVzdHMgPSBleGNsX2VtcHR5X2ZpbmRlci5maW5kKGRvY3Rlc3RfYWxpYXNlcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IHByaW50IGxlbih0ZXN0cykKICAgICAyCiAgICAgPj4+IHByaW50IHRlc3RzWzBdLm5hbWUKQEAgLTUxNyw3ICs1MTMsNiBAQAogQnkgZGVmYXVsdCwgYW4gb2JqZWN0IHdpdGggbm8gZG9jdGVzdHMgZG9lc24ndCBjcmVhdGUgYW55IHRlc3RzOgogCiAgICAgPj4+IHRlc3RzID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChTYW1wbGVDbGFzcykKLSAgICA+Pj4gdGVzdHMuc29ydCgpCiAgICAgPj4+IGZvciB0IGluIHRlc3RzOgogICAgIC4uLiAgICAgcHJpbnQgJyUycyAgJXMnICUgKGxlbih0LmV4YW1wbGVzKSwgdC5uYW1lKQogICAgICAzICBTYW1wbGVDbGFzcwpAQCAtNTM2LDcgKzUzMSw2IEBACiBkaXNwbGF5cy4KIAogICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihleGNsdWRlX2VtcHR5PUZhbHNlKS5maW5kKFNhbXBsZUNsYXNzKQotICAgID4+PiB0ZXN0cy5zb3J0KCkKICAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CiAgICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCiAgICAgIDMgIFNhbXBsZUNsYXNzCkBAIC01NTcsNyArNTUxLDYgQEAKIHVzaW5nIHRoZSBgcmVjdXJzZWAgZmxhZzoKIAogICAgID4+PiB0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcihyZWN1cnNlPUZhbHNlKS5maW5kKFNhbXBsZUNsYXNzKQotICAgID4+PiB0ZXN0cy5zb3J0KCkKICAgICA+Pj4gZm9yIHQgaW4gdGVzdHM6CiAgICAgLi4uICAgICBwcmludCAnJTJzICAlcycgJSAobGVuKHQuZXhhbXBsZXMpLCB0Lm5hbWUpCiAgICAgIDMgIFNhbXBsZUNsYXNzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2VtYWlsX2NvZGVjcy5weSBiL0xpYi90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CmluZGV4IGFhZGQ1MzcuLmM1NTBhNmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5CkBAIC0xLDExICsxLDE1IEBACiAjIENvcHlyaWdodCAoQykgMjAwMiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMgZm9yIChvcHRpb25hbCkgQXNpYW4gY29kZWNzCiAKLWltcG9ydCB1bml0dGVzdAogIyBUaGUgc3BlY2lmaWMgdGVzdHMgbm93IGxpdmUgaW4gTGliL2VtYWlsL3Rlc3QKLWZyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsX2NvZGVjcyBpbXBvcnQgc3VpdGUKK2Zyb20gZW1haWwudGVzdCBpbXBvcnQgdGVzdF9lbWFpbF9jb2RlY3MKK2Zyb20gZW1haWwudGVzdCBpbXBvcnQgdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAorZGVmIHRlc3RfbWFpbigpOgorICAgIHN1aXRlID0gdGVzdF9lbWFpbF9jb2RlY3Muc3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5zdWl0ZSgpKQorICAgIHRlc3Rfc3VwcG9ydC5ydW5fc3VpdGUoc3VpdGUpCiAKLQwKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKaW5kZXggZWJlNjBjMS4uYmUyY2NhMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMzE0LDYgKzMxNCwxOCBAQAogICAgICAgICB4ID0gRGVyaXZlZEV4Y2VwdGlvbihmYW5jeV9hcmc9NDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguZmFuY3lfYXJnLCA0MikKIAorICAgIGRlZiB0ZXN0SW5maW5pdGVSZWN1cnNpb24oc2VsZik6CisgICAgICAgIGRlZiBmKCk6CisgICAgICAgICAgICByZXR1cm4gZigpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgZikKKworICAgICAgICBkZWYgZygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiBnKCkKKyAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiAtMQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGcpCisKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoRXhjZXB0aW9uVGVzdHMpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkgYi9MaWIvdGVzdC90ZXN0X2ZjbnRsLnB5CmluZGV4IGY1M2IxM2EuLjU4YTU3YjUgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmNudGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mY250bC5weQpAQCAtMjAsOSArMjAsMTAgQEAKIGlmIHN5cy5wbGF0Zm9ybS5zdGFydHN3aXRoKCdhdGhlb3MnKToKICAgICBzdGFydF9sZW4gPSAicXEiCiAKLWlmIHN5cy5wbGF0Zm9ybSBpbiAoJ25ldGJzZDEnLCAnbmV0YnNkMicsICdEYXJ3aW4xLjInLCAnZGFyd2luJywKLSAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2QyJywgJ2ZyZWVic2QzJywgJ2ZyZWVic2Q0JywgJ2ZyZWVic2Q1JywgJ2ZyZWVic2Q2JywKLSAgICAgICAgICAgICAgICAgICAgJ2ZyZWVic2Q3JywKK2lmIHN5cy5wbGF0Zm9ybSBpbiAoJ25ldGJzZDEnLCAnbmV0YnNkMicsICduZXRic2QzJywKKyAgICAgICAgICAgICAgICAgICAgJ0RhcndpbjEuMicsICdkYXJ3aW4nLAorICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDInLCAnZnJlZWJzZDMnLCAnZnJlZWJzZDQnLCAnZnJlZWJzZDUnLAorICAgICAgICAgICAgICAgICAgICAnZnJlZWJzZDYnLCAnZnJlZWJzZDcnLAogICAgICAgICAgICAgICAgICAgICAnYnNkb3MyJywgJ2JzZG9zMycsICdic2RvczQnLAogICAgICAgICAgICAgICAgICAgICAnb3BlbmJzZCcsICdvcGVuYnNkMicsICdvcGVuYnNkMycpOgogICAgIGlmIHN0cnVjdC5jYWxjc2l6ZSgnbCcpID09IDg6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKaW5kZXggZGNmYTI2NS4uMjM0OTIwZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQpAQCAtMTEsMTQgKzExLDEyIEBACiAgICAgIyBmaWxlIHRlc3RzIGZvciB3aGljaCBhIHRlc3QgZmlsZSBpcyBhdXRvbWF0aWNhbGx5IHNldCB1cAogCiAgICAgZGVmIHNldFVwKHNlbGYpOgotICAgICAgICBzZWxmLmYgPSBmaWxlKFRFU1RGTiwgJ3diJykKKyAgICAgICAgc2VsZi5mID0gb3BlbihURVNURk4sICd3YicpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGlmIHNlbGYuZjoKLSAgICAgICAgICAgICAgICBzZWxmLmYuY2xvc2UoKQotICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgIHBhc3MKKyAgICAgICAgaWYgc2VsZi5mOgorICAgICAgICAgICAgc2VsZi5mLmNsb3NlKCkKKyAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0V2Vha1JlZnMoc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHdlYWsgcmVmZXJlbmNlcwpAQCAtODAsOSArNzgsMTEgQEAKIAogICAgIGRlZiB0ZXN0V3JpdGVsaW5lc05vblN0cmluZyhzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgd3JpdGVsaW5lcyB3aXRoIG5vbi1zdHJpbmcgb2JqZWN0Ci0gICAgICAgIGNsYXNzIE5vblN0cmluZzogcGFzcworICAgICAgICBjbGFzcyBOb25TdHJpbmc6CisgICAgICAgICAgICBwYXNzCiAKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLmYud3JpdGVsaW5lcywgW05vblN0cmluZygpLCBOb25TdHJpbmcoKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5mLndyaXRlbGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb25TdHJpbmcoKSwgTm9uU3RyaW5nKCldKQogCiAgICAgZGVmIHRlc3RSZXByKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzCkBAIC05MywxOSArOTMsMjEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZi5uYW1lLCBURVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5pc2F0dHkoKSkKICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmLmNsb3NlZCkKLSAgICAgICAgCisKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnJlYWRpbnRvLCAiIikKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhmLmNsb3NlZCkKIAogICAgIGRlZiB0ZXN0TWV0aG9kcyhzZWxmKToKICAgICAgICAgbWV0aG9kcyA9IFsnZmlsZW5vJywgJ2ZsdXNoJywgJ2lzYXR0eScsICduZXh0JywgJ3JlYWQnLCAncmVhZGludG8nLAotICAgICAgICAgICAgICAgICAgICdyZWFkbGluZScsICdyZWFkbGluZXMnLCAnc2VlaycsICd0ZWxsJywgJ3RydW5jYXRlJywgJ3dyaXRlJywKLSAgICAgICAgICAgICAgICAgICAnX19pdGVyX18nXQorICAgICAgICAgICAgICAgICAgICdyZWFkbGluZScsICdyZWFkbGluZXMnLCAnc2VlaycsICd0ZWxsJywgJ3RydW5jYXRlJywKKyAgICAgICAgICAgICAgICAgICAnd3JpdGUnLCAnX19pdGVyX18nXQogICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnYXRoZW9zJyk6CiAgICAgICAgICAgICBtZXRob2RzLnJlbW92ZSgndHJ1bmNhdGUnKQogCi0gICAgICAgIHNlbGYuZi5jbG9zZSgpCisgICAgICAgICMgX19leGl0X18gc2hvdWxkIGNsb3NlIHRoZSBmaWxlCisgICAgICAgIHNlbGYuZi5fX2V4aXRfXyhOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5mLmNsb3NlZCkKIAogICAgICAgICBmb3IgbWV0aG9kbmFtZSBpbiBtZXRob2RzOgogICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLmYsIG1ldGhvZG5hbWUpCkBAIC0xMTMsNiArMTE1LDE0IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtZXRob2QpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHNlbGYuZi53cml0ZWxpbmVzLCBbXSkKIAorICAgICAgICAjIGZpbGUgaXMgY2xvc2VkLCBfX2V4aXRfXyBzaG91bGRuJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5mLl9fZXhpdF9fKE5vbmUsIE5vbmUsIE5vbmUpLCBOb25lKQorICAgICAgICAjIGl0IG11c3QgYWxzbyByZXR1cm4gTm9uZSBpZiBhbiBleGNlcHRpb24gd2FzIGdpdmVuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIDEvMAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmYuX19leGl0X18oKnN5cy5leGNfaW5mbygpKSwgTm9uZSkKKwogCiBjbGFzcyBPdGhlckZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTEyMCw3ICsxMzAsNyBAQAogICAgICAgICAjIGNoZWNrIGludmFsaWQgbW9kZSBzdHJpbmdzCiAgICAgICAgIGZvciBtb2RlIGluICgiIiwgImFVIiwgIndVKyIpOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYgPSBmaWxlKFRFU1RGTiwgbW9kZSkKKyAgICAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sIG1vZGUpCiAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBlbHNlOgpAQCAtMTQyLDYgKzE1Miw3IEBACiAgICAgICAgIGYgPSBvcGVuKHVuaWNvZGUoVEVTVEZOKSwgInciKQogICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihmKS5zdGFydHN3aXRoKCI8b3BlbiBmaWxlIHUnIiArIFRFU1RGTikpCiAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBvcy51bmxpbmsoVEVTVEZOKQogCiAgICAgZGVmIHRlc3RCYWRNb2RlQXJndW1lbnQoc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHRoYXQgd2UgZ2V0IGEgc2Vuc2libGUgZXJyb3IgbWVzc2FnZSBmb3IgYmFkIG1vZGUgYXJndW1lbnQKQEAgLTE4MiwxMSArMTkzLDExIEBACiAgICAgICAgIGRlZiBidWc4MDE2MzEoKToKICAgICAgICAgICAgICMgU0YgYnVnIDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvODAxNjMxPgogICAgICAgICAgICAgIyAiZmlsZS50cnVuY2F0ZSBmYXVsdCBvbiB3aW5kb3dzIgotICAgICAgICAgICAgZiA9IGZpbGUoVEVTVEZOLCAnd2InKQorICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAnd2InKQogICAgICAgICAgICAgZi53cml0ZSgnMTIzNDU2Nzg5MDEnKSAgICMgMTEgYnl0ZXMKICAgICAgICAgICAgIGYuY2xvc2UoKQogCi0gICAgICAgICAgICBmID0gZmlsZShURVNURk4sJ3JiKycpCisgICAgICAgICAgICBmID0gb3BlbihURVNURk4sJ3JiKycpCiAgICAgICAgICAgICBkYXRhID0gZi5yZWFkKDUpCiAgICAgICAgICAgICBpZiBkYXRhICE9ICcxMjM0NSc6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJSZWFkIG9uIGZpbGUgb3BlbmVkIGZvciB1cGRhdGUgZmFpbGVkICVyIiAlIGRhdGEpCkBAIC0yMDgsMTQgKzIxOSwxNCBAQAogICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAogICAgIGRlZiB0ZXN0SXRlcmF0aW9uKHNlbGYpOgotICAgICAgICAjIFRlc3QgdGhlIGNvbXBsZXggaW50ZXJhY3Rpb24gd2hlbiBtaXhpbmcgZmlsZS1pdGVyYXRpb24gYW5kIHRoZSB2YXJpb3VzCi0gICAgICAgICMgcmVhZCogbWV0aG9kcy4gT3N0ZW5zaWJseSwgdGhlIG1peHR1cmUgY291bGQganVzdCBiZSB0ZXN0ZWQgdG8gd29yawotICAgICAgICAjIHdoZW4gaXQgc2hvdWxkIHdvcmsgYWNjb3JkaW5nIHRvIHRoZSBQeXRob24gbGFuZ3VhZ2UsIGluc3RlYWQgb2YgZmFpbAotICAgICAgICAjIHdoZW4gaXQgc2hvdWxkIGZhaWwgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IENQeXRob24gaW1wbGVtZW50YXRpb24uCi0gICAgICAgICMgUGVvcGxlIGRvbid0IGFsd2F5cyBwcm9ncmFtIFB5dGhvbiB0aGUgd2F5IHRoZXkgc2hvdWxkLCB0aG91Z2gsIGFuZCB0aGUKLSAgICAgICAgIyBpbXBsZW1lbmF0aW9uIG1pZ2h0IGNoYW5nZSBpbiBzdWJ0bGUgd2F5cywgc28gd2UgZXhwbGljaXRseSB0ZXN0IGZvcgotICAgICAgICAjIGVycm9ycywgdG9vOyB0aGUgdGVzdCB3aWxsIGp1c3QgaGF2ZSB0byBiZSB1cGRhdGVkIHdoZW4gdGhlCi0gICAgICAgICMgaW1wbGVtZW50YXRpb24gY2hhbmdlcy4KKyAgICAgICAgIyBUZXN0IHRoZSBjb21wbGV4IGludGVyYWN0aW9uIHdoZW4gbWl4aW5nIGZpbGUtaXRlcmF0aW9uIGFuZCB0aGUKKyAgICAgICAgIyB2YXJpb3VzIHJlYWQqIG1ldGhvZHMuIE9zdGVuc2libHksIHRoZSBtaXh0dXJlIGNvdWxkIGp1c3QgYmUgdGVzdGVkCisgICAgICAgICMgdG8gd29yayB3aGVuIGl0IHNob3VsZCB3b3JrIGFjY29yZGluZyB0byB0aGUgUHl0aG9uIGxhbmd1YWdlLAorICAgICAgICAjIGluc3RlYWQgb2YgZmFpbCB3aGVuIGl0IHNob3VsZCBmYWlsIGFjY29yZGluZyB0byB0aGUgY3VycmVudCBDUHl0aG9uCisgICAgICAgICMgaW1wbGVtZW50YXRpb24uICBQZW9wbGUgZG9uJ3QgYWx3YXlzIHByb2dyYW0gUHl0aG9uIHRoZSB3YXkgdGhleQorICAgICAgICAjIHNob3VsZCwgdGhvdWdoLCBhbmQgdGhlIGltcGxlbWVuYXRpb24gbWlnaHQgY2hhbmdlIGluIHN1YnRsZSB3YXlzLAorICAgICAgICAjIHNvIHdlIGV4cGxpY2l0bHkgdGVzdCBmb3IgZXJyb3JzLCB0b287IHRoZSB0ZXN0IHdpbGwganVzdCBoYXZlIHRvCisgICAgICAgICMgYmUgdXBkYXRlZCB3aGVuIHRoZSBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzLgogICAgICAgICBkYXRhb2Zmc2V0ID0gMTYzODQKICAgICAgICAgZmlsbGVyID0gImhhbVxuIgogICAgICAgICBhc3NlcnQgbm90IGRhdGFvZmZzZXQgJSBsZW4oZmlsbGVyKSwgXApAQCAtMjUzLDEyICsyNjQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWV0aG9kbmFtZSwgYXJncykpCiAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCiAKLSAgICAgICAgICAgICMgVGVzdCB0byBzZWUgaWYgaGFybWxlc3MgKGJ5IGFjY2lkZW50KSBtaXhpbmcgb2YgcmVhZCogYW5kIGl0ZXJhdGlvbgotICAgICAgICAgICAgIyBzdGlsbCB3b3Jrcy4gVGhpcyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbCBpdGVyYXRpb24KLSAgICAgICAgICAgICMgYnVmZmVyIChjdXJyZW50bHkgODE5MiwpIGJ1dCB3ZSBjYW4gdGVzdCBpdCBpbiBhIGZsZXhpYmxlIG1hbm5lci4KLSAgICAgICAgICAgICMgRWFjaCBsaW5lIGluIHRoZSBiYWcgbycgaGFtIGlzIDQgYnl0ZXMgKCJoIiwgImEiLCAibSIsICJcbiIpLCBzbwotICAgICAgICAgICAgIyA0MDk2IGxpbmVzIG9mIHRoYXQgc2hvdWxkIGdldCB1cyBleGFjdGx5IG9uIHRoZSBidWZmZXIgYm91bmRhcnkgZm9yCi0gICAgICAgICAgICAjIGFueSBwb3dlci1vZi0yIGJ1ZmZlcnNpemUgYmV0d2VlbiA0IGFuZCAxNjM4NCAoaW5jbHVzaXZlKS4KKyAgICAgICAgICAgICMgVGVzdCB0byBzZWUgaWYgaGFybWxlc3MgKGJ5IGFjY2lkZW50KSBtaXhpbmcgb2YgcmVhZCogYW5kCisgICAgICAgICAgICAjIGl0ZXJhdGlvbiBzdGlsbCB3b3Jrcy4gVGhpcyBkZXBlbmRzIG9uIHRoZSBzaXplIG9mIHRoZSBpbnRlcm5hbAorICAgICAgICAgICAgIyBpdGVyYXRpb24gYnVmZmVyIChjdXJyZW50bHkgODE5MiwpIGJ1dCB3ZSBjYW4gdGVzdCBpdCBpbiBhCisgICAgICAgICAgICAjIGZsZXhpYmxlIG1hbm5lci4gIEVhY2ggbGluZSBpbiB0aGUgYmFnIG8nIGhhbSBpcyA0IGJ5dGVzCisgICAgICAgICAgICAjICgiaCIsICJhIiwgIm0iLCAiXG4iKSwgc28gNDA5NiBsaW5lcyBvZiB0aGF0IHNob3VsZCBnZXQgdXMKKyAgICAgICAgICAgICMgZXhhY3RseSBvbiB0aGUgYnVmZmVyIGJvdW5kYXJ5IGZvciBhbnkgcG93ZXItb2YtMiBidWZmZXJzaXplCisgICAgICAgICAgICAjIGJldHdlZW4gNCBhbmQgMTYzODQgKGluY2x1c2l2ZSkuCiAgICAgICAgICAgICBmID0gb3BlbihURVNURk4sICdyYicpCiAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShuY2h1bmtzKToKICAgICAgICAgICAgICAgICBmLm5leHQoKQpAQCAtMzE5LDcgKzMzMSwxMyBAQAogCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoQXV0b0ZpbGVUZXN0cywgT3RoZXJGaWxlVGVzdHMpCisgICAgIyBIaXN0b3JpY2FsbHksIHRoZXNlIHRlc3RzIGhhdmUgYmVlbiBzbG9wcHkgYWJvdXQgcmVtb3ZpbmcgVEVTVEZOLgorICAgICMgU28gZ2V0IHJpZCBvZiBpdCBubyBtYXR0ZXIgd2hhdC4KKyAgICB0cnk6CisgICAgICAgIHJ1bl91bml0dGVzdChBdXRvRmlsZVRlc3RzLCBPdGhlckZpbGVUZXN0cykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhURVNURk4pOgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5CmluZGV4IGM1NDExOWMuLjUwMzU2MmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGVjbXAucHkKQEAgLTEsNSArMSw1IEBACiAKLWltcG9ydCBvcywgZmlsZWNtcCwgc2h1dGlsLCB0ZW1wZmlsZQoraW1wb3J0IG9zLCBmaWxlY21wLCBzaHV0aWwsIHRlbXBmaWxlLCBzaHV0aWwKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIApAQCAtNDksNiArNDksNyBAQAogICAgICAgICBzZWxmLmNhc2VpbnNlbnNpdGl2ZSA9IG9zLnBhdGgubm9ybWNhc2UoJ0EnKSA9PSBvcy5wYXRoLm5vcm1jYXNlKCdhJykKICAgICAgICAgZGF0YSA9ICdDb250ZW50cyBvZiBmaWxlIGdvIGhlcmUuXG4nCiAgICAgICAgIGZvciBkaXIgaW4gW3NlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBzZWxmLmRpcl9kaWZmXToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZGlyLCBUcnVlKQogICAgICAgICAgICAgb3MubWtkaXIoZGlyKQogICAgICAgICAgICAgaWYgc2VsZi5jYXNlaW5zZW5zaXRpdmUgYW5kIGRpciBpcyBzZWxmLmRpcl9zYW1lOgogICAgICAgICAgICAgICAgIGZuID0gJ0ZpTGUnICAgICAjIFZlcmlmeSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkgYi9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CmluZGV4IGNiYTVmYzcuLmU2NGUzOTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQpAQCAtMiw4ICsyLDkgQEAKICIiIgogCiBpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCiBmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdCwgcmVhcF9jaGlsZHJlbgogCiB0cnk6CiAgICAgb3MuZm9yawpAQCAtMTIsMTIgKzEzLDIwIEBACiAKIGNsYXNzIEZvcmtUZXN0KEZvcmtXYWl0KToKICAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgotICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIDApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICMgd2FpdHBpZCgpIHNob3VsZG4ndCBoYW5nLCBidXQgc29tZSBvZiB0aGUgYnVpbGRib3RzIHNlZW0gdG8gaGFuZworICAgICAgICAgICAgIyBpbiB0aGUgZm9ya2luZyB0ZXN0cy4gIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBmaXggdGhlIHByb2JsZW0uCisgICAgICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIG9zLldOT0hBTkcpCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMS4wKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KEZvcmtUZXN0KQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKaW5kZXggYTE4NGE4Yi4uZWUzNjQxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQpAQCAtMTQ5NywyMiArMTQ5Nyw1NSBAQAogPHR5cGUgJ2dlbmVyYXRvcic+CiAKIAorQSB5aWVsZCBleHByZXNzaW9uIHdpdGggYXVnbWVudGVkIGFzc2lnbm1lbnQuCisKKz4+PiBkZWYgY29yb3V0aW5lKHNlcSk6CisuLi4gICAgIGNvdW50ID0gMAorLi4uICAgICB3aGlsZSBjb3VudCA8IDIwMDoKKy4uLiAgICAgICAgIGNvdW50ICs9IHlpZWxkCisuLi4gICAgICAgICBzZXEuYXBwZW5kKGNvdW50KQorPj4+IHNlcSA9IFtdCis+Pj4gYyA9IGNvcm91dGluZShzZXEpCis+Pj4gYy5uZXh0KCkKKz4+PiBwcmludCBzZXEKK1tdCis+Pj4gYy5zZW5kKDEwKQorPj4+IHByaW50IHNlcQorWzEwXQorPj4+IGMuc2VuZCgxMCkKKz4+PiBwcmludCBzZXEKK1sxMCwgMjBdCis+Pj4gYy5zZW5kKDEwKQorPj4+IHByaW50IHNlcQorWzEwLCAyMCwgMzBdCisKKwogQ2hlY2sgc29tZSBzeW50YXggZXJyb3JzIGZvciB5aWVsZCBleHByZXNzaW9uczoKIAogPj4+IGY9bGFtYmRhOiAoeWllbGQgMSksKHlpZWxkIDIpCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIC4uLgotU3ludGF4RXJyb3I6ICd5aWVsZCcgb3V0c2lkZSBmdW5jdGlvbiAoPGRvY3Rlc3QgdGVzdC50ZXN0X2dlbmVyYXRvcnMuX190ZXN0X18uY29yb3V0aW5lWzEwXT4sIGxpbmUgMSkKK1N5bnRheEVycm9yOiAneWllbGQnIG91dHNpZGUgZnVuY3Rpb24gKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyMV0+LCBsaW5lIDEpCiAKID4+PiBkZWYgZigpOiByZXR1cm4gbGFtYmRhIHg9KHlpZWxkKTogMQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KLVN5bnRheEVycm9yOiAncmV0dXJuJyB3aXRoIGFyZ3VtZW50IGluc2lkZSBnZW5lcmF0b3IgKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsxMV0+LCBsaW5lIDEpCitTeW50YXhFcnJvcjogJ3JldHVybicgd2l0aCBhcmd1bWVudCBpbnNpZGUgZ2VuZXJhdG9yICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjJdPiwgbGluZSAxKQogCiA+Pj4gZGVmIGYoKTogeCA9IHlpZWxkID0geQogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KLVN5bnRheEVycm9yOiBhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMTJdPiwgbGluZSAxKQorU3ludGF4RXJyb3I6IGFzc2lnbm1lbnQgdG8geWllbGQgZXhwcmVzc2lvbiBub3QgcG9zc2libGUgKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyM10+LCBsaW5lIDEpCisKKz4+PiBkZWYgZigpOiAoeWllbGQgYmFyKSA9IHkKK1RyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgLi4uCitTeW50YXhFcnJvcjogY2FuJ3QgYXNzaWduIHRvIHlpZWxkIGV4cHJlc3Npb24gKDxkb2N0ZXN0IHRlc3QudGVzdF9nZW5lcmF0b3JzLl9fdGVzdF9fLmNvcm91dGluZVsyNF0+LCBsaW5lIDEpCisKKz4+PiBkZWYgZigpOiAoeWllbGQgYmFyKSArPSB5CitUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CisgIC4uLgorU3ludGF4RXJyb3I6IGF1Z21lbnRlZCBhc3NpZ25tZW50IHRvIHlpZWxkIGV4cHJlc3Npb24gbm90IHBvc3NpYmxlICg8ZG9jdGVzdCB0ZXN0LnRlc3RfZ2VuZXJhdG9ycy5fX3Rlc3RfXy5jb3JvdXRpbmVbMjVdPiwgbGluZSAxKQogCiAKIE5vdyBjaGVjayBzb21lIHRocm93KCkgY29uZGl0aW9uczoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weSBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQppbmRleCBlNDE0NzU3Li4yNTk4YTc5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CkBAIC0xMDksNyArMTA5LDcgQEAKICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICBGaWxlICI8cHlzaGVsbCM0PiIsIGxpbmUgMSwgaW4gLXRvcGxldmVsLQogICAgICAgICAoaSBmb3IgaSBpbiA2KQotICAgIFR5cGVFcnJvcjogaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlCisgICAgVHlwZUVycm9yOiAnaW50JyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlCiAKIFZlcmlmeSBsYXRlIGJpbmRpbmcgZm9yIHRoZSBvdXRlcm1vc3QgaWYtZXhwcmVzc2lvbgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5IGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQppbmRleCA4ODY0ZThlLi5jNDI4ZjQ1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKQEAgLTIzMyw4ICsyMzMsMjUgQEAKIAogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChWRVJZX0xBUkdFICYgVUxMT05HX01BWCwgZ2V0YXJnc19LKFZFUllfTEFSR0UpKQogCisKK2NsYXNzIFR1cGxlX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF90dXBsZShzZWxmKToKKyAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfdHVwbGUKKworICAgICAgICByZXQgPSBnZXRhcmdzX3R1cGxlKDEsICgyLCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmV0LCAoMSwyLDMpKQorCisgICAgICAgICMgbWFrZSBzdXJlIGludmFsaWQgdHVwbGUgYXJndW1lbnRzIGFyZSBoYW5kbGVkIGNvcnJlY3RseQorICAgICAgICBjbGFzcyBzZXE6CisgICAgICAgICAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMgorICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG4pOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX3R1cGxlLCAxLCBzZXEoKSkKKworCiBkZWYgdGVzdF9tYWluKCk6Ci0gICAgdGVzdHMgPSBbU2lnbmVkX1Rlc3RDYXNlLCBVbnNpZ25lZF9UZXN0Q2FzZV0KKyAgICB0ZXN0cyA9IFtTaWduZWRfVGVzdENhc2UsIFVuc2lnbmVkX1Rlc3RDYXNlLCBUdXBsZV9UZXN0Q2FzZV0KICAgICB0cnk6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0wsIGdldGFyZ3NfSwogICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCA0YmI0ZTQ1Li5mMTYwODY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC01MzEsNiArNTMxLDExIEBACiBmb3IgeCBpbiBTcXVhcmVzKDEwKTogbiA9IG4reAogaWYgbiAhPSAyODU6IHJhaXNlIFRlc3RGYWlsZWQsICdmb3Igb3ZlciBncm93aW5nIHNlcXVlbmNlJwogCityZXN1bHQgPSBbXQorZm9yIHgsIGluIFsoMSwpLCAoMiwpLCAoMywpXToKKyAgICByZXN1bHQuYXBwZW5kKHgpCit2ZXJlcShyZXN1bHQsIFsxLCAyLCAzXSkKKwogcHJpbnQgJ3RyeV9zdG10JwogIyMjIHRyeV9zdG10OiAndHJ5JyAnOicgc3VpdGUgKGV4Y2VwdF9jbGF1c2UgJzonIHN1aXRlKSsgWydlbHNlJyAnOicgc3VpdGVdCiAjIyMgICAgICAgICB8ICd0cnknICc6JyBzdWl0ZSAnZmluYWxseScgJzonIHN1aXRlCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKaW5kZXggZDlmZDkzZC4uOTkxNDBkMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQpAQCAtMSw2ICsxLDggQEAKIGltcG9ydCBzeXMKK2ltcG9ydCB0eXBlcwogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgaW5zcGVjdAoraW1wb3J0IGRhdGV0aW1lCiAKIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTiwgcnVuX3VuaXR0ZXN0CiAKQEAgLTE1LDcgKzE3LDcgQEAKICMgaXNkYXRhZGVzY3JpcHRvcgogCiBtb2RmaWxlID0gbW9kLl9fZmlsZV9fCi1pZiBtb2RmaWxlLmVuZHN3aXRoKCdjJykgb3IgbW9kZmlsZS5lbmRzd2l0aCgnbycpOgoraWYgbW9kZmlsZS5lbmRzd2l0aCgoJ2MnLCAnbycpKToKICAgICBtb2RmaWxlID0gbW9kZmlsZVs6LTFdCiAKIGltcG9ydCBfX2J1aWx0aW5fXwpAQCAtNDAsMTAgKzQyLDEyIEBACiAgICAgICAgICAgICBzZWxmLmZhaWxJZihvdGhlcihvYmopLCAnbm90ICVzKCVzKScgJSAob3RoZXIuX19uYW1lX18sIGV4cCkpCiAKIGNsYXNzIFRlc3RQcmVkaWNhdGVzKElzVGVzdEJhc2UpOgotICAgIGRlZiB0ZXN0X2VsZXZlbihzZWxmKToKLSAgICAgICAgIyBEb2MvbGliL2xpYmluc3BlY3QudGV4IGNsYWltcyB0aGVyZSBhcmUgMTEgc3VjaCBmdW5jdGlvbnMKKyAgICBkZWYgdGVzdF90aGlydGVlbihzZWxmKToKICAgICAgICAgY291bnQgPSBsZW4oZmlsdGVyKGxhbWJkYSB4Onguc3RhcnRzd2l0aCgnaXMnKSwgZGlyKGluc3BlY3QpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb3VudCwgMTEsICJUaGVyZSBhcmUgJWQgKG5vdCAxMSkgaXMqIGZ1bmN0aW9ucyIgJSBjb3VudCkKKyAgICAgICAgIyBEb2MvbGliL2xpYmluc3BlY3QudGV4IGNsYWltcyB0aGVyZSBhcmUgMTMgc3VjaCBmdW5jdGlvbnMKKyAgICAgICAgZXhwZWN0ZWQgPSAxMworICAgICAgICBlcnJfbXNnID0gIlRoZXJlIGFyZSAlZCAobm90ICVkKSBpcyogZnVuY3Rpb25zIiAlIChjb3VudCwgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGV4cGVjdGVkLCBlcnJfbXNnKQogCiAgICAgZGVmIHRlc3RfZXhjbHVkaW5nX3ByZWRpY2F0ZXMoc2VsZik6CiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNidWlsdGluLCAnc3lzLmV4aXQnKQpAQCAtNTgsNiArNjIsMTUgQEAKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc3RyYWNlYmFjaywgJ3RiJykKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2RhdGFkZXNjcmlwdG9yLCAnX19idWlsdGluX18uZmlsZS5jbG9zZWQnKQogICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZGF0YWRlc2NyaXB0b3IsICdfX2J1aWx0aW5fXy5maWxlLnNvZnRzcGFjZScpCisgICAgICAgIGlmIGhhc2F0dHIodHlwZXMsICdHZXRTZXREZXNjcmlwdG9yVHlwZScpOgorICAgICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAndHlwZSh0Yi50Yl9mcmFtZSkuZl9sb2NhbHMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaW5zcGVjdC5pc2dldHNldGRlc2NyaXB0b3IodHlwZSh0Yi50Yl9mcmFtZSkuZl9sb2NhbHMpKQorICAgICAgICBpZiBoYXNhdHRyKHR5cGVzLCAnTWVtYmVyRGVzY3JpcHRvclR5cGUnKToKKyAgICAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yLCAnZGF0ZXRpbWUudGltZWRlbHRhLmRheXMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsSWYoaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3IoZGF0ZXRpbWUudGltZWRlbHRhLmRheXMpKQogCiAgICAgZGVmIHRlc3RfaXNyb3V0aW5lKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydF8oaW5zcGVjdC5pc3JvdXRpbmUobW9kLnNwYW0pKQpAQCAtMTgwLDYgKzE5MywxNyBAQAogICAgIGRlZiB0ZXN0X2dldGZpbGUoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRmaWxlKG1vZC5TdHVwaWRHaXQpLCBtb2QuX19maWxlX18pCiAKKyAgICBkZWYgdGVzdF9nZXRtb2R1bGVfcmVjdXJzaW9uKHNlbGYpOgorICAgICAgICBmcm9tIG5ldyBpbXBvcnQgbW9kdWxlCisgICAgICAgIG5hbWUgPSAnX19pbnNwZWN0X2R1bW15JworICAgICAgICBtID0gc3lzLm1vZHVsZXNbbmFtZV0gPSBtb2R1bGUobmFtZSkKKyAgICAgICAgbS5fX2ZpbGVfXyA9ICI8c3RyaW5nPiIgIyBob3BlZnVsbHkgbm90IGEgcmVhbCBmaWxlbmFtZS4uLgorICAgICAgICBtLl9fbG9hZGVyX18gPSAiZHVtbXkiICAjIHByZXRlbmQgdGhlIGZpbGVuYW1lIGlzIHVuZGVyc3Rvb2QgYnkgYSBsb2FkZXIKKyAgICAgICAgZXhlYyAiZGVmIHgoKTogcGFzcyIgaW4gbS5fX2RpY3RfXworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluc3BlY3QuZ2V0c291cmNlZmlsZShtLnguZnVuY19jb2RlKSwgJzxzdHJpbmc+JykKKyAgICAgICAgZGVsIHN5cy5tb2R1bGVzW25hbWVdCisgICAgICAgIGluc3BlY3QuZ2V0bW9kdWxlKGNvbXBpbGUoJ2E9MTAnLCcnLCdzaW5nbGUnKSkKKwogY2xhc3MgVGVzdERlY29yYXRvcnMoR2V0U291cmNlQmFzZSk6CiAgICAgZm9kZGVyRmlsZSA9IG1vZDIKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5IGIvTGliL3Rlc3QvdGVzdF9pdGVybGVuLnB5CmluZGV4IGJjZDBhNmYuLmFmNDQ2N2UgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcmxlbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2l0ZXJsZW4ucHkKQEAgLTIzNSw5ICsyMzUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpdCksIDApCiAKIAotCi1pZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCitkZWYgdGVzdF9tYWluKCk6CiAgICAgdW5pdHRlc3RzID0gWwogICAgICAgICBUZXN0UmVwZWF0LAogICAgICAgICBUZXN0WHJhbmdlLApAQCAtMjU1LDMgKzI1Myw2IEBACiAgICAgICAgIFRlc3RTZXFJdGVyUmV2ZXJzZWQsCiAgICAgXQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnVuaXR0ZXN0cykKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CmluZGV4IDczZjgyODguLjY4YzIzYzIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKQEAgLTQ4MCw2ICs0ODAsOCBAQAogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgbG9nZ2luZy5jb25maWcuZmlsZUNvbmZpZyhmbikKKyAgICAgICAgICAgICAgICAjY2FsbCBhZ2FpbiB0byBtYWtlIHN1cmUgY2xlYW51cCBpcyBjb3JyZWN0CisgICAgICAgICAgICAgICAgbG9nZ2luZy5jb25maWcuZmlsZUNvbmZpZyhmbikKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICB0ID0gc3lzLmV4Y19pbmZvKClbMF0KICAgICAgICAgICAgICAgICBtZXNzYWdlKHN0cih0KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCA5MTRhMjBjLi40NWRkMTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC00NjEsNyArNDYxLDcgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgVGVzdE1haWxib3guc2V0VXAoc2VsZikKLSAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICBpZiBvcy5uYW1lIGluICgnbnQnLCAnb3MyJyk6CiAgICAgICAgICAgICBzZWxmLl9ib3guY29sb24gPSAnIScKIAogICAgIGRlZiB0ZXN0X2FkZF9NTShzZWxmKToKQEAgLTUyMCw3ICs1MjAsNyBAQAogICAgICAgICAjIEluaXRpYWxpemUgYW4gZXhpc3RpbmcgbWFpbGJveAogICAgICAgICBzZWxmLnRlYXJEb3duKCkKICAgICAgICAgZm9yIHN1YmRpciBpbiAnJywgJ3RtcCcsICduZXcnLCAnY3VyJzoKLSAgICAgICAgICAgIG9zLm1rZGlyKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIpKQorICAgICAgICAgICAgb3MubWtkaXIob3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgc3ViZGlyKSkpCiAgICAgICAgIHNlbGYuX2JveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoKQogICAgICAgICBzZWxmLl9jaGVja19iYXNpY3MoZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKICAgICAgICAgc2VsZi5fYm94ID0gbWFpbGJveC5NYWlsZGlyKHNlbGYuX3BhdGgsIGZhY3Rvcnk9Tm9uZSkKQEAgLTcyMCw2ICs3MjAsMzAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRfKGNvbnRlbnRzID09IG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykucmVhZCgpKQogICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCiAKKyAgICBkZWYgdGVzdF9sb2NrX2NvbmZsaWN0KHNlbGYpOgorICAgICAgICAjIEZvcmsgb2ZmIGEgc3VicHJvY2VzcyB0aGF0IHdpbGwgbG9jayB0aGUgZmlsZSBmb3IgMiBzZWNvbmRzLAorICAgICAgICAjIHVubG9jayBpdCwgYW5kIHRoZW4gZXhpdC4KKyAgICAgICAgaWYgbm90IGhhc2F0dHIob3MsICdmb3JrJyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGlkID0gb3MuZm9yaygpCisgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgIyBJbiB0aGUgY2hpbGQsIGxvY2sgdGhlIG1haWxib3guCisgICAgICAgICAgICBzZWxmLl9ib3gubG9jaygpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDIpCisgICAgICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKKyAgICAgICAgICAgIG9zLl9leGl0KDApCisKKyAgICAgICAgIyBJbiB0aGUgcGFyZW50LCBzbGVlcCBhIGJpdCB0byBnaXZlIHRoZSBjaGlsZCB0aW1lIHRvIGFjcXVpcmUKKyAgICAgICAgIyB0aGUgbG9jay4KKyAgICAgICAgdGltZS5zbGVlcCgwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1haWxib3guRXh0ZXJuYWxDbGFzaEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9ib3gubG9jaykKKworICAgICAgICAjIFdhaXQgZm9yIGNoaWxkIHRvIGV4aXQuICBMb2NraW5nIHNob3VsZCBub3cgc3VjY2VlZC4KKyAgICAgICAgZXhpdGVkX3BpZCwgc3RhdHVzID0gb3Mud2FpdHBpZChwaWQsIDApCisgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKKyAgICAgICAgc2VsZi5fYm94LnVubG9jaygpCisKIAogY2xhc3MgVGVzdE1ib3goX1Rlc3RNYm94TU1ERik6CiAKQEAgLTE3NjEsNiArMTc4NSw3IEBACiAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VDb252ZXJzaW9uLCBUZXN0UHJveHlGaWxlLCBUZXN0UGFydGlhbEZpbGUsCiAgICAgICAgICAgICAgTWFpbGRpclRlc3RDYXNlKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQorICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldG9vbHMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0b29scy5weQppbmRleCA5NmJiYjM2Li5iMGI1YjAxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0b29scy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0b29scy5weQpAQCAtMSw3ICsxLDcgQEAKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKIAotaW1wb3J0IHN0cmluZywgU3RyaW5nSU8sIG1pbWV0b29scywgc2V0cworaW1wb3J0IHN0cmluZywgU3RyaW5nSU8sIG1pbWV0b29scwogCiBtc2d0ZXh0MSA9IG1pbWV0b29scy5NZXNzYWdlKFN0cmluZ0lPLlN0cmluZ0lPKAogIiIiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PWlzby04ODU5LTE7IGZvcm1hdD1mbG93ZWQKQEAgLTI1LDcgKzI1LDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5nZXR2YWx1ZSgpLCBzdGFydCkKIAogICAgIGRlZiB0ZXN0X2JvdW5kYXJ5KHNlbGYpOgotICAgICAgICBzID0gc2V0cy5TZXQoWyIiXSkKKyAgICAgICAgcyA9IHNldChbIiJdKQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKICAgICAgICAgICAgIG5iID0gbWltZXRvb2xzLmNob29zZV9ib3VuZGFyeSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydF8obmIgbm90IGluIHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CmluZGV4IDhjNTg0YWQuLjAxOTBjMmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CkBAIC0xLDcgKzEsNiBAQAogaW1wb3J0IG1pbWV0eXBlcwogaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgdW5pdHRlc3QKLWZyb20gc2V0cyBpbXBvcnQgU2V0CiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKQEAgLTUyLDggKzUxLDggQEAKICAgICAgICAgIyBGaXJzdCB0cnkgc3RyaWN0LiAgVXNlIGEgc2V0IGhlcmUgZm9yIHRlc3RpbmcgdGhlIHJlc3VsdHMgYmVjYXVzZSBpZgogICAgICAgICAjIHRlc3RfdXJsbGliMiBpcyBydW4gYmVmb3JlIHRlc3RfbWltZXR5cGVzLCBnbG9iYWwgc3RhdGUgaXMgbW9kaWZpZWQKICAgICAgICAgIyBzdWNoIHRoYXQgdGhlICdhbGwnIHNldCB3aWxsIGhhdmUgbW9yZSBpdGVtcyBpbiBpdC4KLSAgICAgICAgYWxsID0gU2V0KHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ3RleHQvcGxhaW4nLCBzdHJpY3Q9VHJ1ZSkpCi0gICAgICAgIHVubGVzcyhhbGwgPj0gU2V0KFsnLmJhdCcsICcuYycsICcuaCcsICcua3NoJywgJy5wbCcsICcudHh0J10pKQorICAgICAgICBhbGwgPSBzZXQoc2VsZi5kYi5ndWVzc19hbGxfZXh0ZW5zaW9ucygndGV4dC9wbGFpbicsIHN0cmljdD1UcnVlKSkKKyAgICAgICAgdW5sZXNzKGFsbCA+PSBzZXQoWycuYmF0JywgJy5jJywgJy5oJywgJy5rc2gnLCAnLnBsJywgJy50eHQnXSkpCiAgICAgICAgICMgQW5kIG5vdyBub24tc3RyaWN0CiAgICAgICAgIGFsbCA9IHNlbGYuZGIuZ3Vlc3NfYWxsX2V4dGVuc2lvbnMoJ2ltYWdlL2pwZycsIHN0cmljdD1GYWxzZSkKICAgICAgICAgYWxsLnNvcnQoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CmluZGV4IGI5Mzc3YWUuLmE2ZDMwOWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKQEAgLTEsNCArMSw0IEBACi0jIHRlc3QgZm9yIHhtbGNvcmUuZG9tLm1pbmlkb20KKyMgdGVzdCBmb3IgeG1sLmRvbS5taW5pZG9tCiAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwpAQCAtNywxMiArNywxMiBAQAogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UKIAotaW1wb3J0IHhtbGNvcmUuZG9tCi1pbXBvcnQgeG1sY29yZS5kb20ubWluaWRvbQotaW1wb3J0IHhtbGNvcmUucGFyc2Vycy5leHBhdAoraW1wb3J0IHhtbC5kb20KK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20KK2ltcG9ydCB4bWwucGFyc2Vycy5leHBhdAogCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmlkb20gaW1wb3J0IHBhcnNlLCBOb2RlLCBEb2N1bWVudCwgcGFyc2VTdHJpbmcKLWZyb20geG1sY29yZS5kb20ubWluaWRvbSBpbXBvcnQgZ2V0RE9NSW1wbGVtZW50YXRpb24KK2Zyb20geG1sLmRvbS5taW5pZG9tIGltcG9ydCBwYXJzZSwgTm9kZSwgRG9jdW1lbnQsIHBhcnNlU3RyaW5nCitmcm9tIHhtbC5kb20ubWluaWRvbSBpbXBvcnQgZ2V0RE9NSW1wbGVtZW50YXRpb24KIAogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpAQCAtMTM4LDI5ICsxMzgsMjkgQEAKICAgICB0ZXh0ID0gZG9tLmNyZWF0ZVRleHROb2RlKCd0ZXh0JykKIAogICAgIHRyeTogZG9tLmFwcGVuZENoaWxkKHRleHQpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImRvbS5hcHBlbmRDaGlsZCBkaWRuJ3QgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEVyciIKIAogICAgIGRvbS5hcHBlbmRDaGlsZChlbGVtKQogICAgIHRyeTogZG9tLmluc2VydEJlZm9yZSh0ZXh0LCBlbGVtKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJkb20uYXBwZW5kQ2hpbGQgZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKICAgICB0cnk6IGRvbS5yZXBsYWNlQ2hpbGQodGV4dCwgZWxlbSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZG9tLmFwcGVuZENoaWxkIGRpZG4ndCByYWlzZSBIaWVyYXJjaHlSZXF1ZXN0RXJyIgogCiAgICAgbm9kZW1hcCA9IGVsZW0uYXR0cmlidXRlcwogICAgIHRyeTogbm9kZW1hcC5zZXROYW1lZEl0ZW0odGV4dCkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcworICAgIGV4Y2VwdCB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnI6IHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiTmFtZWROb2RlTWFwLnNldE5hbWVkSXRlbSBkaWRuJ3QgcmFpc2UgSGllcmFyY2h5UmVxdWVzdEVyciIKIAogICAgIHRyeTogbm9kZW1hcC5zZXROYW1lZEl0ZW1OUyh0ZXh0KQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOiBwYXNzCisgICAgZXhjZXB0IHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycjogcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJOYW1lZE5vZGVNYXAuc2V0TmFtZWRJdGVtTlMgZGlkbid0IHJhaXNlIEhpZXJhcmNoeVJlcXVlc3RFcnIiCiAKQEAgLTQzOSw3ICs0MzksNyBAQAogICAgICAgICAgICAgYW5kIHBpLmZpcnN0Q2hpbGQgaXMgTm9uZQogICAgICAgICAgICAgYW5kIHBpLmxhc3RDaGlsZCBpcyBOb25lCiAgICAgICAgICAgICBhbmQgcGkubG9jYWxOYW1lIGlzIE5vbmUKLSAgICAgICAgICAgIGFuZCBwaS5uYW1lc3BhY2VVUkkgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFKQorICAgICAgICAgICAgYW5kIHBpLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSkKIAogZGVmIHRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25SZXByKCk6IHBhc3MKIApAQCAtNDU0LDcgKzQ1NCw3IEBACiAgICAgZWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50KCJleHRyYSIpCiAgICAgdHJ5OgogICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZWxlbSkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgIkZhaWxlZCB0byBjYXRjaCBleHBlY3RlZCBleGNlcHRpb24gd2hlbiIgXApAQCAtNDkxLDcgKzQ5MSw3IEBACiAgICAgY29uZmlybShhMS5pc1NhbWVOb2RlKGEyKSkKICAgICB0cnk6CiAgICAgICAgIGF0dHJzLnJlbW92ZU5hbWVkSXRlbSgiYSIpCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdEZvdW5kRXJyOgogICAgICAgICBwYXNzCiAKIGRlZiB0ZXN0UmVtb3ZlTmFtZWRJdGVtTlMoKToKQEAgLTUwMyw3ICs1MDMsNyBAQAogICAgIGNvbmZpcm0oYTEuaXNTYW1lTm9kZShhMikpCiAgICAgdHJ5OgogICAgICAgICBhdHRycy5yZW1vdmVOYW1lZEl0ZW1OUygiaHR0cDovL3htbC5weXRob24ub3JnLyIsICJiIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90Rm91bmRFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uTm90Rm91bmRFcnI6CiAgICAgICAgIHBhc3MKIAogZGVmIHRlc3RBdHRyTGlzdFZhbHVlcygpOiBwYXNzCkBAIC02ODIsNyArNjgyLDcgQEAKICAgICBkb2MyID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCiAgICAgdHJ5OgogICAgICAgICBkb2MxLmltcG9ydE5vZGUoZG9jMiwgZGVlcCkKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbih0ZXN0TmFtZSArCkBAIC03MDUsMTQgKzcwNSwxMiBAQAogICAgIGRvY3R5cGUgPSBnZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50VHlwZSgiZG9jIiwgTm9uZSwgTm9uZSkKICAgICBkb2N0eXBlLmVudGl0aWVzLl9zZXEgPSBbXQogICAgIGRvY3R5cGUubm90YXRpb25zLl9zZXEgPSBbXQotICAgIG5vdGF0aW9uID0geG1sY29yZS5kb20ubWluaWRvbS5Ob3RhdGlvbigKLSAgICAgICAgIm15LW5vdGF0aW9uIiwgTm9uZSwKLSAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ub3RhdGlvbnMvbXkiKQorICAgIG5vdGF0aW9uID0geG1sLmRvbS5taW5pZG9tLk5vdGF0aW9uKCJteS1ub3RhdGlvbiIsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9ub3RhdGlvbnMvbXkiKQogICAgIGRvY3R5cGUubm90YXRpb25zLl9zZXEuYXBwZW5kKG5vdGF0aW9uKQotICAgIGVudGl0eSA9IHhtbGNvcmUuZG9tLm1pbmlkb20uRW50aXR5KAotICAgICAgICAibXktZW50aXR5IiwgTm9uZSwKLSAgICAgICAgImh0dHA6Ly94bWwucHl0aG9uLm9yZy9lbnRpdGllcy9teSIsCi0gICAgICAgICJteS1ub3RhdGlvbiIpCisgICAgZW50aXR5ID0geG1sLmRvbS5taW5pZG9tLkVudGl0eSgibXktZW50aXR5IiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8veG1sLnB5dGhvbi5vcmcvZW50aXRpZXMvbXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15LW5vdGF0aW9uIikKICAgICBlbnRpdHkudmVyc2lvbiA9ICIxLjAiCiAgICAgZW50aXR5LmVuY29kaW5nID0gInV0Zi04IgogICAgIGVudGl0eS5hY3R1YWxFbmNvZGluZyA9ICJ1cy1hc2NpaSIKQEAgLTczMSw3ICs3MjksNyBAQAogICAgIHRhcmdldCA9IGNyZWF0ZV9kb2Nfd2l0aG91dF9kb2N0eXBlKCkKICAgICB0cnk6CiAgICAgICAgIGltcG9ydGVkID0gdGFyZ2V0LmltcG9ydE5vZGUoc3JjLmRvY3R5cGUsIDApCi0gICAgZXhjZXB0IHhtbGNvcmUuZG9tLk5vdFN1cHBvcnRlZEVycjoKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICByYWlzZSBFeGNlcHRpb24oCkBAIC03NDIsNyArNzQwLDcgQEAKICAgICB0YXJnZXQgPSBjcmVhdGVfZG9jX3dpdGhvdXRfZG9jdHlwZSgpCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnRlZCA9IHRhcmdldC5pbXBvcnROb2RlKHNyYy5kb2N0eXBlLCAxKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CisgICAgZXhjZXB0IHhtbC5kb20uTm90U3VwcG9ydGVkRXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKApAQCAtODUwLDcgKzg0OCw3IEBACiAgICAgZG9jLnVubGluaygpCiAKIGRlZiB0ZXN0U0FYMkRPTSgpOgotICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IHB1bGxkb20KKyAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KIAogICAgIHNheDJkb20gPSBwdWxsZG9tLlNBWDJET00oKQogICAgIHNheDJkb20uc3RhcnREb2N1bWVudCgpCkBAIC05NDAsMTEgKzkzOCwxMSBAQAogICAgIGF0dHIgPSBlbGVtLmF0dHJpYnV0ZXNbJ2EnXQogCiAgICAgIyBTaW1wbGUgcmVuYW1pbmcKLSAgICBhdHRyID0gZG9jLnJlbmFtZU5vZGUoYXR0ciwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYiIpCisgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYiIpCiAgICAgY29uZmlybShhdHRyLm5hbWUgPT0gImIiCiAgICAgICAgICAgICBhbmQgYXR0ci5ub2RlTmFtZSA9PSAiYiIKICAgICAgICAgICAgIGFuZCBhdHRyLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKICAgICAgICAgICAgIGFuZCBhdHRyLnByZWZpeCBpcyBOb25lCiAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImEiKSBpcyBOb25lCkBAIC05ODksMTEgKzk4NywxMSBAQAogICAgICAgICAgICAgYW5kIGF0dHJtYXBbKCJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMyIiwgImQiKV0uaXNTYW1lTm9kZShhdHRyKSkKIAogICAgICMgUmVuYW1lIGJhY2sgdG8gYSBzaW1wbGUgbm9uLU5TIG5vZGUKLSAgICBhdHRyID0gZG9jLnJlbmFtZU5vZGUoYXR0ciwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIpCisgICAgYXR0ciA9IGRvYy5yZW5hbWVOb2RlKGF0dHIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZSIpCiAgICAgY29uZmlybShhdHRyLm5hbWUgPT0gImUiCiAgICAgICAgICAgICBhbmQgYXR0ci5ub2RlTmFtZSA9PSAiZSIKICAgICAgICAgICAgIGFuZCBhdHRyLmxvY2FsTmFtZSBpcyBOb25lCi0gICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFCisgICAgICAgICAgICBhbmQgYXR0ci5uYW1lc3BhY2VVUkkgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UKICAgICAgICAgICAgIGFuZCBhdHRyLnByZWZpeCBpcyBOb25lCiAgICAgICAgICAgICBhbmQgYXR0ci52YWx1ZSA9PSAidiIKICAgICAgICAgICAgIGFuZCBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoImEiKSBpcyBOb25lCkBAIC0xMDA3LDcgKzEwMDUsNyBAQAogCiAgICAgdHJ5OgogICAgICAgICBkb2MucmVuYW1lTm9kZShhdHRyLCAiaHR0cDovL3htbC5weXRob24ub3JnL25zIiwgInhtbG5zIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5hbWVzcGFjZUVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJleHBlY3RlZCBOYW1lc3BhY2VFcnIiCkBAIC0xMDIwLDExICsxMDE4LDExIEBACiAgICAgZWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQKIAogICAgICMgU2ltcGxlIHJlbmFtaW5nCi0gICAgZWxlbSA9IGRvYy5yZW5hbWVOb2RlKGVsZW0sIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImEiKQorICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImEiKQogICAgIGNvbmZpcm0oZWxlbS50YWdOYW1lID09ICJhIgogICAgICAgICAgICAgYW5kIGVsZW0ubm9kZU5hbWUgPT0gImEiCiAgICAgICAgICAgICBhbmQgZWxlbS5sb2NhbE5hbWUgaXMgTm9uZQotICAgICAgICAgICAgYW5kIGVsZW0ubmFtZXNwYWNlVVJJID09IHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRQorICAgICAgICAgICAgYW5kIGVsZW0ubmFtZXNwYWNlVVJJID09IHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFCiAgICAgICAgICAgICBhbmQgZWxlbS5wcmVmaXggaXMgTm9uZQogICAgICAgICAgICAgYW5kIGVsZW0ub3duZXJEb2N1bWVudC5pc1NhbWVOb2RlKGRvYykpCiAKQEAgLTEwNDcsMTEgKzEwNDUsMTEgQEAKICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQogCiAgICAgIyBSZW5hbWUgYmFjayB0byBhIHNpbXBsZSBub24tTlMgbm9kZQotICAgIGVsZW0gPSBkb2MucmVuYW1lTm9kZShlbGVtLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJkIikKKyAgICBlbGVtID0gZG9jLnJlbmFtZU5vZGUoZWxlbSwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJkIikKICAgICBjb25maXJtKGVsZW0udGFnTmFtZSA9PSAiZCIKICAgICAgICAgICAgIGFuZCBlbGVtLm5vZGVOYW1lID09ICJkIgogICAgICAgICAgICAgYW5kIGVsZW0ubG9jYWxOYW1lIGlzIE5vbmUKLSAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UKKyAgICAgICAgICAgIGFuZCBlbGVtLm5hbWVzcGFjZVVSSSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRQogICAgICAgICAgICAgYW5kIGVsZW0ucHJlZml4IGlzIE5vbmUKICAgICAgICAgICAgIGFuZCBlbGVtLm93bmVyRG9jdW1lbnQuaXNTYW1lTm9kZShkb2MpKQogCkBAIC0xMDYyLDE1ICsxMDYwLDE1IEBACiAgICAgIyBNYWtlIHN1cmUgaWxsZWdhbCBOUyB1c2FnZSBpcyBkZXRlY3RlZDoKICAgICB0cnk6CiAgICAgICAgIGRvYy5yZW5hbWVOb2RlKG5vZGUsICJodHRwOi8veG1sLnB5dGhvbi5vcmcvbnMiLCAieG1sbnM6Zm9vIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyOgorICAgIGV4Y2VwdCB4bWwuZG9tLk5hbWVzcGFjZUVycjoKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIHByaW50ICJleHBlY3RlZCBOYW1lc3BhY2VFcnIiCiAKICAgICBkb2MyID0gcGFyc2VTdHJpbmcoIjxkb2MvPiIpCiAgICAgdHJ5OgotICAgICAgICBkb2MyLnJlbmFtZU5vZGUobm9kZSwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKLSAgICBleGNlcHQgeG1sY29yZS5kb20uV3JvbmdEb2N1bWVudEVycjoKKyAgICAgICAgZG9jMi5yZW5hbWVOb2RlKG5vZGUsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKKyAgICBleGNlcHQgeG1sLmRvbS5Xcm9uZ0RvY3VtZW50RXJyOgogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgcHJpbnQgImV4cGVjdGVkIFdyb25nRG9jdW1lbnRFcnIiCkBAIC0xMDc4LDEyICsxMDc2LDEyIEBACiBkZWYgdGVzdFJlbmFtZU90aGVyKCk6CiAgICAgIyBXZSBoYXZlIHRvIGNyZWF0ZSBhIGNvbW1lbnQgbm9kZSBleHBsaWNpdGx5IHNpbmNlIG5vdCBhbGwgRE9NCiAgICAgIyBidWlsZGVycyB1c2VkIHdpdGggbWluaWRvbSBhZGQgY29tbWVudHMgdG8gdGhlIERPTS4KLSAgICBkb2MgPSB4bWxjb3JlLmRvbS5taW5pZG9tLmdldERPTUltcGxlbWVudGF0aW9uKCkuY3JlYXRlRG9jdW1lbnQoCi0gICAgICAgIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiLCBOb25lKQorICAgIGRvYyA9IHhtbC5kb20ubWluaWRvbS5nZXRET01JbXBsZW1lbnRhdGlvbigpLmNyZWF0ZURvY3VtZW50KAorICAgICAgICB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImUiLCBOb25lKQogICAgIG5vZGUgPSBkb2MuY3JlYXRlQ29tbWVudCgiY29tbWVudCIpCiAgICAgdHJ5OgotICAgICAgICBkb2MucmVuYW1lTm9kZShub2RlLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJmb28iKQotICAgIGV4Y2VwdCB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CisgICAgICAgIGRvYy5yZW5hbWVOb2RlKG5vZGUsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiZm9vIikKKyAgICBleGNlcHQgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnI6CiAgICAgICAgIHBhc3MKICAgICBlbHNlOgogICAgICAgICBwcmludCAiZXhwZWN0ZWQgTm90U3VwcG9ydGVkRXJyIHdoZW4gcmVuYW1pbmcgY29tbWVudCBub2RlIgpAQCAtMTE5NCwxMyArMTE5MiwxMyBAQAogICAgICMgc2luY2UgZWFjaCBzdXBwb3J0cyBhIGRpZmZlcmVudCBsZXZlbCBvZiBEVEQgaW5mb3JtYXRpb24uCiAgICAgdCA9IGVsZW0uc2NoZW1hVHlwZQogICAgIGNvbmZpcm0odC5uYW1lIGlzIE5vbmUKLSAgICAgICAgICAgIGFuZCB0Lm5hbWVzcGFjZSA9PSB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCisgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UpCiAgICAgbmFtZXMgPSAiaWQgbm90aWQgdGV4dCBlbnVtIHJlZiByZWZzIGVudCBlbnRzIG5tIG5tcyIuc3BsaXQoKQogICAgIGZvciBuYW1lIGluIG5hbWVzOgogICAgICAgICBhID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpCiAgICAgICAgIHQgPSBhLnNjaGVtYVR5cGUKICAgICAgICAgY29uZmlybShoYXNhdHRyKHQsICJuYW1lIikKLSAgICAgICAgICAgICAgICBhbmQgdC5uYW1lc3BhY2UgPT0geG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFKQorICAgICAgICAgICAgICAgIGFuZCB0Lm5hbWVzcGFjZSA9PSB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSkKIAogZGVmIHRlc3RTZXRJZEF0dHJpYnV0ZSgpOgogICAgIGRvYyA9IHBhcnNlU3RyaW5nKCI8ZG9jIGExPSd2JyBhMj0ndycvPiIpCkBAIC0xMjI5LDcgKzEyMjcsNyBAQAogICAgICAgICAgICAgYW5kIGEyLmlzSWQKICAgICAgICAgICAgIGFuZCBub3QgYTMuaXNJZCkKICAgICAjIHJlbmFtaW5nIGFuIGF0dHJpYnV0ZSBzaG91bGQgbm90IGFmZmVjdCBpdHMgSUQtbmVzczoKLSAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sY29yZS5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQorICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWwuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKICAgICBjb25maXJtKGUuaXNTYW1lTm9kZShkb2MuZ2V0RWxlbWVudEJ5SWQoInciKSkKICAgICAgICAgICAgIGFuZCBhMi5pc0lkKQogCkBAIC0xMjY1LDcgKzEyNjMsNyBAQAogICAgIGNvbmZpcm0obm90IGEzLmlzSWQpCiAgICAgY29uZmlybShkb2MuZ2V0RWxlbWVudEJ5SWQoInYiKSBpcyBOb25lKQogICAgICMgcmVuYW1pbmcgYW4gYXR0cmlidXRlIHNob3VsZCBub3QgYWZmZWN0IGl0cyBJRC1uZXNzOgotICAgIGRvYy5yZW5hbWVOb2RlKGEyLCB4bWxjb3JlLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCisgICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbC5kb20uRU1QVFlfTkFNRVNQQUNFLCAiYW4iKQogICAgIGNvbmZpcm0oZS5pc1NhbWVOb2RlKGRvYy5nZXRFbGVtZW50QnlJZCgidyIpKQogICAgICAgICAgICAgYW5kIGEyLmlzSWQpCiAKQEAgLTEzMDEsNyArMTI5OSw3IEBACiAgICAgY29uZmlybShub3QgYTMuaXNJZCkKICAgICBjb25maXJtKGRvYy5nZXRFbGVtZW50QnlJZCgidiIpIGlzIE5vbmUpCiAgICAgIyByZW5hbWluZyBhbiBhdHRyaWJ1dGUgc2hvdWxkIG5vdCBhZmZlY3QgaXRzIElELW5lc3M6Ci0gICAgZG9jLnJlbmFtZU5vZGUoYTIsIHhtbGNvcmUuZG9tLkVNUFRZX05BTUVTUEFDRSwgImFuIikKKyAgICBkb2MucmVuYW1lTm9kZShhMiwgeG1sLmRvbS5FTVBUWV9OQU1FU1BBQ0UsICJhbiIpCiAgICAgY29uZmlybShlLmlzU2FtZU5vZGUoZG9jLmdldEVsZW1lbnRCeUlkKCJ3IikpCiAgICAgICAgICAgICBhbmQgYTIuaXNJZCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weSBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKaW5kZXggMjc2YjlhZi4uMzk3ZWJlYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CkBAIC02LDE3ICs2LDM3IEBACiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAotaW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzLCBzeXMKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRFU1RGTgoraW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzLCBzeXMsIG9zCisKK0FMTF9DSktFTkNPRElOR1MgPSBbCisjIF9jb2RlY3NfY24KKyAgICAnZ2IyMzEyJywgJ2diaycsICdnYjE4MDMwJywgJ2h6JywKKyMgX2NvZGVjc19oaworICAgICdiaWc1aGtzY3MnLAorIyBfY29kZWNzX2pwCisgICAgJ2NwOTMyJywgJ3NoaWZ0X2ppcycsICdldWNfanAnLCAnZXVjX2ppc3gwMjEzJywgJ3NoaWZ0X2ppc3gwMjEzJywKKyAgICAnZXVjX2ppc18yMDA0JywgJ3NoaWZ0X2ppc18yMDA0JywKKyMgX2NvZGVjc19rcgorICAgICdjcDk0OScsICdldWNfa3InLCAnam9oYWInLAorIyBfY29kZWNzX3R3CisgICAgJ2JpZzUnLCAnY3A5NTAnLAorIyBfY29kZWNzX2lzbzIwMjIKKyAgICAnaXNvMjAyMl9qcCcsICdpc28yMDIyX2pwXzEnLCAnaXNvMjAyMl9qcF8yJywgJ2lzbzIwMjJfanBfMjAwNCcsCisgICAgJ2lzbzIwMjJfanBfMycsICdpc28yMDIyX2pwX2V4dCcsICdpc28yMDIyX2tyJywKK10KIAogY2xhc3MgVGVzdF9NdWx0aWJ5dGVDb2RlYyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9udWxsY29kaW5nKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZSgnZ2IxODAzMCcpLCB1JycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnJywgJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5lbmNvZGUoJ2diMTgwMzAnKSwgJycpCisgICAgICAgIGZvciBlbmMgaW4gQUxMX0NKS0VOQ09ESU5HUzoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuZGVjb2RlKGVuYyksIHUnJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnJywgZW5jKSwgdScnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1JycuZW5jb2RlKGVuYyksICcnKQogCiAgICAgZGVmIHRlc3Rfc3RyX2RlY29kZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjZCcuZW5jb2RlKCdnYjE4MDMwJyksICdhYmNkJykKKyAgICAgICAgZm9yIGVuYyBpbiBBTExfQ0pLRU5DT0RJTkdTOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgnYWJjZCcuZW5jb2RlKGVuYyksICdhYmNkJykKIAogICAgIGRlZiB0ZXN0X2Vycm9yY2FsbGJhY2tfbG9uZ2luZGV4KHNlbGYpOgogICAgICAgICBkZWMgPSBjb2RlY3MuZ2V0ZGVjb2RlcignZXVjLWtyJykKQEAgLTI1LDYgKzQ1LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGRlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FwcGxlXHg5MmhhbVx4OTNzcGFtJywgJ3Rlc3QuY2prdGVzdCcpCiAKKyAgICBkZWYgdGVzdF9jb2RpbmdzcGVjKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3IgZW5jIGluIEFMTF9DSktFTkNPRElOR1M6CisgICAgICAgICAgICAgICAgcHJpbnQgPj4gb3BlbihURVNURk4sICd3JyksICcjIGNvZGluZzonLCBlbmMKKyAgICAgICAgICAgICAgICBleGVjIG9wZW4oVEVTVEZOKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MudW5saW5rKFRFU1RGTikKKwogY2xhc3MgVGVzdF9JbmNyZW1lbnRhbEVuY29kZXIodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3Rfc3RhdGVsZXNzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weSBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKaW5kZXggNzlkZjkwNi4uNDU4MmZhNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CkBAIC0xNSw3ICsxNSw3IEBACiBpbXBvcnQgdHlwZXMKIGltcG9ydCB1bml0dGVzdAogCi1mcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHBwcmludCBpbXBvcnQgcHByaW50CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCkBAIC0xNjQsMTUgKzE2NCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfZXJyb3I9Tm9uZSk6CiAgICAgICAgICIiIkFzc2VydCB0aGUgcGFyc2VyIHByaW50cyB0aGUgZXhwZWN0ZWQgb3V0cHV0IG9uIHN0ZG91dC4iIiIKICAgICAgICAgc2F2ZV9zdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGVuY29kaW5nID0gZ2V0YXR0cihzYXZlX3N0ZG91dCwgJ2VuY29kaW5nJywgTm9uZSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAgICAgaWYgZW5jb2Rpbmc6CisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZW5jb2RpbmcgPSBlbmNvZGluZwogICAgICAgICAgICAgICAgIHNlbGYucGFyc2VyLnBhcnNlX2FyZ3MoY21kbGluZV9hcmdzKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0LmdldHZhbHVlKCkKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAogICAgICAgICBleGNlcHQgSW50ZXJjZXB0ZWRFcnJvciwgZXJyOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgICAgIHR5cGUob3V0cHV0KSBpcyB0eXBlcy5TdHJpbmdUeXBlLAorICAgICAgICAgICAgICAgICJleHBlY3RlZCBvdXRwdXQgdG8gYmUgYW4gb3JkaW5hcnkgc3RyaW5nLCBub3QgJXIiCisgICAgICAgICAgICAgICAgJSB0eXBlKG91dHB1dCkpCisKICAgICAgICAgICAgIGlmIG91dHB1dCAhPSBleHBlY3RlZF9vdXRwdXQ6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJleHBlY3RlZDogXG4nJydcbiIgKyBleHBlY3RlZF9vdXRwdXQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAiJycnXG5idXQgZ290IFxuJycnXG4iICsgb3V0cHV0ICsgIicnJyIpCkBAIC0xNDUyLDEwICsxNDYwLDI2IEBACiAgICAgICAgICAgICBtYWtlX29wdGlvbigiLS1mb28iLCBhY3Rpb249ImFwcGVuZCIsIHR5cGU9InN0cmluZyIsIGRlc3Q9J2ZvbycsCiAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJzdG9yZSBGT08gaW4gdGhlIGZvbyBsaXN0IGZvciBsYXRlciBmb29pbmciKSwKICAgICAgICAgICAgIF0KKworICAgICAgICAjIFdlIG5lZWQgdG8gc2V0IENPTFVNTlMgZm9yIHRoZSBPcHRpb25QYXJzZXIgY29uc3RydWN0b3IsIGJ1dAorICAgICAgICAjIHdlIG11c3QgcmVzdG9yZSBpdHMgb3JpZ2luYWwgdmFsdWUgLS0gb3RoZXJ3aXNlLCB0aGlzIHRlc3QKKyAgICAgICAgIyBzY3Jld3MgdGhpbmdzIHVwIGZvciBvdGhlciB0ZXN0cyB3aGVuIGl0J3MgcGFydCBvZiB0aGUgUHl0aG9uCisgICAgICAgICMgdGVzdCBzdWl0ZS4KKyAgICAgICAgb3JpZ19jb2x1bW5zID0gb3MuZW52aXJvbi5nZXQoJ0NPTFVNTlMnKQogICAgICAgICBvcy5lbnZpcm9uWydDT0xVTU5TJ10gPSBzdHIoY29sdW1ucykKLSAgICAgICAgcmV0dXJuIEludGVyY2VwdGluZ09wdGlvblBhcnNlcihvcHRpb25fbGlzdD1vcHRpb25zKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gSW50ZXJjZXB0aW5nT3B0aW9uUGFyc2VyKG9wdGlvbl9saXN0PW9wdGlvbnMpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBvcmlnX2NvbHVtbnMgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBkZWwgb3MuZW52aXJvblsnQ09MVU1OUyddCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG9zLmVudmlyb25bJ0NPTFVNTlMnXSA9IG9yaWdfY29sdW1ucwogCiAgICAgZGVmIGFzc2VydEhlbHBFcXVhbHMoc2VsZiwgZXhwZWN0ZWRfb3V0cHV0KToKKyAgICAgICAgaWYgdHlwZShleHBlY3RlZF9vdXRwdXQpIGlzIHR5cGVzLlVuaWNvZGVUeXBlOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzZWxmLnBhcnNlci5fZ2V0X2VuY29kaW5nKHN5cy5zdGRvdXQpCisgICAgICAgICAgICBleHBlY3RlZF9vdXRwdXQgPSBleHBlY3RlZF9vdXRwdXQuZW5jb2RlKGVuY29kaW5nLCAicmVwbGFjZSIpCisKICAgICAgICAgc2F2ZV9hcmd2ID0gc3lzLmFyZ3ZbOl0KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBNYWtlIG9wdHBhcnNlIGJlbGlldmUgYmFyLnB5IGlzIGJlaW5nIGV4ZWN1dGVkLgpAQCAtMTQ4Niw2ICsxNTEwLDI3IEBACiAgICAgICAgIHNlbGYucGFyc2VyID0gc2VsZi5tYWtlX3BhcnNlcig2MCkKICAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKF9leHBlY3RlZF9oZWxwX3Nob3J0X2xpbmVzKQogCisgICAgZGVmIHRlc3RfaGVscF91bmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLnBhcnNlciA9IEludGVyY2VwdGluZ09wdGlvblBhcnNlcih1c2FnZT1TVVBQUkVTU19VU0FHRSkKKyAgICAgICAgc2VsZi5wYXJzZXIuYWRkX29wdGlvbigiLWEiLCBhY3Rpb249InN0b3JlX3RydWUiLCBoZWxwPXUib2xcdTAwRTkhIikKKyAgICAgICAgZXhwZWN0ID0gdSIiIlwKK09wdGlvbnM6CisgIC1oLCAtLWhlbHAgIHNob3cgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQKKyAgLWEgICAgICAgICAgb2xcdTAwRTkhCisiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKGV4cGVjdCkKKworICAgIGRlZiB0ZXN0X2hlbHBfdW5pY29kZV9kZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5wYXJzZXIgPSBJbnRlcmNlcHRpbmdPcHRpb25QYXJzZXIodXNhZ2U9U1VQUFJFU1NfVVNBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXUib2xcdTAwRTkhIikKKyAgICAgICAgZXhwZWN0ID0gdSIiIlwKK29sXHUwMEU5IQorCitPcHRpb25zOgorICAtaCwgLS1oZWxwICBzaG93IHRoaXMgaGVscCBtZXNzYWdlIGFuZCBleGl0CisiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRIZWxwRXF1YWxzKGV4cGVjdCkKKwogICAgIGRlZiB0ZXN0X2hlbHBfZGVzY3JpcHRpb25fZ3JvdXBzKHNlbGYpOgogICAgICAgICBzZWxmLnBhcnNlci5zZXRfZGVzY3JpcHRpb24oCiAgICAgICAgICAgICAiVGhpcyBpcyB0aGUgcHJvZ3JhbSBkZXNjcmlwdGlvbiBmb3IgJXByb2cuICAlcHJvZyBoYXMgIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcy5weSBiL0xpYi90ZXN0L3Rlc3Rfb3MucHkKaW5kZXggZmZjOTQyMC4uOTQ5Nzc3NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zLnB5CkBAIC0xMSw2ICsxMSwxOSBAQAogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0ZW1wbmFtIiwgUnVudGltZVdhcm5pbmcsIF9fbmFtZV9fKQogd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICJ0bXBuYW0iLCBSdW50aW1lV2FybmluZywgX19uYW1lX18pCiAKKyMgVGVzdHMgY3JlYXRpbmcgVEVTVEZOCitjbGFzcyBGaWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHModGVzdF9zdXBwb3J0LlRFU1RGTik6CisgICAgICAgICAgICBvcy51bmxpbmsodGVzdF9zdXBwb3J0LlRFU1RGTikKKyAgICB0ZWFyRG93biA9IHNldFVwCisKKyAgICBkZWYgdGVzdF9hY2Nlc3Moc2VsZik6CisgICAgICAgIGYgPSBvcy5vcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLk9fQ1JFQVR8b3MuT19SRFdSKQorICAgICAgICBvcy5jbG9zZShmKQorICAgICAgICBzZWxmLmFzc2VydF8ob3MuYWNjZXNzKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLldfT0spKQorCisKIGNsYXNzIFRlbXBvcmFyeUZpbGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLmZpbGVzID0gW10KQEAgLTM5Myw2ICs0MDYsNyBAQAogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgKKyAgICAgICAgRmlsZVRlc3RzLAogICAgICAgICBUZW1wb3JhcnlGaWxlVGVzdHMsCiAgICAgICAgIFN0YXRBdHRyaWJ1dGVUZXN0cywKICAgICAgICAgRW52aXJvblRlc3RzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weSBiL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKaW5kZXggODgxMDUxNi4uNTg2OGVhNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CkBAIC00MCw2ICs0MCwxMCBAQAogICAgIGRhdGEgPSBhdWRpb29wLnVsYXcybGluKGRhdGEsIDIpCiAgICAgcmV0dXJuIChkYXRhLCByYXRlLCAxNiwgbmNoYW5uZWxzKQogCisjIHZlcnNpb24gb2YgYXNzZXJ0IHRoYXQgc3RpbGwgd29ya3Mgd2l0aCAtTworZGVmIF9hc3NlcnQoZXhwciwgbWVzc2FnZT1Ob25lKToKKyAgICBpZiBub3QgZXhwcjoKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IobWVzc2FnZSBvciAiYXNzZXJ0aW9uIGZhaWxlZCIpCiAKIGRlZiBwbGF5X3NvdW5kX2ZpbGUoZGF0YSwgcmF0ZSwgc3NpemUsIG5jaGFubmVscyk6CiAgICAgdHJ5OgpAQCAtNTcsOSArNjEsOSBAQAogICAgIGRzcC5maWxlbm8oKQogCiAgICAgIyBNYWtlIHN1cmUgdGhlIHJlYWQtb25seSBhdHRyaWJ1dGVzIHdvcmsuCi0gICAgYXNzZXJ0IGRzcC5jbG9zZWQgaXMgRmFsc2UsICJkc3AuY2xvc2VkIGlzIG5vdCBGYWxzZSIKLSAgICBhc3NlcnQgZHNwLm5hbWUgPT0gIi9kZXYvZHNwIgotICAgIGFzc2VydCBkc3AubW9kZSA9PSAndycsICJiYWQgZHNwLm1vZGU6ICVyIiAlIGRzcC5tb2RlCisgICAgX2Fzc2VydChkc3AuY2xvc2VkIGlzIEZhbHNlLCAiZHNwLmNsb3NlZCBpcyBub3QgRmFsc2UiKQorICAgIF9hc3NlcnQoZHNwLm5hbWUgPT0gIi9kZXYvZHNwIikKKyAgICBfYXNzZXJ0KGRzcC5tb2RlID09ICd3JywgImJhZCBkc3AubW9kZTogJXIiICUgZHNwLm1vZGUpCiAKICAgICAjIEFuZCBtYWtlIHN1cmUgdGhleSdyZSByZWFsbHkgcmVhZC1vbmx5LgogICAgIGZvciBhdHRyIGluICgnY2xvc2VkJywgJ25hbWUnLCAnbW9kZScpOgpAQCAtNjksMTQgKzczLDIzIEBACiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKKyAgICAjIENvbXB1dGUgZXhwZWN0ZWQgcnVubmluZyB0aW1lIG9mIHNvdW5kIHNhbXBsZSAoaW4gc2Vjb25kcykuCisgICAgZXhwZWN0ZWRfdGltZSA9IGZsb2F0KGxlbihkYXRhKSkgLyAoc3NpemUvOCkgLyBuY2hhbm5lbHMgLyByYXRlCisKICAgICAjIHNldCBwYXJhbWV0ZXJzIGJhc2VkIG9uIC5hdSBmaWxlIGhlYWRlcnMKICAgICBkc3Auc2V0cGFyYW1ldGVycyhBRk1UX1MxNl9ORSwgbmNoYW5uZWxzLCByYXRlKQorICAgIHByaW50ICgicGxheWluZyB0ZXN0IHNvdW5kIGZpbGUgKGV4cGVjdGVkIHJ1bm5pbmcgdGltZTogJS4yZiBzZWMpIgorICAgICAgICAgICAlIGV4cGVjdGVkX3RpbWUpCiAgICAgdDEgPSB0aW1lLnRpbWUoKQotICAgIHByaW50ICJwbGF5aW5nIHRlc3Qgc291bmQgZmlsZS4uLiIKICAgICBkc3Aud3JpdGUoZGF0YSkKICAgICBkc3AuY2xvc2UoKQogICAgIHQyID0gdGltZS50aW1lKCkKLSAgICBwcmludCAiZWxhcHNlZCB0aW1lOiAlLjFmIHNlYyIgJSAodDItdDEpCisgICAgZWxhcHNlZF90aW1lID0gdDIgLSB0MQorCisgICAgcGVyY2VudF9kaWZmID0gKGFicyhlbGFwc2VkX3RpbWUgLSBleHBlY3RlZF90aW1lKSAvIGV4cGVjdGVkX3RpbWUpICogMTAwCisgICAgX2Fzc2VydChwZXJjZW50X2RpZmYgPD0gMTAuMCwgXAorICAgICAgICAgICAgKCJlbGFwc2VkIHRpbWUgKCUuMmYgc2VjKSA+IDEwJSUgb2ZmIG9mIGV4cGVjdGVkIHRpbWUgKCUuMmYgc2VjKSIKKyAgICAgICAgICAgICAlIChlbGFwc2VkX3RpbWUsIGV4cGVjdGVkX3RpbWUpKSkKIAogZGVmIHRlc3Rfc2V0cGFyYW1ldGVycyhkc3ApOgogICAgICMgVHdvIGNvbmZpZ3VyYXRpb25zIGZvciB0ZXN0aW5nOgpAQCAtMTAxLDExICsxMTQsMTEgQEAKICAgICAjIHNldHBhcmFtZXRlcnMoKSBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhpcyBjb25maWd1cmF0aW9uIGluCiAgICAgIyBlaXRoZXIgc3RyaWN0IG9yIG5vbi1zdHJpY3QgbW9kZS4KICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKLSAgICBhc3NlcnQgcmVzdWx0ID09IChmbXQsIGNoYW5uZWxzLCByYXRlKSwgXAotICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnICsgcmVzdWx0KQorICAgIF9hc3NlcnQocmVzdWx0ID09IChmbXQsIGNoYW5uZWxzLCByYXRlKSwKKyAgICAgICAgICAgICJzZXRwYXJhbWV0ZXJzJXI6IHJldHVybmVkICVyIiAlIChjb25maWcsIHJlc3VsdCkpCiAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgVHJ1ZSkKLSAgICBhc3NlcnQgcmVzdWx0ID09IChmbXQsIGNoYW5uZWxzLCByYXRlKSwgXAotICAgICAgICAgICAic2V0cGFyYW1ldGVycyVyOiByZXR1cm5lZCAlciIgJSAoY29uZmlnICsgcmVzdWx0KQorICAgIF9hc3NlcnQocmVzdWx0ID09IChmbXQsIGNoYW5uZWxzLCByYXRlKSwKKyAgICAgICAgICAgICJzZXRwYXJhbWV0ZXJzJXI6IHJldHVybmVkICVyIiAlIChjb25maWcsIHJlc3VsdCkpCiAKIGRlZiB0ZXN0X2JhZF9zZXRwYXJhbWV0ZXJzKGRzcCk6CiAKQEAgLTEyMyw4ICsxMzYsOCBAQAogICAgICAgICAgICAgICAgICAgXToKICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gY29uZmlnCiAgICAgICAgIHJlc3VsdCA9IGRzcC5zZXRwYXJhbWV0ZXJzKGZtdCwgY2hhbm5lbHMsIHJhdGUsIEZhbHNlKQotICAgICAgICBhc3NlcnQgcmVzdWx0ICE9IGNvbmZpZywgXAotICAgICAgICAgICAgICAgInNldHBhcmFtZXRlcnM6IHVuZXhwZWN0ZWRseSBnb3QgcmVxdWVzdGVkIGNvbmZpZ3VyYXRpb24iCisgICAgICAgIF9hc3NlcnQocmVzdWx0ICE9IGNvbmZpZywKKyAgICAgICAgICAgICAgICAic2V0cGFyYW1ldGVyczogdW5leHBlY3RlZGx5IGdvdCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiIpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVzdWx0ID0gZHNwLnNldHBhcmFtZXRlcnMoZm10LCBjaGFubmVscywgcmF0ZSwgVHJ1ZSkKQEAgLTE0NSw2ICsxNTgsNiBAQAogICAgICAgICAjdGVzdF9iYWRfc2V0cGFyYW1ldGVycyhkc3ApCiAgICAgZmluYWxseToKICAgICAgICAgZHNwLmNsb3NlKCkKLSAgICAgICAgYXNzZXJ0IGRzcC5jbG9zZWQgaXMgVHJ1ZSwgImRzcC5jbG9zZWQgaXMgbm90IFRydWUiCisgICAgICAgIF9hc3NlcnQoZHNwLmNsb3NlZCBpcyBUcnVlLCAiZHNwLmNsb3NlZCBpcyBub3QgVHJ1ZSIpCiAKIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAyOTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDI5Mi5weQppbmRleCAyYTQzNTNhLi5kMTEwMGVhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDI5Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDI5Mi5weQpAQCAtNTgsNiArNTgsMTMgQEAKICAgICAgICAgcyA9IFRlbXBsYXRlKCd0aW0gaGFzIGVhdGVuICR7Y291bnR9IGJhZ3Mgb2YgaGFtIHRvZGF5JykKICAgICAgICAgZXEocy5zdWJzdGl0dXRlKGQpLCAndGltIGhhcyBlYXRlbiA3IGJhZ3Mgb2YgaGFtIHRvZGF5JykKIAorICAgIGRlZiB0ZXN0X3R1cGxlYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSBUZW1wbGF0ZSgnJHdobyBhdGUgJHttZWFsfScpCisgICAgICAgIGQgPSBkaWN0KHdobz0oJ3RpbScsICdmcmVkJyksIG1lYWw9KCdoYW0nLCAna3VuZyBwYW8nKSkKKyAgICAgICAgZXEocy5zdWJzdGl0dXRlKGQpLCAiKCd0aW0nLCAnZnJlZCcpIGF0ZSAoJ2hhbScsICdrdW5nIHBhbycpIikKKyAgICAgICAgZXEocy5zYWZlX3N1YnN0aXR1dGUoZCksICIoJ3RpbScsICdmcmVkJykgYXRlICgnaGFtJywgJ2t1bmcgcGFvJykiKQorCiAgICAgZGVmIHRlc3RfU2FmZVRlbXBsYXRlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgcyA9IFRlbXBsYXRlKCckd2hvIGxpa2VzICR7d2hhdH0gZm9yICR7bWVhbH0nKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3Blbi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wZW4ucHkKaW5kZXggMmI2ODdhZC4uZmJmNWUwNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3Blbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGVuLnB5CkBAIC02LDcgKzYsNyBAQAogCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcmVhcF9jaGlsZHJlbgogZnJvbSBvcyBpbXBvcnQgcG9wZW4KIAogIyBUZXN0IHRoYXQgY29tbWFuZC1saW5lcyBnZXQgZG93biBhcyB3ZSBleHBlY3QuCkBAIC0zNSw1ICszNSw2IEBACiBkZWYgbWFpbigpOgogICAgIHByaW50ICJUZXN0IHBvcGVuOiIKICAgICBfdGVzdF9jb21tYW5kbGluZSgpCisgICAgcmVhcF9jaGlsZHJlbigpCiAKIG1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3BlbjIucHkgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQppbmRleCA0ZGIzY2QxLi4yZDU0ZWIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weQpAQCAtNSw3ICs1LDcgQEAKIAogaW1wb3J0IG9zCiBpbXBvcnQgc3lzCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJlYXBfY2hpbGRyZW4KIAogIyBwb3BlbjIgY29udGFpbnMgaXRzIG93biB0ZXN0aW5nIHJvdXRpbmUKICMgd2hpY2ggaXMgZXNwZWNpYWxseSB1c2VmdWwgdG8gc2VlIGlmIG9wZW4gZmlsZXMKQEAgLTc1LDMgKzc1LDQgQEAKIAogbWFpbigpCiBfdGVzdCgpCityZWFwX2NoaWxkcmVuKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weSBiL0xpYi90ZXN0L3Rlc3RfcHlleHBhdC5weQppbmRleCBhOWE1ZThmLi4wNjk4ODE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5ZXhwYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWV4cGF0LnB5CkBAIC0zNjUsMyArMzY1LDI0IEBACiAgIDxjLz4KICA8L2I+CiA8L2E+JycnLCAxKQorCisKK2RlZiB0ZXN0X3BhcnNlX29ubHlfeG1sX2RhdGEoKToKKyAgICAjIGh0dHA6Ly9weXRob24ub3JnL3NmLzEyOTY0MzMKKyAgICAjCisgICAgeG1sID0gIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J2lzbzg4NTknPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMjUpCisgICAgIyB0aGlzIG9uZSBkb2Vzbid0IGNyYXNoCisgICAgI3htbCA9ICI8P3htbCB2ZXJzaW9uPScxLjAnPz48cz4lczwvcz4iICUgKCdhJyAqIDEwMDAwKQorCisgICAgZGVmIGhhbmRsZXIodGV4dCk6CisgICAgICAgIHJhaXNlIEV4Y2VwdGlvbgorCisgICAgcGFyc2VyID0gZXhwYXQuUGFyc2VyQ3JlYXRlKCkKKyAgICBwYXJzZXIuQ2hhcmFjdGVyRGF0YUhhbmRsZXIgPSBoYW5kbGVyCisKKyAgICB0cnk6CisgICAgICAgIHBhcnNlci5QYXJzZSh4bWwpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKK3Rlc3RfcGFyc2Vfb25seV94bWxfZGF0YSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NheC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CmluZGV4IGRlZDgxZmIuLmFmNGM3ZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5CkBAIC0xLDE3ICsxLDE3IEBACiAjIHJlZ3Jlc3Npb24gdGVzdCBmb3IgU0FYIDIuMCAgICAgICAgICAgIC0qLSBjb2Rpbmc6IGlzby04ODU5LTEgLSotCiAjICRJZCQKIAotZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIsIENvbnRlbnRIYW5kbGVyLCBcCi0gICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgorZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlciwgQ29udGVudEhhbmRsZXIsIFwKKyAgICAgICAgICAgICAgICAgICAgU0FYRXhjZXB0aW9uLCBTQVhSZWFkZXJOb3RBdmFpbGFibGUsIFNBWFBhcnNlRXhjZXB0aW9uCiB0cnk6CiAgICAgbWFrZV9wYXJzZXIoKQogZXhjZXB0IFNBWFJlYWRlck5vdEF2YWlsYWJsZToKICAgICAjIGRvbid0IHRyeSB0byB0ZXN0IHRoaXMgbW9kdWxlIGlmIHdlIGNhbm5vdCBjcmVhdGUgYSBwYXJzZXIKICAgICByYWlzZSBJbXBvcnRFcnJvcigibm8gWE1MIHBhcnNlcnMgYXZhaWxhYmxlIikKLWZyb20geG1sY29yZS5zYXguc2F4dXRpbHMgaW1wb3J0IFhNTEdlbmVyYXRvciwgZXNjYXBlLCB1bmVzY2FwZSwgcXVvdGVhdHRyLCBcCi0gICAgIFhNTEZpbHRlckJhc2UKLWZyb20geG1sY29yZS5zYXguZXhwYXRyZWFkZXIgaW1wb3J0IGNyZWF0ZV9wYXJzZXIKLWZyb20geG1sY29yZS5zYXgueG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZSwgQXR0cmlidXRlc0ltcGwsIEF0dHJpYnV0ZXNOU0ltcGwKK2Zyb20geG1sLnNheC5zYXh1dGlscyBpbXBvcnQgWE1MR2VuZXJhdG9yLCBlc2NhcGUsIHVuZXNjYXBlLCBxdW90ZWF0dHIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MRmlsdGVyQmFzZQorZnJvbSB4bWwuc2F4LmV4cGF0cmVhZGVyIGltcG9ydCBjcmVhdGVfcGFyc2VyCitmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZSwgQXR0cmlidXRlc0ltcGwsIEF0dHJpYnV0ZXNOU0ltcGwKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlLCBUZXN0RmFpbGVkLCBmaW5kZmlsZQogaW1wb3J0IG9zCkBAIC0zNiwxNyArMzYsMTcgQEAKICAgICAgICAgIyBDcmVhdGluZyBwYXJzZXJzIHNldmVyYWwgdGltZXMgaW4gYSByb3cgc2hvdWxkIHN1Y2NlZWQuCiAgICAgICAgICMgVGVzdGluZyB0aGlzIGJlY2F1c2UgdGhlcmUgaGF2ZSBiZWVuIGZhaWx1cmVzIG9mIHRoaXMga2luZAogICAgICAgICAjIGJlZm9yZS4KLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKLSAgICAgICAgZnJvbSB4bWxjb3JlLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgICAgICBmcm9tIHhtbGNvcmUuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgorICAgICAgICBmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCi0gICAgICAgIGZyb20geG1sY29yZS5zYXggaW1wb3J0IG1ha2VfcGFyc2VyCisgICAgICAgIGZyb20geG1sLnNheCBpbXBvcnQgbWFrZV9wYXJzZXIKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKICAgICBleGNlcHQ6CiAgICAgICAgIHJldHVybiAwCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICB0cnk6CiAgICAgICAgICMgQ3JlYXRpbmcgYSBwYXJzZXIgc2hvdWxkIHN1Y2NlZWQgLSBpdCBzaG91bGQgZmFsbCBiYWNrCiAgICAgICAgICMgdG8gdGhlIGV4cGF0cmVhZGVyCi0gICAgICAgIHAgPSBtYWtlX3BhcnNlcihbJ3htbGNvcmUucGFyc2Vycy5ub19zdWNoX3BhcnNlciddKQorICAgICAgICBwID0gbWFrZV9wYXJzZXIoWyd4bWwucGFyc2Vycy5ub19zdWNoX3BhcnNlciddKQogICAgIGV4Y2VwdDoKICAgICAgICAgcmV0dXJuIDAKICAgICBlbHNlOgpAQCAtMTc1LDExICsxNzUsMTQgQEAKICAgICBnZW4uZW5kRWxlbWVudCgiZSIpCiAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICInXCIifSkKICAgICBnZW4uZW5kRWxlbWVudCgiZSIpCisgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICJcblxyXHQifSkKKyAgICBnZW4uZW5kRWxlbWVudCgiZSIpCiAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICAgZ2VuLmVuZERvY3VtZW50KCkKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCBcCi0gICAgICAgICAgICsgIjxkb2MgYT0nXCInPjxlIGE9XCInXCI+PC9lPjxlIGE9XCInJnF1b3Q7XCI+PC9lPjwvZG9jPiIKKyAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAoIjxkb2MgYT0nXCInPjxlIGE9XCInXCI+PC9lPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxlIGE9XCInJnF1b3Q7XCI+PC9lPiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxlIGE9XCImIzEwOyYjMTM7JiM5O1wiPjwvZT48L2RvYz4iKQogCiBkZWYgdGVzdF94bWxnZW5faWdub3JhYmxlKCk6CiAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQpAQCAtNjY4LDYgKzY3MSw1NSBAQAogICAgICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKSA9PSAibnM6YXR0ciIKIAogCisjIER1cmluZyB0aGUgZGV2ZWxvcG1lbnQgb2YgUHl0aG9uIDIuNSwgYW4gYXR0ZW1wdCB0byBtb3ZlIHRoZSAieG1sIgorIyBwYWNrYWdlIGltcGxlbWVudGF0aW9uIHRvIGEgbmV3IHBhY2thZ2UgKCJ4bWxjb3JlIikgcHJvdmVkIHBhaW5mdWwuCisjIFRoZSBnb2FsIG9mIHRoaXMgY2hhbmdlIHdhcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gYmUgYWJsZSB0bworIyBvYnRhaW4gYW5kIHJlbHkgb24gYmVoYXZpb3IgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgaW1wbGVtZW50YXRpb24KKyMgb2YgdGhlIFhNTCBzdXBwb3J0IHdpdGhvdXQgbmVlZGluZyB0byBiZSBjb25jZXJuZWQgYWJvdXQgdGhlCisjIGF2YWlsYWJpbGl0eSBvZiB0aGUgUHlYTUwgaW1wbGVtZW50YXRpb24uCisjCisjIFdoaWxlIHRoZSBleGlzdGluZyBpbXBvcnQgaGFja2VyeSBpbiBMaWIveG1sL19faW5pdF9fLnB5IGNhbiBjYXVzZQorIyBQeVhNTCdzIF94bWxwdXMgcGFja2FnZSB0byBzdXBwbGFudCB0aGUgInhtbCIgcGFja2FnZSwgdGhhdCBvbmx5CisjIHdvcmtzIGJlY2F1c2UgZWl0aGVyIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlICJ4bWwiIHBhY2thZ2UgbmFtZSBmb3IKKyMgaW1wb3J0cy4KKyMKKyMgVGhlIG1vdmUgcmVzdWx0ZWQgaW4gYSBudW1iZXIgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byB0aGUgZmFjdCB0aGF0CisjIHRoZSBpbXBvcnQgbWFjaGluZXJ5J3MgInBhY2thZ2UgY29udGV4dCIgaXMgYmFzZWQgb24gdGhlIG5hbWUgdGhhdCdzCisjIGJlaW5nIGltcG9ydGVkIHJhdGhlciB0aGFuIHRoZSBfX25hbWVfXyBvZiB0aGUgYWN0dWFsIHBhY2thZ2UKKyMgY29udGFpbm1lbnQ7IGl0IHdhc24ndCBwb3NzaWJsZSBmb3IgdGhlICJ4bWwiIHBhY2thZ2UgdG8gYmUgcmVwbGFjZWQKKyMgYnkgYSBzaW1wbGUgbW9kdWxlIHRoYXQgaW5kaXJlY3RlZCBpbXBvcnRzIHRvIHRoZSAieG1sY29yZSIgcGFja2FnZS4KKyMKKyMgVGhlIGZvbGxvd2luZyB0d28gdGVzdHMgZXhlcmNpc2VkIGJ1Z3MgdGhhdCB3ZXJlIGludHJvZHVjZWQgaW4gdGhhdAorIyBhdHRlbXB0LiAgS2VlcGluZyB0aGVzZSB0ZXN0cyBhcm91bmQgd2lsbCBoZWxwIGRldGVjdCBwcm9ibGVtcyB3aXRoCisjIG90aGVyIGF0dGVtcHRzIHRvIHByb3ZpZGUgcmVsaWFibGUgYWNjZXNzIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5J3MKKyMgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhNTCBzdXBwb3J0LgorCitkZWYgdGVzdF9zZl8xNTExNDk3KCk6CisgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMTQ5NworICAgIGltcG9ydCBzeXMKKyAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQorICAgIGZvciBtb2RuYW1lIGluIHN5cy5tb2R1bGVzLmtleXMoKToKKyAgICAgICAgaWYgbW9kbmFtZS5zdGFydHN3aXRoKCJ4bWwuIik6CisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICB0cnk6CisgICAgICAgIGltcG9ydCB4bWwuc2F4LmV4cGF0cmVhZGVyCisgICAgICAgIG1vZHVsZSA9IHhtbC5zYXguZXhwYXRyZWFkZXIKKyAgICAgICAgcmV0dXJuIG1vZHVsZS5fX25hbWVfXyA9PSAieG1sLnNheC5leHBhdHJlYWRlciIKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMubW9kdWxlcy51cGRhdGUob2xkX21vZHVsZXMpCisKK2RlZiB0ZXN0X3NmXzE1MTM2MTEoKToKKyAgICAjIEJ1ZyByZXBvcnQ6IGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi8xNTEzNjExCisgICAgc2lvID0gU3RyaW5nSU8oImludmFsaWQiKQorICAgIHBhcnNlciA9IG1ha2VfcGFyc2VyKCkKKyAgICBmcm9tIHhtbC5zYXggaW1wb3J0IFNBWFBhcnNlRXhjZXB0aW9uCisgICAgdHJ5OgorICAgICAgICBwYXJzZXIucGFyc2Uoc2lvKQorICAgIGV4Y2VwdCBTQVhQYXJzZUV4Y2VwdGlvbjoKKyAgICAgICAgcmV0dXJuIFRydWUKKyAgICBlbHNlOgorICAgICAgICByZXR1cm4gRmFsc2UKKwogIyA9PT09PSBNYWluIHByb2dyYW0KIAogZGVmIG1ha2VfdGVzdF9vdXRwdXQoKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkgYi9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CmluZGV4IGYzNzI1NGMuLjIzOTc0NWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQpAQCAtMjk5LDYgKzI5OSwxNyBAQAogZWxzZToKICAgICByYWlzZSBUZXN0RmFpbGVkCiAKKyMgdGVzdCBmb3IgYnVnICMxNTAxOTM0OiBpbmNvcnJlY3QgTE9BRC9TVE9SRV9HTE9CQUwgZ2VuZXJhdGlvbgorZ2xvYmFsX3ggPSAxCitkZWYgZigpOgorICAgIGdsb2JhbF94ICs9IDEKK3RyeToKKyAgICBmKCkKK2V4Y2VwdCBVbmJvdW5kTG9jYWxFcnJvcjoKKyAgICBwYXNzCitlbHNlOgorICAgIHJhaXNlIFRlc3RGYWlsZWQsICdzY29wZSBvZiBnbG9iYWxfeCBub3QgY29ycmVjdGx5IGRldGVybWluZWQnCisKIHByaW50ICIxNC4gY29tcGxleCBkZWZpbml0aW9ucyIKIAogZGVmIG1ha2VSZXR1cm5lcigqbHN0KToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2VsZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKaW5kZXggZWFlYzUyYi4uZDM0MTMyNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zZWxlY3QucHkKQEAgLTEsNSArMSw1IEBACiAjIFRlc3Rpbmcgc2VsZWN0IG1vZHVsZQotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZSwgcmVhcF9jaGlsZHJlbgogaW1wb3J0IHNlbGVjdAogaW1wb3J0IG9zCiAKQEAgLTY1LDUgKzY1LDYgQEAKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgIHByaW50ICdVbmV4cGVjdGVkIHJldHVybiB2YWx1ZXMgZnJvbSBzZWxlY3QoKTonLCByZmQsIHdmZCwgeGZkCiAgICAgcC5jbG9zZSgpCisgICAgcmVhcF9jaGlsZHJlbigpCiAKIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CmluZGV4IDhlOGIwMmYuLjI4YTIxYTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKQEAgLTEsNCArMSw2IEBACitpbXBvcnQgaHRtbGVudGl0eWRlZnMKIGltcG9ydCBwcHJpbnQKK2ltcG9ydCByZQogaW1wb3J0IHNnbWxsaWIKIGltcG9ydCB1bml0dGVzdAogZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKQEAgLTY0LDYgKzY2LDM3IEBACiAgICAgICAgIHNlbGYuc2V0bGl0ZXJhbCgpCiAKIAorY2xhc3MgSFRNTEVudGl0eUNvbGxlY3RvcihFdmVudENvbGxlY3Rvcik6CisKKyAgICBlbnRpdHlfb3JfY2hhcnJlZiA9IHJlLmNvbXBpbGUoJyg/OiYoW2EtekEtWl1bLS5hLXpBLVowLTldKiknCisgICAgICAgICd8JiMoeFswLTlhLXpBLVpdK3xbMC05XSspKSg7PyknKQorCisgICAgZGVmIGNvbnZlcnRfY2hhcnJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjaGFycmVmIiwgImNvbnZlcnQiLCBuYW1lKSkKKyAgICAgICAgaWYgbmFtZVswXSAhPSAieCI6CisgICAgICAgICAgICByZXR1cm4gRXZlbnRDb2xsZWN0b3IuY29udmVydF9jaGFycmVmKHNlbGYsIG5hbWUpCisKKyAgICBkZWYgY29udmVydF9jb2RlcG9pbnQoc2VsZiwgY29kZXBvaW50KToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJjb2RlcG9pbnQiLCAiY29udmVydCIsIGNvZGVwb2ludCkpCisgICAgICAgIEV2ZW50Q29sbGVjdG9yLmNvbnZlcnRfY29kZXBvaW50KHNlbGYsIGNvZGVwb2ludCkKKworICAgIGRlZiBjb252ZXJ0X2VudGl0eXJlZihzZWxmLCBuYW1lKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJlbnRpdHlyZWYiLCAiY29udmVydCIsIG5hbWUpKQorICAgICAgICByZXR1cm4gRXZlbnRDb2xsZWN0b3IuY29udmVydF9lbnRpdHlyZWYoc2VsZiwgbmFtZSkKKworICAgICMgVGhlc2UgdG8gcmVjb3JkIHRoYXQgdGhleSB3ZXJlIGNhbGxlZCwgdGhlbiBwYXNzIHRoZSBjYWxsIGFsb25nCisgICAgIyB0byB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzbyB0aGF0IGl0J3MgYWN0aW9ucyBjYW4gYmUKKyAgICAjIHJlY29yZGVkLgorCisgICAgZGVmIGhhbmRsZV9jaGFycmVmKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmFwcGVuZCgoImNoYXJyZWYiLCBkYXRhKSkKKyAgICAgICAgc2dtbGxpYi5TR01MUGFyc2VyLmhhbmRsZV9jaGFycmVmKHNlbGYsIGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX2VudGl0eXJlZihzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5hcHBlbmQoKCJlbnRpdHlyZWYiLCBkYXRhKSkKKyAgICAgICAgc2dtbGxpYi5TR01MUGFyc2VyLmhhbmRsZV9lbnRpdHlyZWYoc2VsZiwgZGF0YSkKKworCiBjbGFzcyBTR01MUGFyc2VyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgY29sbGVjdG9yID0gRXZlbnRDb2xsZWN0b3IKQEAgLTIxOCw3ICsyNTEsOSBAQAogICAgICAgICAiIiJTdWJzdGl0dXRpb24gb2YgZW50aXRpZXMgYW5kIGNoYXJyZWZzIGluIGF0dHJpYnV0ZSB2YWx1ZXMiIiIKICAgICAgICAgIyBTRiBidWcgIzE0NTIyNDYKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0mbHQ7IGM9Jmx0OyZndDsgZD0mbHQtJmd0OyBlPScmbHQ7ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZj0iJnh4eDsiIGc9JyYjMzI7JiMzMzsnIGg9JyYjNTAwOycgaT0neD9hPWImYz1kOyc+IiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmPSImeHh4OyIgZz0nJiMzMjsmIzMzOycgaD0nJiM1MDA7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpPSd4P2E9YiZjPWQ7JworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqPScmYW1wOyM0MjsnIGs9JyYjMzg7IzQyOyc+IiIiLAogICAgICAgICAgICAgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCAiPD4iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJkIiwgIiZsdC0+IiksCkBAIC0yMjYsMTMgKzI2MSw1OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImYiLCAiJnh4eDsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJnIiwgIiAhIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsICImIzUwMDsiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgIng/YT1iJmM9ZDsiKSwgXSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCAieD9hPWImYz1kOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImoiLCAiJiM0MjsiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJrIiwgIiYjNDI7IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0pXSkKKworICAgIGRlZiB0ZXN0X2NvbnZlcnRfb3ZlcnJpZGVzKHNlbGYpOgorICAgICAgICAjIFRoaXMgY2hlY2tzIHRoYXQgdGhlIGNoYXJhY3RlciBhbmQgZW50aXR5IHJlZmVyZW5jZQorICAgICAgICAjIGNvbnZlcnNpb24gaGVscGVycyBhcmUgY2FsbGVkIGF0IHRoZSBkb2N1bWVudGVkIHRpbWVzLiAgTm8KKyAgICAgICAgIyBhdHRlbXB0IGlzIG1hZGUgdG8gcmVhbGx5IGNoYW5nZSB3aGF0IHRoZSBwYXJzZXIgYWNjZXB0cy4KKyAgICAgICAgIworICAgICAgICBzZWxmLmNvbGxlY3RvciA9IEhUTUxFbnRpdHlDb2xsZWN0b3IKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoKCc8YSB0aXRsZT0iJmxkcXVvO3Rlc3QmI3gyMDFkOyI+Zm9vPC9hPicKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICcmZm9vYmFyOyYjNDI7JyksIFsKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2NvbnZlcnQnLCAnbGRxdW8nKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICdjb252ZXJ0JywgJ3gyMDFkJyksCisgICAgICAgICAgICAoJ3N0YXJ0dGFnJywgJ2EnLCBbKCd0aXRsZScsICcmbGRxdW87dGVzdCYjeDIwMWQ7JyldKSwKKyAgICAgICAgICAgICgnZGF0YScsICdmb28nKSwKKyAgICAgICAgICAgICgnZW5kdGFnJywgJ2EnKSwKKyAgICAgICAgICAgICgnZW50aXR5cmVmJywgJ2Zvb2JhcicpLAorICAgICAgICAgICAgKCdlbnRpdHlyZWYnLCAnY29udmVydCcsICdmb29iYXInKSwKKyAgICAgICAgICAgICgnY2hhcnJlZicsICc0MicpLAorICAgICAgICAgICAgKCdjaGFycmVmJywgJ2NvbnZlcnQnLCAnNDInKSwKKyAgICAgICAgICAgICgnY29kZXBvaW50JywgJ2NvbnZlcnQnLCA0MiksCisgICAgICAgICAgICBdKQorCisgICAgZGVmIHRlc3RfYXR0cl92YWx1ZXNfcXVvdGVkX21hcmt1cChzZWxmKToKKyAgICAgICAgIiIiTXVsdGktbGluZSBhbmQgbWFya3VwIGluIGF0dHJpYnV0ZSB2YWx1ZXMiIiIKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgdGl0bGU9J2Zvb1xuPGJyPmJhcic+dGV4dDwvYT4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAiZm9vXG48YnI+YmFyIildKSwKKyAgICAgICAgICAgICAoImRhdGEiLCAidGV4dCIpLAorICAgICAgICAgICAgICgiZW5kdGFnIiwgImEiKV0pCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIHRpdGxlPSdsZXNzIDwgdGhhbic+dGV4dDwvYT4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygidGl0bGUiLCAibGVzcyA8IHRoYW4iKV0pLAorICAgICAgICAgICAgICgiZGF0YSIsICJ0ZXh0IiksCisgICAgICAgICAgICAgKCJlbmR0YWciLCAiYSIpXSkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgdGl0bGU9J2dyZWF0ZXIgPiB0aGFuJz50ZXh0PC9hPiIiIiwKKyAgICAgICAgICAgIFsoInN0YXJ0dGFnIiwgImEiLCBbKCJ0aXRsZSIsICJncmVhdGVyID4gdGhhbiIpXSksCisgICAgICAgICAgICAgKCJkYXRhIiwgInRleHQiKSwKKyAgICAgICAgICAgICAoImVuZHRhZyIsICJhIildKQogCiAgICAgZGVmIHRlc3RfYXR0cl9mdW5reV9uYW1lcyhzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYS5iPSd2JyBjOmQ9diBlLWY9dj4iIiIsIFsKICAgICAgICAgICAgICgic3RhcnR0YWciLCAiYSIsIFsoImEuYiIsICJ2IiksICgiYzpkIiwgInYiKSwgKCJlLWYiLCAidiIpXSksCiAgICAgICAgICAgICBdKQogCisgICAgZGVmIHRlc3RfYXR0cl92YWx1ZV9pcDZfdXJsKHNlbGYpOgorICAgICAgICAjIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9zZi84NTM1MDYKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoKCI8YSBocmVmPSdodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vJz4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGEgaHJlZj1odHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vPiIpLCBbCisgICAgICAgICAgICAoInN0YXJ0dGFnIiwgImEiLCBbKCJocmVmIiwgImh0dHA6Ly9bMTA4MDo6ODo4MDA6MjAwQzo0MTdBXS8iKV0pLAorICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiaHJlZiIsICJodHRwOi8vWzEwODA6Ojg6ODAwOjIwMEM6NDE3QV0vIildKSwKKyAgICAgICAgICAgIF0pCisKICAgICBkZWYgdGVzdF9pbGxlZ2FsX2RlY2xhcmF0aW9ucyhzZWxmKToKICAgICAgICAgcyA9ICdhYmM8IXNwYWNlciB0eXBlPSJibG9jayIgaGVpZ2h0PSIyNSI+ZGVmJwogICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhzLCBbCkBAIC0zMDEsOCArMzgyLDggQEAKICAgICAjIHRoYXQgbmVlZHMgdG8gYmUgY2FyZWZ1bGx5IGNvbnNpZGVyZWQgYmVmb3JlIGNoYW5naW5nIGl0LgogCiAgICAgZGVmIF90ZXN0X3N0YXJ0dGFnX2VuZF9ib3VuZGFyeShzZWxmKToKLSAgICAgICAgc2VsZi5jaGVja19ldmVudHMoIiIiPGEgYj0nPCc+IiIiLCBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IildKV0pCi0gICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKCIiIjxhIGI9Jz4nPiIiIiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPiIpXSldKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGEgYj0nPCc+IiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPCIpXSldKQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiPGEgYj0nPic+IiwgWygic3RhcnR0YWciLCAiYSIsIFsoImIiLCAiPiIpXSldKQogCiAgICAgZGVmIF90ZXN0X2J1ZmZlcl9hcnRlZmFjdHMoc2VsZik6CiAgICAgICAgIG91dHB1dCA9IFsoInN0YXJ0dGFnIiwgImEiLCBbKCJiIiwgIjwiKV0pXQpAQCAtMzIyLDE3ICs0MDMsMTcgQEAKICAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8YSBiPSc+JyIsICI+Il0sIG91dHB1dCkKIAogICAgICAgICBvdXRwdXQgPSBbKCJjb21tZW50IiwgImFiYyIpXQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyIiLCAiPCEtLWFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwiLCAiIS0tYWJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEiLCAiLS1hYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0iLCAiLWFiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS0iLCAiYWJjLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWEiLCAiYmMtLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWIiLCAiYy0tPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMiLCAiLS0+Il0sIG91dHB1dCkKLSAgICAgICAgc2VsZi5fcnVuX2NoZWNrKFsiPCEtLWFiYy0iLCAiLT4iXSwgb3V0cHV0KQotICAgICAgICBzZWxmLl9ydW5fY2hlY2soWyI8IS0tYWJjLS0iLCAiPiJdLCBvdXRwdXQpCi0gICAgICAgIHNlbGYuX3J1bl9jaGVjayhbIjwhLS1hYmMtLT4iLCAiIl0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyIiLCAiPCEtLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCIsICIhLS1hYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhIiwgIi0tYWJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0iLCAiLWFiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLSIsICJhYmMtLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hIiwgImJjLS0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWIiLCAiYy0tPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYyIsICItLT4iXSwgb3V0cHV0KQorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhbIjwhLS1hYmMtIiwgIi0+Il0sIG91dHB1dCkKKyAgICAgICAgc2VsZi5jaGVja19ldmVudHMoWyI8IS0tYWJjLS0iLCAiPiJdLCBvdXRwdXQpCisgICAgICAgIHNlbGYuY2hlY2tfZXZlbnRzKFsiPCEtLWFiYy0tPiIsICIiXSwgb3V0cHV0KQogCiAgICAgZGVmIF90ZXN0X3N0YXJ0dGFnX2p1bmtfY2hhcnMoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfcGFyc2VfZXJyb3IoIjwiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQppbmRleCA2YWI1YTM1Li5kYTcxZmE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQpAQCAtNzQsNiArNzQsNTMgQEAKICAgICAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgICAgICBwYXNzCiAKKyAgICBkZWYgdGVzdF9jb3B5dHJlZV9zaW1wbGUoc2VsZik6CisgICAgICAgIGRlZiB3cml0ZV9kYXRhKHBhdGgsIGRhdGEpOgorICAgICAgICAgICAgZiA9IG9wZW4ocGF0aCwgInciKQorICAgICAgICAgICAgZi53cml0ZShkYXRhKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgZGVmIHJlYWRfZGF0YShwYXRoKToKKyAgICAgICAgICAgIGYgPSBvcGVuKHBhdGgpCisgICAgICAgICAgICBkYXRhID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgcmV0dXJuIGRhdGEKKworICAgICAgICBzcmNfZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCisgICAgICAgIGRzdF9kaXIgPSBvcy5wYXRoLmpvaW4odGVtcGZpbGUubWtkdGVtcCgpLCAnZGVzdGluYXRpb24nKQorCisgICAgICAgIHdyaXRlX2RhdGEob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0LnR4dCcpLCAnMTIzJykKKworICAgICAgICBvcy5ta2Rpcihvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJykpCisgICAgICAgIHdyaXRlX2RhdGEob3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicsICd0ZXN0LnR4dCcpLCAnNDU2JykKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBzaHV0aWwuY29weXRyZWUoc3JjX2RpciwgZHN0X2RpcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3QudHh0JykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0X2RpcicpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Rlc3QudHh0JykpKQorICAgICAgICAgICAgYWN0dWFsID0gcmVhZF9kYXRhKG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdC50eHQnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCAnMTIzJykKKyAgICAgICAgICAgIGFjdHVhbCA9IHJlYWRfZGF0YShvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFjdHVhbCwgJzQ1NicpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmb3IgcGF0aCBpbiAoCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihzcmNfZGlyLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc3JjX2RpciwgJ3Rlc3RfZGlyJywgJ3Rlc3QudHh0JyksCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihkc3RfZGlyLCAndGVzdF9kaXInLCAndGVzdC50eHQnKSwKKyAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5yZW1vdmUocGF0aCkKKyAgICAgICAgICAgIGZvciBwYXRoIGluICgKKyAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHNyY19kaXIsICd0ZXN0X2RpcicpLAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyJyksCisgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgb3MucmVtb3ZlZGlycyhwYXRoKQorCisKICAgICBpZiBoYXNhdHRyKG9zLCAic3ltbGluayIpOgogICAgICAgICBkZWYgdGVzdF9kb250X2NvcHlfZmlsZV9vbnRvX2xpbmtfdG9faXRzZWxmKHNlbGYpOgogICAgICAgICAgICAgIyBidWcgODUxMTIzLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaWduYWwucHkgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQppbmRleCBmN2ZjYjA0Li5hNjI2N2QyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weQpAQCAtMjUsNyArMjUsMTEgQEAKICApICYKICIiIiAlIHZhcnMoKQogCithX2NhbGxlZCA9IGJfY2FsbGVkID0gRmFsc2UKKwogZGVmIGhhbmRsZXJBKCphcmdzKToKKyAgICBnbG9iYWwgYV9jYWxsZWQKKyAgICBhX2NhbGxlZCA9IFRydWUKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAiaGFuZGxlckEiLCBhcmdzCiAKQEAgLTMzLDExICszNywxNCBAQAogICAgIHBhc3MKIAogZGVmIGhhbmRsZXJCKCphcmdzKToKKyAgICBnbG9iYWwgYl9jYWxsZWQKKyAgICBiX2NhbGxlZCA9IFRydWUKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAiaGFuZGxlckIiLCBhcmdzCiAgICAgcmFpc2UgSGFuZGxlckJDYWxsZWQsIGFyZ3MKIAotc2lnbmFsLmFsYXJtKDIwKSAgICAgICAgICAgICAgICAgICAgICAgICMgRW50aXJlIHRlc3QgbGFzdHMgYXQgbW9zdCAyMCBzZWMuCitNQVhfRFVSQVRJT04gPSAyMAorc2lnbmFsLmFsYXJtKE1BWF9EVVJBVElPTikgICAjIEVudGlyZSB0ZXN0IHNob3VsZCBsYXN0IGF0IG1vc3QgMjAgc2VjLgogaHVwID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHSFVQLCBoYW5kbGVyQSkKIHVzcjEgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IxLCBoYW5kbGVyQikKIHVzcjIgPSBzaWduYWwuc2lnbmFsKHNpZ25hbC5TSUdVU1IyLCBzaWduYWwuU0lHX0lHTikKQEAgLTY1LDkgKzcyLDM1IEBACiBleGNlcHQgVHlwZUVycm9yOgogICAgIHBhc3MKIAorIyBTZXQgdXAgYSBjaGlsZCB0byBzZW5kIGFuIGFsYXJtIHNpZ25hbCB0byB1cyAodGhlIHBhcmVudCkgYWZ0ZXIgd2FpdGluZworIyBsb25nIGVub3VnaCB0byByZWNlaXZlIHRoZSBhbGFybS4gIEl0IHNlZW1zIHdlIG1pc3MgdGhlIGFsYXJtIGZvciBzb21lCisjIHJlYXNvbi4gIFRoaXMgd2lsbCBob3BlZnVsbHkgc3RvcCB0aGUgaGFuZ3Mgb24gVHJ1NjQvQWxwaGEuCitkZWYgZm9yY2VfdGVzdF9leGl0KCk6CisgICAgIyBTaWdoLCBib3RoIGltcG9ydHMgc2VlbSBuZWNlc3NhcnkgdG8gYXZvaWQgZXJyb3JzLgorICAgIGltcG9ydCBvcworICAgIGZvcmtfcGlkID0gb3MuZm9yaygpCisgICAgaWYgZm9ya19waWQgPT0gMDoKKyAgICAgICAgIyBJbiBjaGlsZAorICAgICAgICBpbXBvcnQgb3MsIHRpbWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyBXYWl0IDUgc2Vjb25kcyBsb25nZXIgdGhhbiB0aGUgZXhwZWN0ZWQgYWxhcm0gdG8gZ2l2ZSBlbm91Z2gKKyAgICAgICAgICAgICMgdGltZSBmb3IgdGhlIG5vcm1hbCBzZXF1ZW5jZSBvZiBldmVudHMgdG8gb2NjdXIuICBUaGlzIGlzCisgICAgICAgICAgICAjIGp1c3QgYSBzdG9wLWdhcCB0byBwcmV2ZW50IHRoZSB0ZXN0IGZyb20gaGFuZ2luZy4KKyAgICAgICAgICAgIHRpbWUuc2xlZXAoTUFYX0RVUkFUSU9OICsgNSkKKyAgICAgICAgICAgIHByaW50ID4+IHN5cy5fX3N0ZG91dF9fLCAnICBjaGlsZCBzaG91bGQgbm90IGhhdmUgdG8ga2lsbCBwYXJlbnQnCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgzKToKKyAgICAgICAgICAgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR0FMQVJNKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgb3MuX2V4aXQoMCkKKyAgICAjIEluIHBhcmVudCAob3IgZXJyb3IpCisgICAgcmV0dXJuIGZvcmtfcGlkCisKIHRyeToKICAgICBvcy5zeXN0ZW0oc2NyaXB0KQogCisgICAgIyBUcnkgdG8gZW5zdXJlIHRoaXMgdGVzdCBleGl0cyBldmVuIGlmIHRoZXJlIGlzIHNvbWUgcHJvYmxlbSB3aXRoIGFsYXJtLgorICAgICMgVHJ1NjQvQWxwaGEgc29tZXRpbWVzIGhhbmdzIGFuZCBpcyB1bHRpbWF0ZWx5IGtpbGxlZCBieSB0aGUgYnVpbGRib3QuCisgICAgZm9ya19waWQgPSBmb3JjZV90ZXN0X2V4aXQoKQogICAgIHByaW50ICJzdGFydGluZyBwYXVzZSgpIGxvb3AuLi4iCiAKICAgICB0cnk6CkBAIC04OCw2ICsxMjEsMjIgQEAKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICJLZXlib2FyZEludGVycnVwdCAoYXNzdW1lIHRoZSBhbGFybSgpIHdlbnQgb2ZmKSIKIAorICAgICMgRm9yY2libHkga2lsbCB0aGUgY2hpbGQgd2UgY3JlYXRlZCB0byBwaW5nIHVzIGlmIHRoZXJlIHdhcyBhIHRlc3QgZXJyb3IuCisgICAgdHJ5OgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBkb24ndCBraWxsIG91cnNlbGYgaWYgdGhlcmUgd2FzIGEgZm9yayBlcnJvci4KKyAgICAgICAgaWYgZm9ya19waWQgPiAwOgorICAgICAgICAgICAgb3Mua2lsbChmb3JrX3BpZCwgc2lnbmFsLlNJR0tJTEwpCisgICAgZXhjZXB0OgorICAgICAgICAjIElmIHRoZSBjaGlsZCBraWxsZWQgdXMsIGl0IGhhcyBwcm9iYWJseSBleGl0ZWQuICBLaWxsaW5nIGEKKyAgICAgICAgIyBub24tZXhpc3RhbnQgcHJvY2VzcyB3aWxsIHJhaXNlIGFuIGVycm9yIHdoaWNoIHdlIGRvbid0IGNhcmUgYWJvdXQuCisgICAgICAgIHBhc3MKKworICAgIGlmIG5vdCBhX2NhbGxlZDoKKyAgICAgICAgcHJpbnQgJ0hhbmRsZXJBIG5vdCBjYWxsZWQnCisKKyAgICBpZiBub3QgYl9jYWxsZWQ6CisgICAgICAgIHByaW50ICdIYW5kbGVyQiBub3QgY2FsbGVkJworCiBmaW5hbGx5OgogICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0hVUCwgaHVwKQogICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR1VTUjEsIHVzcjEpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NvY2tldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CmluZGV4IDAxYjliNWIuLjM1NmI4MDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5CkBAIC0xMSw2ICsxMSw3IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgYXJyYXkKIGZyb20gd2Vha3JlZiBpbXBvcnQgcHJveHkKK2ltcG9ydCBzaWduYWwKIAogUE9SVCA9IDUwMDA3CiBIT1NUID0gJ2xvY2FsaG9zdCcKQEAgLTIxLDcgKzIyLDggQEAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIHNlbGYuc2VydiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKICAgICAgICAgc2VsZi5zZXJ2LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCi0gICAgICAgIHNlbGYuc2Vydi5iaW5kKChIT1NULCBQT1JUKSkKKyAgICAgICAgZ2xvYmFsIFBPUlQKKyAgICAgICAgUE9SVCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zZXJ2LCBIT1NULCBQT1JUKQogICAgICAgICBzZWxmLnNlcnYubGlzdGVuKDEpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CkBAIC0zMyw3ICszNSw4IEBACiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnYgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKICAgICAgICAgc2VsZi5zZXJ2LnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCi0gICAgICAgIHNlbGYuc2Vydi5iaW5kKChIT1NULCBQT1JUKSkKKyAgICAgICAgZ2xvYmFsIFBPUlQKKyAgICAgICAgUE9SVCA9IHRlc3Rfc3VwcG9ydC5iaW5kX3BvcnQoc2VsZi5zZXJ2LCBIT1NULCBQT1JUKQogCiAgICAgZGVmIHRlYXJEb3duKHNlbGYpOgogICAgICAgICBzZWxmLnNlcnYuY2xvc2UoKQpAQCAtNDQ3LDcgKzQ1MCwxMiBAQAogICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQogICAgICAgICBzb2NrLmJpbmQoKCIwLjAuMC4wIiwgUE9SVCsxKSkKICAgICAgICAgbmFtZSA9IHNvY2suZ2V0c29ja25hbWUoKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUsICgiMC4wLjAuMCIsIFBPUlQrMSkpCisgICAgICAgICMgWFhYKG5ub3J3aXR6KTogaHR0cDovL3Rpbnl1cmwuY29tL29zNWp6IHNlZW1zIHRvIGluZGljYXRlCisgICAgICAgICMgaXQgcmVhc29uYWJsZSB0byBnZXQgdGhlIGhvc3QncyBhZGRyIGluIGFkZGl0aW9uIHRvIDAuMC4wLjAuCisgICAgICAgICMgQXQgbGVhc3QgZm9yIGVDb3MuICBUaGlzIGlzIHJlcXVpcmVkIGZvciB0aGUgUy8zOTAgdG8gcGFzcy4KKyAgICAgICAgbXlfaXBfYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICBzZWxmLmFzc2VydF8obmFtZVswXSBpbiAoIjAuMC4wLjAiLCBteV9pcF9hZGRyKSwgJyVzIGludmFsaWQnICUgbmFtZVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lWzFdLCBQT1JUKzEpCiAKICAgICBkZWYgdGVzdEdldFNvY2tPcHQoc2VsZik6CiAgICAgICAgICMgVGVzdGluZyBnZXRzb2Nrb3B0KCkKQEAgLTU3NSw2ICs1ODMsMjEgQEAKICAgICBkZWYgX3Rlc3RSZWN2RnJvbShzZWxmKToKICAgICAgICAgc2VsZi5jbGkuc2VuZHRvKE1TRywgMCwgKEhPU1QsIFBPUlQpKQogCitjbGFzcyBUQ1BDbG9zZXJUZXN0KFRocmVhZGVkVENQU29ja2V0VGVzdCk6CisKKyAgICBkZWYgdGVzdENsb3NlKHNlbGYpOgorICAgICAgICBjb25uLCBhZGRyID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgIGNvbm4uY2xvc2UoKQorCisgICAgICAgIHNkID0gc2VsZi5jbGkKKyAgICAgICAgcmVhZCwgd3JpdGUsIGVyciA9IHNlbGVjdC5zZWxlY3QoW3NkXSwgW10sIFtdLCAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhZCwgW3NkXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZC5yZWN2KDEpLCAnJykKKworICAgIGRlZiBfdGVzdENsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsaS5jb25uZWN0KChIT1NULCBQT1JUKSkKKyAgICAgICAgdGltZS5zbGVlcCgxLjApCisKIGNsYXNzIEJhc2ljU29ja2V0UGFpclRlc3QoU29ja2V0UGFpclRlc3QpOgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGhvZE5hbWU9J3J1blRlc3QnKToKQEAgLTc5NSw2ICs4MTgsMzcgQEAKICAgICAgICAgaWYgbm90IG9rOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJhY2NlcHQoKSByZXR1cm5lZCBzdWNjZXNzIHdoZW4gd2UgZGlkIG5vdCBleHBlY3QgaXQiKQogCisgICAgZGVmIHRlc3RJbnRlcnJ1cHRlZFRpbWVvdXQoc2VsZik6CisgICAgICAgICMgWFhYIEkgZG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyB0ZXN0IG9uIE1TV2luZG93cyBvciBhbnkgb3RoZXIKKyAgICAgICAgIyBwbGFmb3JtIHRoYXQgZG9lc24ndCBzdXBwb3J0IHNpZ25hbC5hbGFybSgpIG9yIG9zLmtpbGwoKSwgdGhvdWdoCisgICAgICAgICMgdGhlIGJ1ZyBzaG91bGQgaGF2ZSBleGlzdGVkIG9uIGFsbCBwbGF0Zm9ybXMuCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNpZ25hbCwgImFsYXJtIik6CisgICAgICAgICAgICByZXR1cm4gICAgICAgICAgICAgICAgICAjIGNhbiBvbmx5IHRlc3Qgb24gKm5peAorICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCg1LjApICAgIyBtdXN0IGJlIGxvbmdlciB0aGFuIGFsYXJtCisgICAgICAgIGNsYXNzIEFsYXJtKEV4Y2VwdGlvbik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGRlZiBhbGFybV9oYW5kbGVyKHNpZ25hbCwgZnJhbWUpOgorICAgICAgICAgICAgcmFpc2UgQWxhcm0KKyAgICAgICAgb2xkX2FsYXJtID0gc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHQUxSTSwgYWxhcm1faGFuZGxlcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2lnbmFsLmFsYXJtKDIpICAgICMgUE9TSVggYWxsb3dzIGFsYXJtIHRvIGJlIHVwIHRvIDEgc2Vjb25kIGVhcmx5CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZm9vID0gc2VsZi5zZXJ2LmFjY2VwdCgpCisgICAgICAgICAgICBleGNlcHQgc29ja2V0LnRpbWVvdXQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgdGltZW91dCBpbnN0ZWFkIG9mIEFsYXJtIikKKyAgICAgICAgICAgIGV4Y2VwdCBBbGFybToKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJjYXVnaHQgb3RoZXIgZXhjZXB0aW9uIGluc3RlYWQgb2YgQWxhcm0iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIm5vdGhpbmcgY2F1Z2h0IikKKyAgICAgICAgICAgIHNpZ25hbC5hbGFybSgwKSAgICAgICAgICMgc2h1dCBvZmYgYWxhcm0KKyAgICAgICAgZXhjZXB0IEFsYXJtOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJnb3QgQWxhcm0gaW4gd3JvbmcgcGxhY2UiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgIyBubyBhbGFybSBjYW4gYmUgcGVuZGluZy4gIFNhZmUgdG8gcmVzdG9yZSBvbGQgaGFuZGxlci4KKyAgICAgICAgICAgIHNpZ25hbC5zaWduYWwoc2lnbmFsLlNJR0FMUk0sIG9sZF9hbGFybSkKKwogY2xhc3MgVURQVGltZW91dFRlc3QoU29ja2V0VENQVGVzdCk6CiAKICAgICBkZWYgdGVzdFVEUFRpbWVvdXQoc2VsZik6CkBAIC04ODMsOCArOTM3LDggQEAKICAgICAgICAgc2VsZi5zZXJ2X2Nvbm4uc2VuZChidWYpCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICB0ZXN0cyA9IFtHZW5lcmFsTW9kdWxlVGVzdHMsIEJhc2ljVENQVGVzdCwgVENQVGltZW91dFRlc3QsIFRlc3RFeGNlcHRpb25zLAotICAgICAgICAgICAgIEJ1ZmZlcklPVGVzdF0KKyAgICB0ZXN0cyA9IFtHZW5lcmFsTW9kdWxlVGVzdHMsIEJhc2ljVENQVGVzdCwgVENQQ2xvc2VyVGVzdCwgVENQVGltZW91dFRlc3QsCisgICAgICAgICAgICAgVGVzdEV4Y2VwdGlvbnMsIEJ1ZmZlcklPVGVzdF0KICAgICBpZiBzeXMucGxhdGZvcm0gIT0gJ21hYyc6CiAgICAgICAgIHRlc3RzLmV4dGVuZChbIEJhc2ljVURQVGVzdCwgVURQVGltZW91dFRlc3QgXSkKIApAQCAtODk5LDcgKzk1MywxMCBAQAogICAgICAgICB0ZXN0cy5hcHBlbmQoQmFzaWNTb2NrZXRQYWlyVGVzdCkKICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2xpbnV4Mic6CiAgICAgICAgIHRlc3RzLmFwcGVuZChUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSkKKworICAgIHRocmVhZF9pbmZvID0gdGVzdF9zdXBwb3J0LnRocmVhZGluZ19zZXR1cCgpCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdCgqdGVzdHMpCisgICAgdGVzdF9zdXBwb3J0LnRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CmluZGV4IDEwOTEzODMuLjNjOWM5ZjAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKQEAgLTMsNiArMyw3IEBACiBpbXBvcnQgc3lzCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHNvY2tldAoraW1wb3J0IGVycm5vCiAKICMgT3B0aW9uYWxseSB0ZXN0IFNTTCBzdXBwb3J0LiAgVGhpcyByZXF1aXJlcyB0aGUgJ25ldHdvcmsnIHJlc291cmNlIGFzIGdpdmVuCiAjIG9uIHRoZSByZWdydGVzdCBjb21tYW5kIGxpbmUuCkBAIC0zMyw2ICszNCwxMyBAQAogZGVmIHRlc3RfdGltZW91dCgpOgogICAgIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygnbmV0d29yaycpCiAKKyAgICBkZWYgZXJyb3JfbXNnKGV4dHJhX21zZyk6CisgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsICIiIlwKKyAgICBXQVJOSU5HOiAgYW4gYXR0ZW1wdCB0byBjb25uZWN0IHRvICVyICVzLCBpbgorICAgIHRlc3RfdGltZW91dC4gIFRoYXQgbWF5IGJlIGxlZ2l0aW1hdGUsIGJ1dCBpcyBub3QgdGhlIG91dGNvbWUgd2UgaG9wZWQKKyAgICBmb3IuICBJZiB0aGlzIG1lc3NhZ2UgaXMgc2VlbiBvZnRlbiwgdGVzdF90aW1lb3V0IHNob3VsZCBiZSBjaGFuZ2VkIHRvCisgICAgdXNlIGEgbW9yZSByZWxpYWJsZSBhZGRyZXNzLiIiIiAlIChBRERSLCBleHRyYV9tc2cpCisKICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKICAgICAgICAgcHJpbnQgInRlc3RfdGltZW91dCAuLi4iCiAKQEAgLTQ4LDEyICs1NiwxNCBAQAogICAgIHRyeToKICAgICAgICAgcy5jb25uZWN0KEFERFIpCiAgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgotICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiJcCi0gICAgV0FSTklORzogIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byAlciB0aW1lZCBvdXQsIGluCi0gICAgdGVzdF90aW1lb3V0LiAgVGhhdCBtYXkgYmUgbGVnaXRpbWF0ZSwgYnV0IGlzIG5vdCB0aGUgb3V0Y29tZSB3ZSBob3BlZAotICAgIGZvci4gIElmIHRoaXMgbWVzc2FnZSBpcyBzZWVuIG9mdGVuLCB0ZXN0X3RpbWVvdXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KLSAgICB1c2UgYSBtb3JlIHJlbGlhYmxlIGFkZHJlc3MuIiIiICUgKEFERFIsKQorICAgICAgICBlcnJvcl9tc2coJ3RpbWVkIG91dCcpCiAgICAgICAgIHJldHVybgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIGV4YzogICMgSW4gY2FzZSBjb25uZWN0aW9uIGlzIHJlZnVzZWQuCisgICAgICAgIGlmIGV4Yy5hcmdzWzBdID09IGVycm5vLkVDT05OUkVGVVNFRDoKKyAgICAgICAgICAgIGVycm9yX21zZygnd2FzIHJlZnVzZWQnKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZQogCiAgICAgc3MgPSBzb2NrZXQuc3NsKHMpCiAgICAgIyBSZWFkIHBhcnQgb2YgcmV0dXJuIHdlbGNvbWUgYmFubmVyIHR3aWNlLgpAQCAtNzEsNyArODEsNyBAQAogICAgICAgICByZXR1cm4KIAogICAgICMgU29tZSByYW5kb20gcG9ydCB0byBjb25uZWN0IHRvLgotICAgIFBPUlQgPSA5OTM0CisgICAgUE9SVCA9IFs5OTM0XQogCiAgICAgbGlzdGVuZXJfcmVhZHkgPSB0aHJlYWRpbmcuRXZlbnQoKQogICAgIGxpc3RlbmVyX2dvbmUgPSB0aHJlYWRpbmcuRXZlbnQoKQpAQCAtODIsNyArOTIsNyBAQAogICAgICMga25vdyB0aGUgc29ja2V0IGlzIGdvbmUuCiAgICAgZGVmIGxpc3RlbmVyKCk6CiAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKLSAgICAgICAgcy5iaW5kKCgnJywgUE9SVCkpCisgICAgICAgIFBPUlRbMF0gPSB0ZXN0X3N1cHBvcnQuYmluZF9wb3J0KHMsICcnLCBQT1JUWzBdKQogICAgICAgICBzLmxpc3Rlbig1KQogICAgICAgICBsaXN0ZW5lcl9yZWFkeS5zZXQoKQogICAgICAgICBzLmFjY2VwdCgpCkBAIC05Miw3ICsxMDIsNyBAQAogICAgIGRlZiBjb25uZWN0b3IoKToKICAgICAgICAgbGlzdGVuZXJfcmVhZHkud2FpdCgpCiAgICAgICAgIHMgPSBzb2NrZXQuc29ja2V0KCkKLSAgICAgICAgcy5jb25uZWN0KCgnbG9jYWxob3N0JywgUE9SVCkpCisgICAgICAgIHMuY29ubmVjdCgoJ2xvY2FsaG9zdCcsIFBPUlRbMF0pKQogICAgICAgICBsaXN0ZW5lcl9nb25lLndhaXQoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzc2xfc29jayA9IHNvY2tldC5zc2wocykKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0c2VydmVyLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKaW5kZXggMTI0NWJhNS4uZGQ0NTMyZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRzZXJ2ZXIucHkKQEAgLTEsMTEgKzEsMTMgQEAKICMgVGVzdCBzdWl0ZSBmb3IgU29ja2V0U2VydmVyLnB5CiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0Ci1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCB2ZXJpZnksIFRFU1RGTiwgVGVzdFNraXBwZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0ICh2ZXJib3NlLCB2ZXJpZnksIFRFU1RGTiwgVGVzdFNraXBwZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhcF9jaGlsZHJlbikKIHRlc3Rfc3VwcG9ydC5yZXF1aXJlcygnbmV0d29yaycpCiAKIGZyb20gU29ja2V0U2VydmVyIGltcG9ydCAqCiBpbXBvcnQgc29ja2V0CitpbXBvcnQgZXJybm8KIGltcG9ydCBzZWxlY3QKIGltcG9ydCB0aW1lCiBpbXBvcnQgdGhyZWFkaW5nCkBAIC03Nyw2ICs3OSwxMSBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidGhyZWFkOiBjcmVhdGluZyBzZXJ2ZXIiCiAgICAgICAgIHN2ciA9IHN2cmNscyhzZWxmLl9fYWRkciwgc2VsZi5fX2hkbHJjbHMpCisgICAgICAgICMgcHVsbCB0aGUgYWRkcmVzcyBvdXQgb2YgdGhlIHNlcnZlciBpbiBjYXNlIGl0IGNoYW5nZWQKKyAgICAgICAgIyB0aGlzIGNhbiBoYXBwZW4gaWYgYW5vdGhlciBwcm9jZXNzIGlzIHVzaW5nIHRoZSBwb3J0CisgICAgICAgIGFkZHIgPSBnZXRhdHRyKHN2ciwgJ3NlcnZlcl9hZGRyZXNzJykKKyAgICAgICAgaWYgYWRkcjoKKyAgICAgICAgICAgIHNlbGYuX19hZGRyID0gYWRkcgogICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidGhyZWFkOiBzZXJ2aW5nIHRocmVlIHRpbWVzIgogICAgICAgICBzdnIuc2VydmVfYV9mZXcoKQogICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAidGhyZWFkOiBkb25lIgpAQCAtMTM2LDcgKzE0MywyNSBAQAogICAgICAgICB0LmpvaW4oKQogICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiZG9uZSIKIAotdGNwc2VydmVycyA9IFtUQ1BTZXJ2ZXIsIFRocmVhZGluZ1RDUFNlcnZlcl0KK2NsYXNzIEZvcmdpdmluZ1RDUFNlcnZlcihUQ1BTZXJ2ZXIpOgorICAgICMgcHJldmVudCBlcnJvcnMgaWYgYW5vdGhlciBwcm9jZXNzIGlzIHVzaW5nIHRoZSBwb3J0IHdlIHdhbnQKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgIGhvc3QsIGRlZmF1bHRfcG9ydCA9IHNlbGYuc2VydmVyX2FkZHJlc3MKKyAgICAgICAgIyB0aGlzIGNvZGUgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb20gdGVzdC50ZXN0X3N1cHBvcnQKKyAgICAgICAgIyB0aGUgcG9ydHMgd2VyZSBjaGFuZ2VkIHRvIHByb3RlY3QgdGhlIGlubm9jZW50CisgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgZm9yIHBvcnQgaW4gW2RlZmF1bHRfcG9ydCwgMzQzNCwgODc5OCwgMjM4MzNdOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuc2VydmVyX2FkZHJlc3MgPSBob3N0LCBwb3J0CisgICAgICAgICAgICAgICAgVENQU2VydmVyLnNlcnZlcl9iaW5kKHNlbGYpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIChlcnIsIG1zZyk6CisgICAgICAgICAgICAgICAgaWYgZXJyICE9IGVycm5vLkVBRERSSU5VU0U6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgXAorICAgICAgICAgICAgICAgICAgICAnICBXQVJOSU5HOiBmYWlsZWQgdG8gbGlzdGVuIG9uIHBvcnQgJWQsIHRyeWluZyBhbm90aGVyJyAlIHBvcnQKKwordGNwc2VydmVycyA9IFtGb3JnaXZpbmdUQ1BTZXJ2ZXIsIFRocmVhZGluZ1RDUFNlcnZlcl0KIGlmIGhhc2F0dHIob3MsICdmb3JrJykgYW5kIG9zLm5hbWUgbm90IGluICgnb3MyJywpOgogICAgIHRjcHNlcnZlcnMuYXBwZW5kKEZvcmtpbmdUQ1BTZXJ2ZXIpCiB1ZHBzZXJ2ZXJzID0gW1VEUFNlcnZlciwgVGhyZWFkaW5nVURQU2VydmVyXQpAQCAtMTc1LDYgKzIwMCw3IEBACiAgICAgICAgIHRlc3RhbGwoKQogICAgIGZpbmFsbHk6CiAgICAgICAgIGNsZWFudXAoKQorICAgIHJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CmluZGV4IGFhNDU4ZTYuLjY2ZmQ2NjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0LnB5CkBAIC0xNSw5ICsxNSwxMSBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORyA9IDAKICAgICBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORyA9IDEKKyAgICBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFID0gMgogZWxzZToKLSAgICBQWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcgPSBfc3RydWN0Ll9QWV9TVFJVQ1RfUkFOR0VfQ0hFQ0tJTkcKLSAgICBQWV9TVFJVQ1RfT1ZFUkZMT1dfTUFTS0lORyA9IF9zdHJ1Y3QuX1BZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HCisgICAgUFlfU1RSVUNUX1JBTkdFX0NIRUNLSU5HID0gZ2V0YXR0cihfc3RydWN0LCAnX1BZX1NUUlVDVF9SQU5HRV9DSEVDS0lORycsIDApCisgICAgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcgPSBnZXRhdHRyKF9zdHJ1Y3QsICdfUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcnLCAwKQorICAgIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UgPSBnZXRhdHRyKF9zdHJ1Y3QsICdfUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRScsIDApCiAKIGRlZiBzdHJpbmdfcmV2ZXJzZShzKToKICAgICByZXR1cm4gIiIuam9pbihyZXZlcnNlZChzKSkKQEAgLTQ2LDMzICs0OCw0MCBAQAogICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBkaWQgbm90IHJhaXNlIGVycm9yIiAlICgKICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18sIGFyZ3MpCiAKLWRlZiBkZXByZWNhdGVkX2VycihmdW5jLCAqYXJncyk6Ci0gICAgIyBUaGUgYHdhcm5pbmdzYCBtb2R1bGUgZG9lc24ndCBoYXZlIGFuIGFkdmVydGlzZWQgd2F5IHRvIHJlc3RvcmUKLSAgICAjIGl0cyBmaWx0ZXIgbGlzdC4gIENoZWF0LgotICAgIHNhdmVfd2FybmluZ3NfZmlsdGVycyA9IHdhcm5pbmdzLmZpbHRlcnNbOl0KLSAgICAjIEdycnIsIHdlIG5lZWQgdGhpcyBmdW5jdGlvbiB0byB3YXJuIGV2ZXJ5IHRpbWUuICBXaXRob3V0IHJlbW92aW5nCi0gICAgIyB0aGUgd2FybmluZ3JlZ2lzdHJ5LCBydW5uaW5nIHRlc3RfdGFyZmlsZSB0aGVuIHRlc3Rfc3RydWN0IHdvdWxkIGZhaWwKLSAgICAjIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCi0gICAgZ2xvYmFscyA9IGZ1bmMuZnVuY19nbG9iYWxzCi0gICAgaWYgJ19fd2FybmluZ3JlZ2lzdHJ5X18nIGluIGdsb2JhbHM6Ci0gICAgICAgIGRlbCBnbG9iYWxzWydfX3dhcm5pbmdyZWdpc3RyeV9fJ10KLSAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCByIiIiXnN0cnVjdC4qIiIiLCBEZXByZWNhdGlvbldhcm5pbmcpCi0gICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImVycm9yIiwgciIiIi4qZm9ybWF0IHJlcXVpcmVzLioiIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotICAgIHRyeToKK2RlZiB3aXRoX3dhcm5pbmdfcmVzdG9yZShmdW5jKToKKyAgICBkZWYgX3dpdGhfd2FybmluZ19yZXN0b3JlKCphcmdzLCAqKmt3KToKKyAgICAgICAgIyBUaGUgYHdhcm5pbmdzYCBtb2R1bGUgZG9lc24ndCBoYXZlIGFuIGFkdmVydGlzZWQgd2F5IHRvIHJlc3RvcmUKKyAgICAgICAgIyBpdHMgZmlsdGVyIGxpc3QuICBDaGVhdC4KKyAgICAgICAgc2F2ZV93YXJuaW5nc19maWx0ZXJzID0gd2FybmluZ3MuZmlsdGVyc1s6XQorICAgICAgICAjIEdycnIsIHdlIG5lZWQgdGhpcyBmdW5jdGlvbiB0byB3YXJuIGV2ZXJ5IHRpbWUuICBXaXRob3V0IHJlbW92aW5nCisgICAgICAgICMgdGhlIHdhcm5pbmdyZWdpc3RyeSwgcnVubmluZyB0ZXN0X3RhcmZpbGUgdGhlbiB0ZXN0X3N0cnVjdCB3b3VsZCBmYWlsCisgICAgICAgICMgb24gNjQtYml0IHBsYXRmb3Jtcy4KKyAgICAgICAgZ2xvYmFscyA9IGZ1bmMuZnVuY19nbG9iYWxzCisgICAgICAgIGlmICdfX3dhcm5pbmdyZWdpc3RyeV9fJyBpbiBnbG9iYWxzOgorICAgICAgICAgICAgZGVsIGdsb2JhbHNbJ19fd2FybmluZ3JlZ2lzdHJ5X18nXQorICAgICAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiZXJyb3IiLCByIiIiXnN0cnVjdC4qIiIiLCBEZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJlcnJvciIsIHIiIiIuKmZvcm1hdCByZXF1aXJlcy4qIiIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGZ1bmMoKmFyZ3MpCi0gICAgICAgIGV4Y2VwdCAoc3RydWN0LmVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICAgICAgcGFzcwotICAgICAgICBleGNlcHQgRGVwcmVjYXRpb25XYXJuaW5nOgotICAgICAgICAgICAgaWYgbm90IFBZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HOgotICAgICAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICIlcyVzIGV4cGVjdGVkIHRvIHJhaXNlIHN0cnVjdC5lcnJvciIgJSAoCi0gICAgICAgICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18sIGFyZ3MpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBkaWQgbm90IHJhaXNlIGVycm9yIiAlICgKKyAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmt3KQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IHNhdmVfd2FybmluZ3NfZmlsdGVyc1s6XQorICAgIHJldHVybiBfd2l0aF93YXJuaW5nX3Jlc3RvcmUKKworZGVmIGRlcHJlY2F0ZWRfZXJyKGZ1bmMsICphcmdzKToKKyAgICB0cnk6CisgICAgICAgIGZ1bmMoKmFyZ3MpCisgICAgZXhjZXB0IChzdHJ1Y3QuZXJyb3IsIFR5cGVFcnJvcik6CisgICAgICAgIHBhc3MKKyAgICBleGNlcHQgRGVwcmVjYXRpb25XYXJuaW5nOgorICAgICAgICBpZiBub3QgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkc6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAiJXMlcyBleHBlY3RlZCB0byByYWlzZSBzdHJ1Y3QuZXJyb3IiICUgKAogICAgICAgICAgICAgICAgIGZ1bmMuX19uYW1lX18sIGFyZ3MpCi0gICAgZmluYWxseToKLSAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IHNhdmVfd2FybmluZ3NfZmlsdGVyc1s6XQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQsICIlcyVzIGRpZCBub3QgcmFpc2UgZXJyb3IiICUgKAorICAgICAgICAgICAgZnVuYy5fX25hbWVfXywgYXJncykKK2RlcHJlY2F0ZWRfZXJyID0gd2l0aF93YXJuaW5nX3Jlc3RvcmUoZGVwcmVjYXRlZF9lcnIpCisKIAogc2ltcGxlX2VycihzdHJ1Y3QuY2FsY3NpemUsICdaJykKIApAQCAtNDc1LDYgKzQ4NCw5IEBACiAKIHRlc3RfNzA1ODM2KCkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFNGIGJ1ZyAxMjI5MzgwLiBObyBzdHJ1Y3QucGFjayBleGNlcHRpb24gZm9yIHNvbWUgb3V0IG9mIHJhbmdlIGludGVnZXJzCisKIGRlZiB0ZXN0XzEyMjkzODAoKToKICAgICBpbXBvcnQgc3lzCiAgICAgZm9yIGVuZGlhbiBpbiAoJycsICc+JywgJzwnKToKQEAgLTQ5MSw2ICs1MDMsMzcgQEAKIGlmIFBZX1NUUlVDVF9SQU5HRV9DSEVDS0lORzoKICAgICB0ZXN0XzEyMjkzODAoKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgU0YgYnVnIDE1MzA1NTkuIHN0cnVjdC5wYWNrIHJhaXNlcyBUeXBlRXJyb3Igd2hlcmUgaXQgdXNlZCB0byBjb252ZXJ0LgorCitkZWYgY2hlY2tfZmxvYXRfY29lcmNlKGZvcm1hdCwgbnVtYmVyKToKKyAgICBpZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFID09IDI6CisgICAgICAgICMgVGVzdCBmb3IgcHJlLTIuNSBzdHJ1Y3QgbW9kdWxlCisgICAgICAgIHBhY2tlZCA9IHN0cnVjdC5wYWNrKGZvcm1hdCwgbnVtYmVyKQorICAgICAgICBmbG9vcmVkID0gc3RydWN0LnVucGFjayhmb3JtYXQsIHBhY2tlZClbMF0KKyAgICAgICAgaWYgZmxvb3JlZCAhPSBpbnQobnVtYmVyKToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImRpZCBub3QgY29ycmVjbHkgY29lcmNlIGZsb2F0IHRvIGludCIpCisgICAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgICAgZnVuYygqYXJncykKKyAgICBleGNlcHQgKHN0cnVjdC5lcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgaWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImV4cGVjdGVkIERlcHJlY2F0aW9uV2FybmluZyBmb3IgZmxvYXQgY29lcmNlIikKKyAgICBleGNlcHQgRGVwcmVjYXRpb25XYXJuaW5nOgorICAgICAgICBpZiBub3QgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRToKKyAgICAgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoImV4cGVjdGVkIHRvIHJhaXNlIHN0cnVjdC5lcnJvciBmb3IgZmxvYXQgY29lcmNlIikKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJkaWQgbm90IHJhaXNlIGVycm9yIGZvciBmbG9hdCBjb2VyY2UiKQorCitjaGVja19mbG9hdF9jb2VyY2UgPSB3aXRoX3dhcm5pbmdfcmVzdG9yZShkZXByZWNhdGVkX2VycikKKworZGVmIHRlc3RfMTUzMDU1OSgpOgorICAgIGZvciBlbmRpYW4gaW4gKCcnLCAnPicsICc8Jyk6CisgICAgICAgIGZvciBmbXQgaW4gKCdCJywgJ0gnLCAnSScsICdMJywgJ2InLCAnaCcsICdpJywgJ2wnKToKKyAgICAgICAgICAgIGNoZWNrX2Zsb2F0X2NvZXJjZShlbmRpYW4gKyBmbXQsIDEuMCkKKyAgICAgICAgICAgIGNoZWNrX2Zsb2F0X2NvZXJjZShlbmRpYW4gKyBmbXQsIDEuNSkKKwordGVzdF8xNTMwNTU5KCkKIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIFBhY2tpbmcgYW5kIHVucGFja2luZyB0by9mcm9tIGJ1ZmZlcnMuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKaW5kZXggZWRmNWJkMC4uOGM4YWM0MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQpAQCAtMjcsNiArMjcsMTggQEAKICAgICByZXR1cm4gcmUuc3ViKHIiXFtcZCsgcmVmc1xdXHI/XG4/JCIsICIiLCBzdGRlcnIpCiAKIGNsYXNzIFByb2Nlc3NUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIFRyeSB0byBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHdlIGhhdmUgc28gdGhpcyB0ZXN0CisgICAgICAgICMgZG9lc24ndCBjcmFzaCBvbiBzb21lIGJ1aWxkYm90cyAoQWxwaGFzIGluIHBhcnRpY3VsYXIpLgorICAgICAgICBpZiBoYXNhdHRyKHRlc3Rfc3VwcG9ydCwgInJlYXBfY2hpbGRyZW4iKToKKyAgICAgICAgICAgIHRlc3Rfc3VwcG9ydC5yZWFwX2NoaWxkcmVuKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgIyBUcnkgdG8gbWluaW1pemUgdGhlIG51bWJlciBvZiBjaGlsZHJlbiB3ZSBoYXZlIHNvIHRoaXMgdGVzdAorICAgICAgICAjIGRvZXNuJ3QgY3Jhc2ggb24gc29tZSBidWlsZGJvdHMgKEFscGhhcyBpbiBwYXJ0aWN1bGFyKS4KKyAgICAgICAgaWYgaGFzYXR0cih0ZXN0X3N1cHBvcnQsICJyZWFwX2NoaWxkcmVuIik6CisgICAgICAgICAgICB0ZXN0X3N1cHBvcnQucmVhcF9jaGlsZHJlbigpCisKICAgICBkZWYgbWtzdGVtcChzZWxmKToKICAgICAgICAgIiIid3JhcHBlciBmb3IgbWtzdGVtcCwgY2FsbGluZyBta3RlbXAgaWYgbWtzdGVtcCBpcyBub3QgYXZhaWxhYmxlIiIiCiAgICAgICAgIGlmIGhhc2F0dHIodGVtcGZpbGUsICJta3N0ZW1wIik6CkBAIC01Niw3ICs2OCw3IEBACiAgICAgICAgICAgICBzdWJwcm9jZXNzLmNoZWNrX2NhbGwoW3N5cy5leGVjdXRhYmxlLCAiLWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IHN5czsgc3lzLmV4aXQoNDcpIl0pCiAgICAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciwgZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5lcnJubywgNDcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUucmV0dXJuY29kZSwgNDcpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIENhbGxlZFByb2Nlc3NFcnJvciIpCiAKQEAgLTM4NCw3ICszOTYsOCBAQAogCiAgICAgZGVmIHRlc3Rfbm9fbGVha2luZyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgd2UgbGVhayBubyByZXNvdXJjZXMKLSAgICAgICAgaWYgdGVzdF9zdXBwb3J0LmlzX3Jlc291cmNlX2VuYWJsZWQoInN1YnByb2Nlc3MiKSBhbmQgbm90IG1zd2luZG93czoKKyAgICAgICAgaWYgbm90IGhhc2F0dHIodGVzdF9zdXBwb3J0LCAiaXNfcmVzb3VyY2VfZW5hYmxlZCIpIFwKKyAgICAgICAgICAgICAgIG9yIHRlc3Rfc3VwcG9ydC5pc19yZXNvdXJjZV9lbmFibGVkKCJzdWJwcm9jZXNzIikgYW5kIG5vdCBtc3dpbmRvd3M6CiAgICAgICAgICAgICBtYXhfaGFuZGxlcyA9IDEwMjYgIyB0b28gbXVjaCBmb3IgbW9zdCBVTklYIHN5c3RlbXMKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIG1heF9oYW5kbGVzID0gNjUKQEAgLTQ2MywxMCArNDc2LDM2IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgT1NFcnJvciIpCiAKKyAgICAgICAgZGVmIF9zdXBwcmVzc19jb3JlX2ZpbGVzKHNlbGYpOgorICAgICAgICAgICAgIiIiVHJ5IHRvIHByZXZlbnQgY29yZSBmaWxlcyBmcm9tIGJlaW5nIGNyZWF0ZWQuCisgICAgICAgICAgICBSZXR1cm5zIHByZXZpb3VzIHVsaW1pdCBpZiBzdWNjZXNzZnVsLCBlbHNlIE5vbmUuCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbXBvcnQgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICBvbGRfbGltaXQgPSByZXNvdXJjZS5nZXRybGltaXQocmVzb3VyY2UuUkxJTUlUX0NPUkUpCisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFLCAoMCwwKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gb2xkX2xpbWl0CisgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBWYWx1ZUVycm9yLCByZXNvdXJjZS5lcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICAgICBkZWYgX3Vuc3VwcHJlc3NfY29yZV9maWxlcyhzZWxmLCBvbGRfbGltaXQpOgorICAgICAgICAgICAgIiIiUmV0dXJuIGNvcmUgZmlsZSBiZWhhdmlvciB0byBkZWZhdWx0LiIiIgorICAgICAgICAgICAgaWYgb2xkX2xpbWl0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0IHJlc291cmNlCisgICAgICAgICAgICAgICAgcmVzb3VyY2Uuc2V0cmxpbWl0KHJlc291cmNlLlJMSU1JVF9DT1JFLCBvbGRfbGltaXQpCisgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBWYWx1ZUVycm9yLCByZXNvdXJjZS5lcnJvcik6CisgICAgICAgICAgICAgICAgcmV0dXJuCisKICAgICAgICAgZGVmIHRlc3RfcnVuX2Fib3J0KHNlbGYpOgogICAgICAgICAgICAgIyByZXR1cm5jb2RlIGhhbmRsZXMgc2lnbmFsIHRlcm1pbmF0aW9uCi0gICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImltcG9ydCBvczsgb3MuYWJvcnQoKSJdKQorICAgICAgICAgICAgb2xkX2xpbWl0ID0gc2VsZi5fc3VwcHJlc3NfY29yZV9maWxlcygpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW1wb3J0IG9zOyBvcy5hYm9ydCgpIl0pCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHNlbGYuX3Vuc3VwcHJlc3NfY29yZV9maWxlcyhvbGRfbGltaXQpCiAgICAgICAgICAgICBwLndhaXQoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgtcC5yZXR1cm5jb2RlLCBzaWduYWwuU0lHQUJSVCkKIApAQCAtNTk5LDYgKzYzOCw4IEBACiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFByb2Nlc3NUZXN0Q2FzZSkKKyAgICBpZiBoYXNhdHRyKHRlc3Rfc3VwcG9ydCwgInJlYXBfY2hpbGRyZW4iKToKKyAgICAgICAgdGVzdF9zdXBwb3J0LnJlYXBfY2hpbGRyZW4oKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggMmQwOGY0ZC4uYTlkNWRhYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtODksNiArODksMjQgQEAKICAgICAgICAgICAgIG1zZyA9ICJVc2Ugb2YgdGhlIGAlcycgcmVzb3VyY2Ugbm90IGVuYWJsZWQiICUgcmVzb3VyY2UKICAgICAgICAgcmFpc2UgUmVzb3VyY2VEZW5pZWQobXNnKQogCitkZWYgYmluZF9wb3J0KHNvY2ssIGhvc3Q9JycsIHByZWZlcnJlZF9wb3J0PTU0MzIxKToKKyAgICAiIiJUcnkgdG8gYmluZCB0aGUgc29jayB0byBhIHBvcnQuICBJZiB3ZSBhcmUgcnVubmluZyBtdWx0aXBsZQorICAgIHRlc3RzIGFuZCB3ZSBkb24ndCB0cnkgbXVsdGlwbGUgcG9ydHMsIHRoZSB0ZXN0IGNhbiBmYWlscy4gIFRoaXMKKyAgICBtYWtlcyB0aGUgdGVzdCBtb3JlIHJvYnVzdC4iIiIKKworICAgIGltcG9ydCBzb2NrZXQsIGVycm5vCisgICAgIyBzb21lIHJhbmRvbSBwb3J0cyB0aGF0IGhvcGVmdWxseSBubyBvbmUgaXMgbGlzdGVuaW5nIG9uLgorICAgIGZvciBwb3J0IGluIFtwcmVmZXJyZWRfcG9ydCwgOTkwNywgMTAyNDMsIDMyOTk5XToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc29jay5iaW5kKChob3N0LCBwb3J0KSkKKyAgICAgICAgICAgIHJldHVybiBwb3J0CisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3IsIChlcnIsIG1zZyk6CisgICAgICAgICAgICBpZiBlcnIgIT0gZXJybm8uRUFERFJJTlVTRToKKyAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRlcnJfXywgXAorICAgICAgICAgICAgICAgICcgIFdBUk5JTkc6IGZhaWxlZCB0byBsaXN0ZW4gb24gcG9ydCAlZCwgdHJ5aW5nIGFub3RoZXInICUgcG9ydAorICAgIHJhaXNlIFRlc3RGYWlsZWQsICd1bmFibGUgdG8gZmluZCBwb3J0IHRvIGxpc3RlbiBvbicKKwogRlVaWiA9IDFlLTYKIAogZGVmIGZjbXAoeCwgeSk6ICMgZnV6enkgY29tcGFyaXNvbiBmdW5jdGlvbgpAQCAtMjk2LDYgKzMxNCwxMiBAQAogXzFHID0gMTAyNCAqIF8xTQogXzJHID0gMiAqIF8xRwogCisjIEhhY2sgdG8gZ2V0IGF0IHRoZSBtYXhpbXVtIHZhbHVlIGFuIGludGVybmFsIGluZGV4IGNhbiB0YWtlLgorY2xhc3MgX0R1bW15OgorICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgaSwgaik6CisgICAgICAgIHJldHVybiBqCitNQVhfUHlfc3NpemVfdCA9IF9EdW1teSgpWzpdCisKIGRlZiBzZXRfbWVtbGltaXQobGltaXQpOgogICAgIGltcG9ydCByZQogICAgIGdsb2JhbCBtYXhfbWVtdXNlCkBAIC0zMTAsNyArMzM0LDkgQEAKICAgICBpZiBtIGlzIE5vbmU6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0ludmFsaWQgbWVtb3J5IGxpbWl0ICVyJyAlIChsaW1pdCwpKQogICAgIG1lbWxpbWl0ID0gaW50KGZsb2F0KG0uZ3JvdXAoMSkpICogc2l6ZXNbbS5ncm91cCgzKS5sb3dlcigpXSkKLSAgICBpZiBtZW1saW1pdCA8IDIuNSpfMUc6CisgICAgaWYgbWVtbGltaXQgPiBNQVhfUHlfc3NpemVfdDoKKyAgICAgICAgbWVtbGltaXQgPSBNQVhfUHlfc3NpemVfdAorICAgIGlmIG1lbWxpbWl0IDwgXzJHIC0gMToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignTWVtb3J5IGxpbWl0ICVyIHRvbyBsb3cgdG8gYmUgdXNlZnVsJyAlIChsaW1pdCwpKQogICAgIG1heF9tZW11c2UgPSBtZW1saW1pdAogCkBAIC0zNTMsNiArMzc5LDE3IEBACiAgICAgICAgIHJldHVybiB3cmFwcGVyCiAgICAgcmV0dXJuIGRlY29yYXRvcgogCitkZWYgYmlnYWRkcnNwYWNldGVzdChmKToKKyAgICAiIiJEZWNvcmF0b3IgZm9yIHRlc3RzIHRoYXQgZmlsbCB0aGUgYWRkcmVzcyBzcGFjZS4iIiIKKyAgICBkZWYgd3JhcHBlcihzZWxmKToKKyAgICAgICAgaWYgbWF4X21lbXVzZSA8IE1BWF9QeV9zc2l6ZV90OgorICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTa2lwcGluZyAlcyBiZWNhdXNlIG9mIG1lbW9yeSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uc3RyYWludFxuIiAlIChmLl9fbmFtZV9fLCkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZihzZWxmKQorICAgIHJldHVybiB3cmFwcGVyCisKICM9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIyBQcmVsaW1pbmFyeSBQeVVOSVQgaW50ZWdyYXRpb24uCiAKQEAgLTQzNSwzICs0NzIsNDYgQEAKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAnZG9jdGVzdCAoJXMpIC4uLiAlZCB0ZXN0cyB3aXRoIHplcm8gZmFpbHVyZXMnICUgKG1vZHVsZS5fX25hbWVfXywgdCkKICAgICByZXR1cm4gZiwgdAorCisjPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgVGhyZWFkaW5nIHN1cHBvcnQgdG8gcHJldmVudCByZXBvcnRpbmcgcmVmbGVha3Mgd2hlbiBydW5uaW5nIHJlZ3J0ZXN0LnB5IC1SCisKK2RlZiB0aHJlYWRpbmdfc2V0dXAoKToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgcmV0dXJuIGxlbih0aHJlYWRpbmcuX2FjdGl2ZSksIGxlbih0aHJlYWRpbmcuX2xpbWJvKQorCitkZWYgdGhyZWFkaW5nX2NsZWFudXAobnVtX2FjdGl2ZSwgbnVtX2xpbWJvKToKKyAgICBpbXBvcnQgdGhyZWFkaW5nCisgICAgaW1wb3J0IHRpbWUKKworICAgIF9NQVhfQ09VTlQgPSAxMAorICAgIGNvdW50ID0gMAorICAgIHdoaWxlIGxlbih0aHJlYWRpbmcuX2FjdGl2ZSkgIT0gbnVtX2FjdGl2ZSBhbmQgY291bnQgPCBfTUFYX0NPVU5UOgorICAgICAgICBjb3VudCArPSAxCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCisgICAgY291bnQgPSAwCisgICAgd2hpbGUgbGVuKHRocmVhZGluZy5fbGltYm8pICE9IG51bV9saW1ibyBhbmQgY291bnQgPCBfTUFYX0NPVU5UOgorICAgICAgICBjb3VudCArPSAxCisgICAgICAgIHRpbWUuc2xlZXAoMC4xKQorCitkZWYgcmVhcF9jaGlsZHJlbigpOgorICAgICIiIlVzZSB0aGlzIGZ1bmN0aW9uIGF0IHRoZSBlbmQgb2YgdGVzdF9tYWluKCkgd2hlbmV2ZXIgc3ViLXByb2Nlc3NlcworICAgIGFyZSBzdGFydGVkLiAgVGhpcyB3aWxsIGhlbHAgZW5zdXJlIHRoYXQgbm8gZXh0cmEgY2hpbGRyZW4gKHpvbWJpZXMpCisgICAgc3RpY2sgYXJvdW5kIHRvIGhvZyByZXNvdXJjZXMgYW5kIGNyZWF0ZSBwcm9ibGVtcyB3aGVuIGxvb2tpbmcKKyAgICBmb3IgcmVmbGVha3MuCisgICAgIiIiCisKKyAgICAjIFJlYXAgYWxsIG91ciBkZWFkIGNoaWxkIHByb2Nlc3NlcyBzbyB3ZSBkb24ndCBsZWF2ZSB6b21iaWVzIGFyb3VuZC4KKyAgICAjIFRoZXNlIGhvZyByZXNvdXJjZXMgYW5kIG1pZ2h0IGJlIGNhdXNpbmcgc29tZSBvZiB0aGUgYnVpbGRib3RzIHRvIGRpZS4KKyAgICBpbXBvcnQgb3MKKyAgICBpZiBoYXNhdHRyKG9zLCAnd2FpdHBpZCcpOgorICAgICAgICBhbnlfcHJvY2VzcyA9IC0xCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBUaGlzIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIG9uIFdpbmRvd3MuICBUaGF0J3Mgb2suCisgICAgICAgICAgICAgICAgcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGFueV9wcm9jZXNzLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgICAgIGlmIHBpZCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGJyZWFrCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5cy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CmluZGV4IGFlMmExYzguLmYxZjE1MjQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3lzLnB5CkBAIC0yMzcsNiArMjM3LDkwIEBACiAgICAgICAgICAgICBpcyBzeXMuX2dldGZyYW1lKCkuZl9jb2RlCiAgICAgICAgICkKIAorICAgICMgc3lzLl9jdXJyZW50X2ZyYW1lcygpIGlzIGEgQ1B5dGhvbi1vbmx5IGdpbW1pY2suCisgICAgZGVmIHRlc3RfY3VycmVudF9mcmFtZXMoc2VsZik6CisgICAgICAgIGhhdmVfdGhyZWFkcyA9IFRydWUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHRocmVhZAorICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICBoYXZlX3RocmVhZHMgPSBGYWxzZQorCisgICAgICAgIGlmIGhhdmVfdGhyZWFkczoKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9mcmFtZXNfd2l0aF90aHJlYWRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY3VycmVudF9mcmFtZXNfd2l0aG91dF90aHJlYWRzKCkKKworICAgICMgVGVzdCBzeXMuX2N1cnJlbnRfZnJhbWVzKCkgaW4gYSBXSVRIX1RIUkVBRFMgYnVpbGQuCisgICAgZGVmIGN1cnJlbnRfZnJhbWVzX3dpdGhfdGhyZWFkcyhzZWxmKToKKyAgICAgICAgaW1wb3J0IHRocmVhZGluZywgdGhyZWFkCisgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKworICAgICAgICAjIFNwYXduIGEgdGhyZWFkIHRoYXQgYmxvY2tzIGF0IGEga25vd24gcGxhY2UuICBUaGVuIHRoZSBtYWluCisgICAgICAgICMgdGhyZWFkIGRvZXMgc3lzLl9jdXJyZW50X2ZyYW1lcygpLCBhbmQgdmVyaWZpZXMgdGhhdCB0aGUgZnJhbWVzCisgICAgICAgICMgcmV0dXJuZWQgbWFrZSBzZW5zZS4KKyAgICAgICAgZW50ZXJlZF9nID0gdGhyZWFkaW5nLkV2ZW50KCkKKyAgICAgICAgbGVhdmVfZyA9IHRocmVhZGluZy5FdmVudCgpCisgICAgICAgIHRocmVhZF9pbmZvID0gW10gICMgdGhlIHRocmVhZCdzIGlkCisKKyAgICAgICAgZGVmIGYxMjMoKToKKyAgICAgICAgICAgIGc0NTYoKQorCisgICAgICAgIGRlZiBnNDU2KCk6CisgICAgICAgICAgICB0aHJlYWRfaW5mby5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQorICAgICAgICAgICAgZW50ZXJlZF9nLnNldCgpCisgICAgICAgICAgICBsZWF2ZV9nLndhaXQoKQorCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1mMTIzKQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgZW50ZXJlZF9nLndhaXQoKQorCisgICAgICAgICMgQXQgdGhpcyBwb2ludCwgdCBoYXMgZmluaXNoZWQgaXRzIGVudGVyZWRfZy5zZXQoKSwgYWx0aG91Z2ggaXQncworICAgICAgICAjIGltcG9zc2libGUgdG8gZ3Vlc3Mgd2hldGhlciBpdCdzIHN0aWxsIG9uIHRoYXQgbGluZSBvciBoYXMgbW92ZWQgb24KKyAgICAgICAgIyB0byBpdHMgbGVhdmVfZy53YWl0KCkuCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHRocmVhZF9pbmZvKSwgMSkKKyAgICAgICAgdGhyZWFkX2lkID0gdGhyZWFkX2luZm9bMF0KKworICAgICAgICBkID0gc3lzLl9jdXJyZW50X2ZyYW1lcygpCisKKyAgICAgICAgbWFpbl9pZCA9IHRocmVhZC5nZXRfaWRlbnQoKQorICAgICAgICBzZWxmLmFzc2VydF8obWFpbl9pZCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydF8odGhyZWFkX2lkIGluIGQpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgbWFpbi10aHJlYWQgZnJhbWUgaXMgX3RoaXNfIGZyYW1lLgorICAgICAgICBmcmFtZSA9IGQucG9wKG1haW5faWQpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhmcmFtZSBpcyBzeXMuX2dldGZyYW1lKCkpCisKKyAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgdGhyZWFkIGZyYW1lIGlzIGJsb2NrZWQgaW4gZzQ1NiwgY2FsbGVkCisgICAgICAgICMgZnJvbSBmMTIzLiAgVGhpcyBpcyBhIGxpdHRlIHRyaWNreSwgc2luY2UgdmFyaW91cyBiaXRzIG9mCisgICAgICAgICMgdGhyZWFkaW5nLnB5IGFyZSBhbHNvIGluIHRoZSB0aHJlYWQncyBjYWxsIHN0YWNrLgorICAgICAgICBmcmFtZSA9IGQucG9wKHRocmVhZF9pZCkKKyAgICAgICAgc3RhY2sgPSB0cmFjZWJhY2suZXh0cmFjdF9zdGFjayhmcmFtZSkKKyAgICAgICAgZm9yIGksIChmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSwgc291cmNlbGluZSkgaW4gZW51bWVyYXRlKHN0YWNrKToKKyAgICAgICAgICAgIGlmIGZ1bmNuYW1lID09ICJmMTIzIjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJkaWRuJ3QgZmluZCBmMTIzKCkgb24gdGhyZWFkJ3MgY2FsbCBzdGFjayIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3VyY2VsaW5lLCAiZzQ1NigpIikKKworICAgICAgICAjIEFuZCB0aGUgbmV4dCByZWNvcmQgbXVzdCBiZSBmb3IgZzQ1NigpLgorICAgICAgICBmaWxlbmFtZSwgbGluZW5vLCBmdW5jbmFtZSwgc291cmNlbGluZSA9IHN0YWNrW2krMV0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jbmFtZSwgImc0NTYiKQorICAgICAgICBzZWxmLmFzc2VydF8oc291cmNlbGluZSBpbiBbImxlYXZlX2cud2FpdCgpIiwgImVudGVyZWRfZy5zZXQoKSJdKQorCisgICAgICAgICMgUmVhcCB0aGUgc3Bhd25lZCB0aHJlYWQuCisgICAgICAgIGxlYXZlX2cuc2V0KCkKKyAgICAgICAgdC5qb2luKCkKKworICAgICMgVGVzdCBzeXMuX2N1cnJlbnRfZnJhbWVzKCkgd2hlbiB0aHJlYWQgc3VwcG9ydCBkb2Vzbid0IGV4aXN0LgorICAgIGRlZiBjdXJyZW50X2ZyYW1lc193aXRob3V0X3RocmVhZHMoc2VsZik6CisgICAgICAgICMgTm90IG11Y2ggaGFwcGVucyBoZXJlOiAgdGhlcmUgaXMgb25seSBvbmUgdGhyZWFkLCB3aXRoIGFydGlmaWNpYWwKKyAgICAgICAgIyAidGhyZWFkIGlkIiAwLgorICAgICAgICBkID0gc3lzLl9jdXJyZW50X2ZyYW1lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCAxKQorICAgICAgICBzZWxmLmFzc2VydF8oMCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydF8oZFswXSBpcyBzeXMuX2dldGZyYW1lKCkpCisKICAgICBkZWYgdGVzdF9hdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuYXBpX3ZlcnNpb24sIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5hcmd2LCBsaXN0KSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGNsLnB5IGIvTGliL3Rlc3QvdGVzdF90Y2wucHkKaW5kZXggZTNmYmY5OC4uZmExNzBlZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90Y2wucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90Y2wucHkKQEAgLTEzMCwxMCArMTMwLDggQEAKICAgICAgICAgaW1wb3J0IG9zCiAgICAgICAgIG9sZF9kaXNwbGF5ID0gTm9uZQogICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIGlmIChzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnd2luJykgb3IKLSAgICAgICAgICAgICAgICBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnZGFyd2luJykgb3IKLSAgICAgICAgICAgICAgICBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgnY3lnd2luJykpOgotICAgICAgICAgICAgcmV0dXJuICMgbm8gZmFpbHVyZSBwb3NzaWJsZSBvbiB3aW5kb3dzPworICAgICAgICBpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgoJ3dpbicsICdkYXJ3aW4nLCAnY3lnd2luJykpOgorICAgICAgICAgICAgcmV0dXJuICAjIG5vIGZhaWx1cmUgcG9zc2libGUgb24gd2luZG93cz8KICAgICAgICAgaWYgJ0RJU1BMQVknIGluIG9zLmVudmlyb246CiAgICAgICAgICAgICBvbGRfZGlzcGxheSA9IG9zLmVudmlyb25bJ0RJU1BMQVknXQogICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ0RJU1BMQVknXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZXh0d3JhcC5weSBiL0xpYi90ZXN0L3Rlc3RfdGV4dHdyYXAucHkKaW5kZXggNjhlNGQ2ZC4uNTAwZWNlYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZXh0d3JhcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RleHR3cmFwLnB5CkBAIC00NjAsMzggKzQ2MCw0MiBAQAogIyBvZiBJbmRlbnRUZXN0Q2FzZSEKIGNsYXNzIERlZGVudFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAorICAgIGRlZiBhc3NlcnRVbmNoYW5nZWQoc2VsZiwgdGV4dCk6CisgICAgICAgICIiImFzc2VydCB0aGF0IGRlZGVudCgpIGhhcyBubyBlZmZlY3Qgb24gJ3RleHQnIiIiCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHRleHQsIGRlZGVudCh0ZXh0KSkKKwogICAgIGRlZiB0ZXN0X2RlZGVudF9ub21hcmdpbihzZWxmKToKICAgICAgICAgIyBObyBsaW5lcyBpbmRlbnRlZC4KICAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZS5cbkhvdyBhcmUgeW91P1xuT2ggZ29vZCwgSSdtIGdsYWQuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCiAKICAgICAgICAgIyBTaW1pbGFyLCB3aXRoIGEgYmxhbmsgbGluZS4KICAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZS5cblxuQm9vISIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCB0ZXh0KQorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQogCiAgICAgICAgICMgU29tZSBsaW5lcyBpbmRlbnRlZCwgYnV0IG92ZXJhbGwgbWFyZ2luIGlzIHN0aWxsIHplcm8uCiAgICAgICAgIHRleHQgPSAiSGVsbG8gdGhlcmUuXG4gIFRoaXMgaXMgaW5kZW50ZWQuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIHRleHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VW5jaGFuZ2VkKHRleHQpCiAKICAgICAgICAgIyBBZ2FpbiwgYWRkIGEgYmxhbmsgbGluZS4KICAgICAgICAgdGV4dCA9ICJIZWxsbyB0aGVyZS5cblxuICBCb28hXG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKIAogICAgIGRlZiB0ZXN0X2RlZGVudF9ldmVuKHNlbGYpOgogICAgICAgICAjIEFsbCBsaW5lcyBpbmRlbnRlZCBieSB0d28gc3BhY2VzLgogICAgICAgICB0ZXh0ID0gIiAgSGVsbG8gdGhlcmUuXG4gIEhvdyBhcmUgeWE/XG4gIE9oIGdvb2QuIgogICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5Ib3cgYXJlIHlhP1xuT2ggZ29vZC4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAogICAgICAgICAjIFNhbWUsIHdpdGggYmxhbmsgbGluZXMuCiAgICAgICAgIHRleHQgPSAiICBIZWxsbyB0aGVyZS5cblxuICBIb3cgYXJlIHlhP1xuICBPaCBnb29kLlxuIgogICAgICAgICBleHBlY3QgPSAiSGVsbG8gdGhlcmUuXG5cbkhvdyBhcmUgeWE/XG5PaCBnb29kLlxuIgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICAgICAgIyBOb3cgaW5kZW50IG9uZSBvZiB0aGUgYmxhbmsgbGluZXMuCiAgICAgICAgIHRleHQgPSAiICBIZWxsbyB0aGVyZS5cbiAgXG4gIEhvdyBhcmUgeWE/XG4gIE9oIGdvb2QuXG4iCiAgICAgICAgIGV4cGVjdCA9ICJIZWxsbyB0aGVyZS5cblxuSG93IGFyZSB5YT9cbk9oIGdvb2QuXG4iCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlZGVudCh0ZXh0KSwgZXhwZWN0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAogICAgIGRlZiB0ZXN0X2RlZGVudF91bmV2ZW4oc2VsZik6CiAgICAgICAgICMgTGluZXMgaW5kZW50ZWQgdW5ldmVubHkuCkBAIC01MDUsMTggKzUwOSw1MyBAQAogICAgIHdoaWxlIDE6CiAgICAgICAgIHJldHVybiBmb28KICcnJwotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWRlbnQodGV4dCksIGV4cGVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCiAKICAgICAgICAgIyBVbmV2ZW4gaW5kZW50YXRpb24gd2l0aCBhIGJsYW5rIGxpbmUuCiAgICAgICAgIHRleHQgPSAiICBGb29cbiAgICBCYXJcblxuICAgQmF6XG4iCiAgICAgICAgIGV4cGVjdCA9ICJGb29cbiAgQmFyXG5cbiBCYXpcbiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCiAgICAgICAgICMgVW5ldmVuIGluZGVudGF0aW9uIHdpdGggYSB3aGl0ZXNwYWNlLW9ubHkgbGluZS4KICAgICAgICAgdGV4dCA9ICIgIEZvb1xuICAgIEJhclxuIFxuICAgQmF6XG4iCiAgICAgICAgIGV4cGVjdCA9ICJGb29cbiAgQmFyXG5cbiBCYXpcbiIKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVkZW50KHRleHQpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4cGVjdCwgZGVkZW50KHRleHQpKQogCisgICAgIyBkZWRlbnQoKSBzaG91bGQgbm90IG1hbmdsZSBpbnRlcm5hbCB0YWJzCisgICAgZGVmIHRlc3RfZGVkZW50X3ByZXNlcnZlX2ludGVybmFsX3RhYnMoc2VsZik6CisgICAgICAgIHRleHQgPSAiICBoZWxsb1x0dGhlcmVcbiAgaG93IGFyZVx0eW91PyIKKyAgICAgICAgZXhwZWN0ID0gImhlbGxvXHR0aGVyZVxuaG93IGFyZVx0eW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgIyBtYWtlIHN1cmUgdGhhdCBpdCBwcmVzZXJ2ZXMgdGFicyB3aGVuIGl0J3Mgbm90IG1ha2luZyBhbnkKKyAgICAgICAgIyBjaGFuZ2VzIGF0IGFsbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudChleHBlY3QpKQorCisgICAgIyBkZWRlbnQoKSBzaG91bGQgbm90IG1hbmdsZSB0YWJzIGluIHRoZSBtYXJnaW4gKGkuZS4KKyAgICAjIHRhYnMgYW5kIHNwYWNlcyBib3RoIGNvdW50IGFzIG1hcmdpbiwgYnV0IGFyZSAqbm90KgorICAgICMgY29uc2lkZXJlZCBlcXVpdmFsZW50KQorICAgIGRlZiB0ZXN0X2RlZGVudF9wcmVzZXJ2ZV9tYXJnaW5fdGFicyhzZWxmKToKKyAgICAgICAgdGV4dCA9ICIgIGhlbGxvIHRoZXJlXG5cdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRVbmNoYW5nZWQodGV4dCkKKworICAgICAgICAjIHNhbWUgZWZmZWN0IGV2ZW4gaWYgd2UgaGF2ZSA4IHNwYWNlcworICAgICAgICB0ZXh0ID0gIiAgICAgICAgaGVsbG8gdGhlcmVcblx0aG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydFVuY2hhbmdlZCh0ZXh0KQorCisgICAgICAgICMgZGVkZW50KCkgb25seSByZW1vdmVzIHdoaXRlc3BhY2UgdGhhdCBjYW4gYmUgdW5pZm9ybWx5IHJlbW92ZWQhCisgICAgICAgIHRleHQgPSAiXHRoZWxsbyB0aGVyZVxuXHRob3cgYXJlIHlvdT8iCisgICAgICAgIGV4cGVjdCA9ICJoZWxsbyB0aGVyZVxuaG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICB0ZXh0ID0gIiAgXHRoZWxsbyB0aGVyZVxuICBcdGhvdyBhcmUgeW91PyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0LCBkZWRlbnQodGV4dCkpCisKKyAgICAgICAgdGV4dCA9ICIgIFx0ICBoZWxsbyB0aGVyZVxuICBcdCAgaG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKKworICAgICAgICB0ZXh0ID0gIiAgXHRoZWxsbyB0aGVyZVxuICBcdCAgaG93IGFyZSB5b3U/IgorICAgICAgICBleHBlY3QgPSAiaGVsbG8gdGhlcmVcbiAgaG93IGFyZSB5b3U/IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhleHBlY3QsIGRlZGVudCh0ZXh0KSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZC5weSBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CmluZGV4IGVhMzQ1YjYuLmM0YzIxZmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkLnB5CkBAIC0xMTUsMyArMTE1LDQ2IEBACiAgICAgdGhyZWFkLnN0YXJ0X25ld190aHJlYWQodGFzazIsIChpLCkpCiBkb25lLmFjcXVpcmUoKQogcHJpbnQgJ2FsbCB0YXNrcyBkb25lJworCisjIG5vdCBhbGwgcGxhdGZvcm1zIHN1cHBvcnQgY2hhbmdpbmcgdGhyZWFkIHN0YWNrIHNpemUKK3ByaW50ICdcbioqKiBDaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZSAqKionCitpZiB0aHJlYWQuc3RhY2tfc2l6ZSgpICE9IDA6CisgICAgcmFpc2UgVmFsdWVFcnJvciwgImluaXRpYWwgc3RhY2tfc2l6ZSBub3QgMCIKKwordGhyZWFkLnN0YWNrX3NpemUoMCkKK2lmIHRocmVhZC5zdGFja19zaXplKCkgIT0gMDoKKyAgICByYWlzZSBWYWx1ZUVycm9yLCAic3RhY2tfc2l6ZSBub3QgcmVzZXQgdG8gZGVmYXVsdCIKKworZnJvbSBvcyBpbXBvcnQgbmFtZSBhcyBvc19uYW1lCitpZiBvc19uYW1lIGluICgibnQiLCAib3MyIiwgInBvc2l4Iik6CisKKyAgICB0c3Nfc3VwcG9ydGVkID0gMQorICAgIHRyeToKKyAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUoNDA5NikKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcHJpbnQgJ2NhdWdodCBleHBlY3RlZCBWYWx1ZUVycm9yIHNldHRpbmcgc3RhY2tfc2l6ZSg0MDk2KScKKyAgICBleGNlcHQgdGhyZWFkLmVycm9yOgorICAgICAgICB0c3Nfc3VwcG9ydGVkID0gMAorICAgICAgICBwcmludCAncGxhdGZvcm0gZG9lcyBub3Qgc3VwcG9ydCBjaGFuZ2luZyB0aHJlYWQgc3RhY2sgc2l6ZScKKworICAgIGlmIHRzc19zdXBwb3J0ZWQ6CisgICAgICAgIGZhaWxlZCA9IGxhbWJkYSBzLCBlOiBzICE9IGUKKyAgICAgICAgZmFpbF9tc2cgPSAic3RhY2tfc2l6ZSglZCkgZmFpbGVkIC0gc2hvdWxkIHN1Y2NlZWQiCisgICAgICAgIGZvciB0c3MgaW4gKDI2MjE0NCwgMHgxMDAwMDAsIDApOgorICAgICAgICAgICAgdGhyZWFkLnN0YWNrX3NpemUodHNzKQorICAgICAgICAgICAgaWYgZmFpbGVkKHRocmVhZC5zdGFja19zaXplKCksIHRzcyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgZmFpbF9tc2cgJSB0c3MKKyAgICAgICAgICAgIHByaW50ICdzdWNjZXNzZnVsbHkgc2V0IHN0YWNrX3NpemUoJWQpJyAlIHRzcworCisgICAgICAgIGZvciB0c3MgaW4gKDI2MjE0NCwgMHgxMDAwMDApOgorICAgICAgICAgICAgcHJpbnQgJ3RyeWluZyBzdGFja19zaXplID0gJWQnICUgdHNzCisgICAgICAgICAgICBuZXh0X2lkZW50ID0gMAorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobnVtdGFza3MpOgorICAgICAgICAgICAgICAgIG5ld3Rhc2soKQorCisgICAgICAgICAgICBwcmludCAnd2FpdGluZyBmb3IgYWxsIHRhc2tzIHRvIGNvbXBsZXRlJworICAgICAgICAgICAgZG9uZS5hY3F1aXJlKCkKKyAgICAgICAgICAgIHByaW50ICdhbGwgdGFza3MgZG9uZScKKworICAgICAgICAjIHJlc2V0IHN0YWNrIHNpemUgdG8gZGVmYXVsdAorICAgICAgICB0aHJlYWQuc3RhY2tfc2l6ZSgwKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZF9pbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weQppbmRleCAwNjQyZDI1Li42MDJhZDJhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGVkX2ltcG9ydC5weQpAQCAtMzAsMTEgKzMwLDEwIEBACiAgICAgaWYgdmVyYm9zZToKICAgICAgICAgcHJpbnQgInRlc3RpbmcgaW1wb3J0IGhhbmdlcnMgLi4uIiwKIAotICAgIGZyb20gdGVzdCBpbXBvcnQgdGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMKLQorICAgIGltcG9ydCB0ZXN0LnRocmVhZGVkX2ltcG9ydF9oYW5nZXJzCiAgICAgdHJ5OgotICAgICAgICBpZiB0aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnM6Ci0gICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKHRocmVhZGVkX2ltcG9ydF9oYW5nZXJzLmVycm9ycykKKyAgICAgICAgaWYgdGVzdC50aHJlYWRlZF9pbXBvcnRfaGFuZ2Vycy5lcnJvcnM6CisgICAgICAgICAgICByYWlzZSBUZXN0RmFpbGVkKHRlc3QudGhyZWFkZWRfaW1wb3J0X2hhbmdlcnMuZXJyb3JzKQogICAgICAgICBlbGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiT0suIgogICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGVkdGVtcGZpbGUucHkKaW5kZXggNDU5YmEzYS4uOTc0MzMzYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRlZHRlbXBmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGhyZWFkZWR0ZW1wZmlsZS5weQpAQCAtMjIsNyArMjIsNyBAQAogCiBpbXBvcnQgdGhyZWFkICMgSWYgdGhpcyBmYWlscywgd2UgY2FuJ3QgdGVzdCB0aGlzIG1vZHVsZQogaW1wb3J0IHRocmVhZGluZwotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdEZhaWxlZCwgdGhyZWFkaW5nX3NldHVwLCB0aHJlYWRpbmdfY2xlYW51cAogaW1wb3J0IFN0cmluZ0lPCiBmcm9tIHRyYWNlYmFjayBpbXBvcnQgcHJpbnRfZXhjCiBpbXBvcnQgdGVtcGZpbGUKQEAgLTQ4LDYgKzQ4LDcgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRocmVhZHMgPSBbXQorICAgIHRocmVhZF9pbmZvID0gdGhyZWFkaW5nX3NldHVwKCkKIAogICAgIHByaW50ICJDcmVhdGluZyIKICAgICBmb3IgaSBpbiByYW5nZShOVU1fVEhSRUFEUyk6CkBAIC03Miw2ICs3Myw3IEBACiAgICAgaWYgZXJyb3JzOgogICAgICAgICByYWlzZSBUZXN0RmFpbGVkKG1zZykKIAorICAgIHRocmVhZGluZ19jbGVhbnVwKCp0aHJlYWRfaW5mbykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICBpbXBvcnQgc3lzLCBnZXRvcHQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGhyZWFkaW5nLnB5IGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKaW5kZXggN2ViOTc1OC4uNzkzMzVlYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkKQEAgLTg1LDYgKzg1LDMyIEBACiAgICAgICAgICAgICBwcmludCAnYWxsIHRhc2tzIGRvbmUnCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtcnVubmluZy5nZXQoKSwgMCkKIAorICAgICMgcnVuIHdpdGggYSBzbWFsbChpc2gpIHRocmVhZCBzdGFjayBzaXplICgyNTZrQikKKyAgICBkZWYgdGVzdF92YXJpb3VzX29wc19zbWFsbF9zdGFjayhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3aXRoIDI1NmtCIHRocmVhZCBzdGFjayBzaXplLi4uJworICAgICAgICB0cnk6CisgICAgICAgICAgICB0aHJlYWRpbmcuc3RhY2tfc2l6ZSgyNjIxNDQpCisgICAgICAgIGV4Y2VwdCB0aHJlYWQuZXJyb3I6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGVzdF92YXJpb3VzX29wcygpCisgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDApCisKKyAgICAjIHJ1biB3aXRoIGEgbGFyZ2UgdGhyZWFkIHN0YWNrIHNpemUgKDFNQikKKyAgICBkZWYgdGVzdF92YXJpb3VzX29wc19sYXJnZV9zdGFjayhzZWxmKToKKyAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICd3aXRoIDFNQiB0aHJlYWQgc3RhY2sgc2l6ZS4uLicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdGhyZWFkaW5nLnN0YWNrX3NpemUoMHgxMDAwMDApCisgICAgICAgIGV4Y2VwdCB0aHJlYWQuZXJyb3I6CisgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICdwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IGNoYW5naW5nIHRocmVhZCBzdGFjayBzaXplJworICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudGVzdF92YXJpb3VzX29wcygpCisgICAgICAgIHRocmVhZGluZy5zdGFja19zaXplKDApCisKICAgICBkZWYgdGVzdF9mb3JlaWduX3RocmVhZChzZWxmKToKICAgICAgICAgIyBDaGVjayB0aGF0IGEgImZvcmVpZ24iIHRocmVhZCBjYW4gdXNlIHRoZSB0aHJlYWRpbmcgbW9kdWxlLgogICAgICAgICBkZWYgZihtdXRleCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWUucHkKaW5kZXggNzY4ZTdhMC4uZjRiZTc1OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQpAQCAtMzksOSArMzksOSBAQAogCiAgICAgZGVmIHRlc3Rfc3RyZnRpbWVfYm91bmRzX2NoZWNraW5nKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHN0cmZ0aW1lKCkgY2hlY2tzIHRoZSBib3VuZHMgb2YgdGhlIHZhcmlvdXMgcGFydHMKLSAgICAgICAgI29mIHRoZSB0aW1lIHR1cGxlLgorICAgICAgICAjb2YgdGhlIHRpbWUgdHVwbGUgKDAgaXMgdmFsaWQgZm9yICphbGwqIHZhbHVlcykuCiAKLSAgICAgICAgIyBDaGVjayB5ZWFyCisgICAgICAgICMgQ2hlY2sgeWVhciBbMTkwMCwgbWF4KGludCldCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxODk5LCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIGlmIHRpbWUuYWNjZXB0MmR5ZWFyOgpAQCAtNDksMjcgKzQ5LDI3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTEpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxMDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKLSAgICAgICAgIyBDaGVjayBtb250aAorICAgICAgICAjIENoZWNrIG1vbnRoIFsxLCAxMl0gKyB6ZXJvIHN1cHBvcnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDAsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgLTEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEzLCAxLCAwLCAwLCAwLCAwLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgZGF5IG9mIG1vbnRoCisgICAgICAgICMgQ2hlY2sgZGF5IG9mIG1vbnRoIFsxLCAzMV0gKyB6ZXJvIHN1cHBvcnQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDAsIDAsIDAsIDAsIDAsIDEsIC0xKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgLTEsIDAsIDAsIDAsIDAsIDEsIC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDMyLCAwLCAwLCAwLCAwLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgaG91cgorICAgICAgICAjIENoZWNrIGhvdXIgWzAsIDIzXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgLTEsIDAsIDAsIDAsIDEsIC0xKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDI0LCAwLCAwLCAwLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgbWludXRlCisgICAgICAgICMgQ2hlY2sgbWludXRlIFswLCA1OV0KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIC0xLCAwLCAwLCAxLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCA2MCwgMCwgMCwgMSwgLTEpKQotICAgICAgICAjIENoZWNrIHNlY29uZAorICAgICAgICAjIENoZWNrIHNlY29uZCBbMCwgNjFdCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAtMSwgMCwgMSwgLTEpKQogICAgICAgICAjIEM5OSBvbmx5IHJlcXVpcmVzIGFsbG93aW5nIGZvciBvbmUgbGVhcCBzZWNvbmQsIGJ1dCBQeXRob24ncyBkb2NzIHNheQpAQCAtODIsMTcgKzgyLDI1IEBACiAgICAgICAgICMgIG1vZHVsby4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdGltZS5zdHJmdGltZSwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIC0yLCAxLCAtMSkpCi0gICAgICAgICMgQ2hlY2sgZGF5IG9mIHRoZSB5ZWFyCisgICAgICAgICMgQ2hlY2sgZGF5IG9mIHRoZSB5ZWFyIFsxLCAzNjZdICsgemVybyBzdXBwb3J0CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAtMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIC0xLCAtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHRpbWUuc3RyZnRpbWUsICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxOTAwLCAxLCAxLCAwLCAwLCAwLCAwLCAzNjcsIC0xKSkKLSAgICAgICAgIyBDaGVjayBkYXlsaWdodCBzYXZpbmdzIGZsYWcKKyAgICAgICAgIyBDaGVjayBkYXlsaWdodCBzYXZpbmdzIGZsYWcgWy0xLCAxXQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLTIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0aW1lLnN0cmZ0aW1lLCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMTkwMCwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgMikpCiAKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3ZhbHVlc19mb3JfemVybyhzZWxmKToKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB1c2luZyBhbGwgemVyb3MgdXNlcyB0aGUgcHJvcGVyIGRlZmF1bHQgdmFsdWVzLgorICAgICAgICAjIE5vIHRlc3QgZm9yIGRheWxpZ2h0IHNhdmluZ3Mgc2luY2Ugc3RyZnRpbWUoKSBkb2VzIG5vdCBjaGFuZ2Ugb3V0cHV0CisgICAgICAgICMgYmFzZWQgb24gaXRzIHZhbHVlLgorICAgICAgICBleHBlY3RlZCA9ICIyMDAwIDAxIDAxIDAwIDAwIDAwIDEgMDAxIgorICAgICAgICByZXN1bHQgPSB0aW1lLnN0cmZ0aW1lKCIlWSAlbSAlZCAlSCAlTSAlUyAldyAlaiIsICgwLCkqOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdCkKKwogICAgIGRlZiB0ZXN0X3N0cnB0aW1lKHNlbGYpOgogICAgICAgICB0dCA9IHRpbWUuZ210aW1lKHNlbGYudCkKICAgICAgICAgZm9yIGRpcmVjdGl2ZSBpbiAoJ2EnLCAnQScsICdiJywgJ0InLCAnYycsICdkJywgJ0gnLCAnSScsCkBAIC0xOTMsMTMgKzIwMSwxNyBAQAogICAgICAgICB0aW1lLmN0aW1lKE5vbmUpCiAKICAgICBkZWYgdGVzdF9nbXRpbWVfd2l0aG91dF9hcmcoc2VsZik6Ci0gICAgICAgIHQwID0gdGltZS5ta3RpbWUodGltZS5nbXRpbWUoKSkKLSAgICAgICAgdDEgPSB0aW1lLm1rdGltZSh0aW1lLmdtdGltZShOb25lKSkKKyAgICAgICAgZ3QwID0gdGltZS5nbXRpbWUoKQorICAgICAgICBndDEgPSB0aW1lLmdtdGltZShOb25lKQorICAgICAgICB0MCA9IHRpbWUubWt0aW1lKGd0MCkKKyAgICAgICAgdDEgPSB0aW1lLm1rdGltZShndDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9ICh0MS10MCkgPCAwLjIpCiAKICAgICBkZWYgdGVzdF9sb2NhbHRpbWVfd2l0aG91dF9hcmcoc2VsZik6Ci0gICAgICAgIHQwID0gdGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoKSkKLSAgICAgICAgdDEgPSB0aW1lLm1rdGltZSh0aW1lLmxvY2FsdGltZShOb25lKSkKKyAgICAgICAgbHQwID0gdGltZS5sb2NhbHRpbWUoKQorICAgICAgICBsdDEgPSB0aW1lLmxvY2FsdGltZShOb25lKQorICAgICAgICB0MCA9IHRpbWUubWt0aW1lKGx0MCkKKyAgICAgICAgdDEgPSB0aW1lLm1rdGltZShsdDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9ICh0MS10MCkgPCAwLjIpCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQppbmRleCA0MzA5ZThjLi4yYjMyYjkyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CkBAIC0xMDAsNyArMTAwLDcgQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgc2VsZi5zb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQotICAgICAgICBzZWxmLmFkZHJfcmVtb3RlID0gKCd3d3cucHl0aG9uLm9yZycsIDgwKQorICAgICAgICBzZWxmLmFkZHJfcmVtb3RlID0gKCd3d3cucHl0aG9uLm9yZy4nLCA4MCkKICAgICAgICAgc2VsZi5hZGRyX2xvY2FsICA9ICgnMTI3LjAuMC4xJywgMjUzMzkpCiAKICAgICBkZWYgdGVhckRvd24oc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQppbmRleCA0Zjk0NmY3Li4wOGFlYzhlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKQEAgLTI0NCw4ICsyNDQsOCBAQAogICAgICAgICBzZWxmLnJ1bl90ZXN0KG9uZV9pbnN0cl9saW5lKQogICAgIGRlZiB0ZXN0XzA0X25vX3BvcF9ibG9ja3Moc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX2Jsb2NrcykKLSMjICAgIGRlZiB0ZXN0XzA1X25vX3BvcF90b3BzKHNlbGYpOgotIyMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX3RvcHMpCisgICAgZGVmIHRlc3RfMDVfbm9fcG9wX3RvcHMoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX3RvcHMpCiAgICAgZGVmIHRlc3RfMDZfY2FsbChzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdChjYWxsKQogICAgIGRlZiB0ZXN0XzA3X3JhaXNlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQppbmRleCAxYjU5Zjk4Li5iM2M1YTUwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RyYWNlYmFjay5weQpAQCAtMzEsOCArMzEsOSBAQAogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX3dpdGhfY2FyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSA0KQotICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkgIyB0aGlyZCBsaW5lIGhhcyBjYXJldAogICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gInJldHVybiB4ISIpCisgICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0CisgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uZmluZCgiISIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCiAKICAgICBkZWYgdGVzdF9ub2NhcmV0KHNlbGYpOgogICAgICAgICBpZiBpc19qeXRob246CkBAIC00Nyw4ICs0OCw5IEBACiAgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uRXJyb3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSA0KQotICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJwcmludCAyIikKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uZmluZCgiMiIpID09IGVyclsyXS5maW5kKCJeIikpCiAKICAgICBkZWYgdGVzdF9idWc3Mzc0NzMoc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMsIG9zLCB0ZW1wZmlsZSwgdGltZQpAQCAtMTA5LDYgKzExMSw0NSBAQAogICAgICAgICBsc3QgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KGUuX19jbGFzc19fLCBlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzdCwgWydLZXlib2FyZEludGVycnVwdFxuJ10pCiAKKyAgICAjIFN0cmluZyBleGNlcHRpb25zIGFyZSBkZXByZWNhdGVkLCBidXQgbGVnYWwuICBUaGUgcXVpcmt5IGZvcm0gd2l0aAorICAgICMgc2VwYXJhdGUgInR5cGUiIGFuZCAidmFsdWUiIHRlbmRzIHRvIGJyZWFrIHRoaW5ncywgYmVjYXVzZQorICAgICMgICAgIG5vdCBpc2luc3RhbmNlKHZhbHVlLCB0eXBlKQorICAgICMgYW5kIGEgc3RyaW5nIGNhbm5vdCBiZSB0aGUgZmlyc3QgYXJndW1lbnQgdG8gaXNzdWJjbGFzcy4KKyAgICAjCisgICAgIyBOb3RlIHRoYXQgc3lzLmxhc3RfdHlwZSBhbmQgc3lzLmxhc3RfdmFsdWUgZG8gbm90IGdldCBzZXQgaWYgYW4KKyAgICAjIGV4Y2VwdGlvbiBpcyBjYXVnaHQsIHNvIHdlIHNvcnQgb2YgY2hlYXQgYW5kIGp1c3QgZW11bGF0ZSB0aGVtLgorICAgICMKKyAgICAjIHRlc3Rfc3RyaW5nX2V4Y2VwdGlvbjEgaXMgZXF1aXZhbGVudCB0bworICAgICMKKyAgICAjID4+PiByYWlzZSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAjCisgICAgIyB0ZXN0X3N0cmluZ19leGNlcHRpb24yIGlzIGVxdWl2YWxlbnQgdG8KKyAgICAjCisgICAgIyA+Pj4gcmFpc2UgIlN0cmluZyBFeGNlcHRpb24iLCAiU3RyaW5nIFZhbHVlIgorICAgICMKKyAgICBkZWYgdGVzdF9zdHJpbmdfZXhjZXB0aW9uMShzZWxmKToKKyAgICAgICAgc3RyX3R5cGUgPSAiU3RyaW5nIEV4Y2VwdGlvbiIKKyAgICAgICAgZXJyID0gdHJhY2ViYWNrLmZvcm1hdF9leGNlcHRpb25fb25seShzdHJfdHlwZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMF0sIHN0cl90eXBlICsgJ1xuJykKKworICAgIGRlZiB0ZXN0X3N0cmluZ19leGNlcHRpb24yKHNlbGYpOgorICAgICAgICBzdHJfdHlwZSA9ICJTdHJpbmcgRXhjZXB0aW9uIgorICAgICAgICBzdHJfdmFsdWUgPSAiU3RyaW5nIFZhbHVlIgorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KHN0cl90eXBlLCBzdHJfdmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVyciksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyWzBdLCBzdHJfdHlwZSArICc6ICcgKyBzdHJfdmFsdWUgKyAnXG4nKQorCisgICAgZGVmIHRlc3RfZm9ybWF0X2V4Y2VwdGlvbl9vbmx5X2JhZF9fc3RyX18oc2VsZik6CisgICAgICAgIGNsYXNzIFgoRXhjZXB0aW9uKToKKyAgICAgICAgICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIDEvMAorICAgICAgICBlcnIgPSB0cmFjZWJhY2suZm9ybWF0X2V4Y2VwdGlvbl9vbmx5KFgsIFgoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXJyKSwgMSkKKyAgICAgICAgc3RyX3ZhbHVlID0gJzx1bnByaW50YWJsZSAlcyBvYmplY3Q+JyAlIFguX19uYW1lX18KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnJbMF0sIFguX19uYW1lX18gKyAnOiAnICsgc3RyX3ZhbHVlICsgJ1xuJykKKworCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFRyYWNlYmFja0Nhc2VzKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5IGIvTGliL3Rlc3QvdGVzdF90eXBlcy5weQppbmRleCBjNTc1YzBjLi4yZDI5OWMzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHlwZXMucHkKQEAgLTIzMyw2ICsyMzMsNyBAQAogdHJ5OiBidWZmZXIoJ2FzZGYnLCAtMSkKIGV4Y2VwdCBWYWx1ZUVycm9yOiBwYXNzCiBlbHNlOiByYWlzZSBUZXN0RmFpbGVkLCAiYnVmZmVyKCdhc2RmJywgLTEpIHNob3VsZCByYWlzZSBWYWx1ZUVycm9yIgorY21wKGJ1ZmZlcigiYWJjIiksIGJ1ZmZlcigiZGVmIikpICMgdXNlZCB0byByYWlzZSBhIHdhcm5pbmc6IHRwX2NvbXBhcmUgZGlkbid0IHJldHVybiAtMSwgMCwgb3IgMQogCiB0cnk6IGJ1ZmZlcihOb25lKQogZXhjZXB0IFR5cGVFcnJvcjogcGFzcwpAQCAtMjc2LDMgKzI3NywxMCBAQAogdHJ5OiBhWzA6MV0gPSAnZycKIGV4Y2VwdCBUeXBlRXJyb3I6IHBhc3MKIGVsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJidWZmZXIgc2xpY2UgYXNzaWdubWVudCBzaG91bGQgcmFpc2UgVHlwZUVycm9yIgorCisjIGFycmF5LmFycmF5KCkgcmV0dXJucyBhbiBvYmplY3QgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYSBjaGFyIGJ1ZmZlciwKKyMgc29tZXRoaW5nIHdoaWNoIGludCgpIHVzZXMgZm9yIGNvbnZlcnNpb24uCitpbXBvcnQgYXJyYXkKK3RyeTogaW50KGJ1ZmZlcihhcnJheS5hcnJheSgnYycpKSkKK2V4Y2VwdCBUeXBlRXJyb3IgOnBhc3MKK2Vsc2U6IHJhaXNlIFRlc3RGYWlsZWQsICJjaGFyIGJ1ZmZlciAoYXQgQyBsZXZlbCkgbm90IHdvcmtpbmciCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKaW5kZXggMDM0YjlkMC4uNjcyMThiOCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQpAQCAtNjc2LDExICs2NzYsMTEgQEAKICAgICAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoMjAwLCAiT0siLCB7fSwgIiIpCiAgICAgICAgICAgICBuZXdyZXEgPSBoLmRvX3JlcXVlc3RfKHJlcSkKICAgICAgICAgICAgIGlmIGRhdGEgaXMgTm9uZTogICMgR0VUCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LWxlbmd0aCIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtdHlwZSIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oIkNvbnRlbnQtTGVuZ3RoIiBub3QgaW4gcmVxLnVucmVkaXJlY3RlZF9oZHJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC1UeXBlIiBub3QgaW4gcmVxLnVucmVkaXJlY3RlZF9oZHJzKQogICAgICAgICAgICAgZWxzZTogICMgUE9TVAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LWxlbmd0aCJdLCAiMCIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtdHlwZSJdLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LUxlbmd0aCJdLCAiMCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtVHlwZSJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKICAgICAgICAgICAgICMgWFhYIHRoZSBkZXRhaWxzIG9mIEhvc3QgY291bGQgYmUgYmV0dGVyIHRlc3RlZAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkhvc3QiXSwgImV4YW1wbGUuY29tIikKQEAgLTY5Miw4ICs2OTIsOCBAQAogICAgICAgICAgICAgcmVxLmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCJIb3N0IiwgImJheiIpCiAgICAgICAgICAgICByZXEuYWRkX3VucmVkaXJlY3RlZF9oZWFkZXIoIlNwYW0iLCAiZm9vIikKICAgICAgICAgICAgIG5ld3JlcSA9IGguZG9fcmVxdWVzdF8ocmVxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtbGVuZ3RoIl0sICJmb28iKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudW5yZWRpcmVjdGVkX2hkcnNbIkNvbnRlbnQtdHlwZSJdLCAiYmFyIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LUxlbmd0aCJdLCAiZm9vIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LVR5cGUiXSwgImJhciIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siSG9zdCJdLCAiYmF6IikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJTcGFtIl0sICJmb28iKQogCkBAIC04NDcsNyArODQ3LDcgQEAKICAgICAgICAgICAgIDQwNywgJ1Byb3h5LUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09IiVzIlxyXG5cclxuJyAlIHJlYWxtKQogICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoYXV0aF9oYW5kbGVyKQogICAgICAgICBvcGVuZXIuYWRkX2hhbmRsZXIoaHR0cF9oYW5kbGVyKQotICAgICAgICBzZWxmLl90ZXN0X2Jhc2ljX2F1dGgob3BlbmVyLCBhdXRoX2hhbmRsZXIsICJQcm94eS1hdXRob3JpemF0aW9uIiwKKyAgICAgICAgc2VsZi5fdGVzdF9iYXNpY19hdXRoKG9wZW5lciwgYXV0aF9oYW5kbGVyLCAiUHJveHktQXV0aG9yaXphdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFsbSwgaHR0cF9oYW5kbGVyLCBwYXNzd29yZF9tYW5hZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9hY21lLmV4YW1wbGUuY29tOjMxMjgvcHJvdGVjdGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm94eS5leGFtcGxlLmNvbTozMTI4IiwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQppbmRleCBkYzNkMzZkLi4wMGNmMjAyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gd2lsbCBiZSBzcGFyZWQgdG8gc2VydmUgaXRzIGRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXJwb3NlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVybGxpYjIudXJsb3BlbiwgImh0dHA6Ly93d3cuc2FkZmxranNhc2FkZi5jb20vIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51cmxvcGVuLCAiaHR0cDovL3d3dy5weXRob24uaW52YWxpZC8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIyLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5pbnZhbGlkLi8iKQogCiAKIGNsYXNzIE90aGVyTmV0d29ya1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTE2MCw4ICsxNjAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsbGliMiQiKQogICAgICAgICB1cmxzID0gWwogICAgICAgICAgICAgIyBUaGFua3MgdG8gRnJlZCBmb3IgZmluZGluZyB0aGVzZSEKLSAgICAgICAgICAgICdnb3BoZXI6Ly9nb3BoZXIubGliLm5jc3UuZWR1LzExL2xpYnJhcnkvc3RhY2tzL0FsZXgnLAotICAgICAgICAgICAgJ2dvcGhlcjovL2dvcGhlci52dC5lZHU6MTAwMTAvMTAvMzMnLAorICAgICAgICAgICAgJ2dvcGhlcjovL2dvcGhlci5saWIubmNzdS5lZHUuLzExL2xpYnJhcnkvc3RhY2tzL0FsZXgnLAorICAgICAgICAgICAgJ2dvcGhlcjovL2dvcGhlci52dC5lZHUuOjEwMDEwLzEwLzMzJywKICAgICAgICAgICAgIF0KICAgICAgICAgc2VsZi5fdGVzdF91cmxzKHVybHMsIHNlbGYuX2V4dHJhX2hhbmRsZXJzKCkpCiAKQEAgLTE3Niw3ICsxNzYsNyBAQAogCiAgICAgICAgICAgICAgICAgIyBYWFggYnVnLCBzaG91bGQgcmFpc2UgVVJMRXJyb3IKICAgICAgICAgICAgICAgICAjKCdmaWxlOi8vbm9uc2Vuc2VuYW1lL2V0Yy9wYXNzd2QnLCBOb25lLCB1cmxsaWIyLlVSTEVycm9yKQotICAgICAgICAgICAgICAgICgnZmlsZTovL25vbnNlbnNlbmFtZS9ldGMvcGFzc3dkJywgTm9uZSwgKE9TRXJyb3IsIHNvY2tldC5lcnJvcikpCisgICAgICAgICAgICAgICAgKCdmaWxlOi8vbm9uc2Vuc2VuYW1lL2V0Yy9wYXNzd2QnLCBOb25lLCAoRW52aXJvbm1lbnRFcnJvciwgc29ja2V0LmVycm9yKSkKICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICBzZWxmLl90ZXN0X3VybHModXJscywgc2VsZi5fZXh0cmFfaGFuZGxlcnMoKSkKICAgICAgICAgZmluYWxseToKQEAgLTIzOSw3ICsyMzksOSBAQAogICAgICAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBzb2NrZXQuZXJyb3IsIE9TRXJyb3IpLCBlcnI6CiAgICAgICAgICAgICAgICAgZGVidWcoZXJyKQogICAgICAgICAgICAgICAgIGlmIGV4cGVjdGVkX2VycjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpKQorICAgICAgICAgICAgICAgICAgICBtc2cgPSAoIkRpZG4ndCBnZXQgZXhwZWN0ZWQgZXJyb3IocykgJXMgZm9yICVzICVzLCBnb3QgJXMiICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHBlY3RlZF9lcnIsIHVybCwgcmVxLCBlcnIpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlcnIsIGV4cGVjdGVkX2VyciksIG1zZykKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgYnVmID0gZi5yZWFkKCkKICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKQEAgLTI1OSw3ICsyNjEsNiBAQAogICAgICAgICByZXR1cm4gaGFuZGxlcnMKIAogCi0KIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoIm5ldHdvcmsiKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVVJMVGltZW91dFRlc3QsIHVybG9wZW5OZXR3b3JrVGVzdHMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CmluZGV4IDgwNzYxZGYuLjkxMDVhZmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGlibmV0LnB5CkBAIC0xMTAsNyArMTEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBkb21haW4gd2lsbCBiZSBzcGFyZWQgdG8gc2VydmUgaXRzIGRlZmluZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBwdXJwb3NlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAjIHVybGxpYi51cmxvcGVuLCAiaHR0cDovL3d3dy5zYWRmbGtqc2FzYWRmLmNvbS8iKQotICAgICAgICAgICAgICAgICAgICAgICAgICB1cmxsaWIudXJsb3BlbiwgImh0dHA6Ly93d3cucHl0aG9uLmludmFsaWQvIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsbGliLnVybG9wZW4sICJodHRwOi8vd3d3LnB5dGhvbi5pbnZhbGlkLi8iKQogCiBjbGFzcyB1cmxyZXRyaWV2ZU5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdHMgdXJsbGliLnVybHJldHJpZXZlIHVzaW5nIHRoZSBuZXR3b3JrLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91dWlkLnB5IGIvTGliL3Rlc3QvdGVzdF91dWlkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ODZjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3V1aWQucHkKQEAgLTAsMCArMSw0MzQgQEAKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlCitmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IHV1aWQKKworZGVmIGltcG9ydGFibGUobmFtZSk6CisgICAgdHJ5OgorICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZXhjZXB0OgorICAgICAgICByZXR1cm4gRmFsc2UKKworY2xhc3MgVGVzdFVVSUQoVGVzdENhc2UpOgorICAgIGxhc3Rfbm9kZSA9IE5vbmUKKyAgICBzb3VyY2Uybm9kZSA9IHt9CisKKyAgICBkZWYgdGVzdF9VVUlEKHNlbGYpOgorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYXNjZW5kaW5nID0gW10KKyAgICAgICAgZm9yIChzdHJpbmcsIGN1cmx5LCBoZXgsIGJ5dGVzLCBmaWVsZHMsIGludGVnZXIsIHVybiwKKyAgICAgICAgICAgICB0aW1lLCBjbG9ja19zZXEsIHZhcmlhbnQsIHZlcnNpb24pIGluIFsKKyAgICAgICAgICAgICgnMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJywKKyAgICAgICAgICAgICAnezAwMDAwMDAwLTAwMDAtMDAwMC0wMDAwLTAwMDAwMDAwMDAwMH0nLAorICAgICAgICAgICAgICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCcsCisgICAgICAgICAgICAgJ1wwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwXDBcMFwwJywKKyAgICAgICAgICAgICAoMCwgMCwgMCwgMCwgMCwgMCksCisgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwJywKKyAgICAgICAgICAgICAwLCAwLCB1dWlkLlJFU0VSVkVEX05DUywgTm9uZSksCisgICAgICAgICAgICAoJzAwMDEwMjAzLTA0MDUtMDYwNy0wODA5LTBhMGIwYzBkMGUwZicsCisgICAgICAgICAgICAgJ3swMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGZ9JywKKyAgICAgICAgICAgICAnMDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgICdcMFx4MDFceDAyXHgwM1x4MDRceDA1XHgwNlx4MDdceDA4XHRcblx4MGJceDBjXHgwZFx4MGVceDBmJywKKyAgICAgICAgICAgICAoMHgwMDAxMDIwM0wsIDB4MDQwNSwgMHgwNjA3LCA4LCA5LCAweDBhMGIwYzBkMGUwZkwpLAorICAgICAgICAgICAgIDB4MDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGZMLAorICAgICAgICAgICAgICd1cm46dXVpZDowMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnLAorICAgICAgICAgICAgIDB4NjA3MDQwNTAwMDEwMjAzTCwgMHg4MDksIHV1aWQuUkVTRVJWRURfTkNTLCBOb25lKSwKKyAgICAgICAgICAgICgnMDJkOWU2ZDUtOTQ2Ny0zODJlLThmOWItOTMwMGE2NGFjM2NkJywKKyAgICAgICAgICAgICAnezAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZH0nLAorICAgICAgICAgICAgICcwMmQ5ZTZkNTk0NjczODJlOGY5YjkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgJ1x4MDJceGQ5XHhlNlx4ZDVceDk0XHg2N1x4MzhceDJlXHg4Zlx4OWJceDkzXHgwMFx4YTZceDRhXHhjM1x4Y2QnLAorICAgICAgICAgICAgICgweDAyZDllNmQ1TCwgMHg5NDY3LCAweDM4MmUsIDB4OGYsIDB4OWIsIDB4OTMwMGE2NGFjM2NkTCksCisgICAgICAgICAgICAgMHgwMmQ5ZTZkNTk0NjczODJlOGY5YjkzMDBhNjRhYzNjZEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjAyZDllNmQ1LTk0NjctMzgyZS04ZjliLTkzMDBhNjRhYzNjZCcsCisgICAgICAgICAgICAgMHg4MmU5NDY3MDJkOWU2ZDVMLCAweGY5YiwgdXVpZC5SRkNfNDEyMiwgMyksCisgICAgICAgICAgICAoJzEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcsCisgICAgICAgICAgICAgJ3sxMjM0NTY3OC0xMjM0LTU2NzgtMTIzNC01Njc4MTIzNDU2Nzh9JywKKyAgICAgICAgICAgICAnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgnLAorICAgICAgICAgICAgICdceDEyXHgzNFx4NTZceDc4Jyo0LAorICAgICAgICAgICAgICgweDEyMzQ1Njc4LCAweDEyMzQsIDB4NTY3OCwgMHgxMiwgMHgzNCwgMHg1Njc4MTIzNDU2NzgpLAorICAgICAgICAgICAgIDB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjEyMzQ1Njc4LTEyMzQtNTY3OC0xMjM0LTU2NzgxMjM0NTY3OCcsCisgICAgICAgICAgICAgMHg2NzgxMjM0MTIzNDU2NzhMLCAweDEyMzQsIHV1aWQuUkVTRVJWRURfTkNTLCBOb25lKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTAtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxMDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTBceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODEwTCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxMDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTBMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxMTlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTFceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODExTCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxMTlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODExLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTFMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTItOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxMjlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTJceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODEyTCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxMjlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODEyLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTJMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnNmJhN2I4MTQtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JywKKyAgICAgICAgICAgICAnezZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOH0nLAorICAgICAgICAgICAgICc2YmE3YjgxNDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgJ1x4NmJceGE3XHhiOFx4MTRceDlkXHhhZFx4MTFceGQxXHg4MFx4YjRceDAwXHhjMFx4NGZceGQ0XHgzMFx4YzgnLAorICAgICAgICAgICAgICgweDZiYTdiODE0TCwgMHg5ZGFkLCAweDExZDEsIDB4ODAsIDB4YjQsIDB4MDBjMDRmZDQzMGM4TCksCisgICAgICAgICAgICAgMHg2YmE3YjgxNDlkYWQxMWQxODBiNDAwYzA0ZmQ0MzBjOEwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjZiYTdiODE0LTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcsCisgICAgICAgICAgICAgMHgxZDE5ZGFkNmJhN2I4MTRMLCAweGI0LCB1dWlkLlJGQ180MTIyLCAxKSwKKyAgICAgICAgICAgICgnN2Q0NDQ4NDAtOWRjMC0xMWQxLWIyNDUtNWZmZGNlNzRmYWQyJywKKyAgICAgICAgICAgICAnezdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMn0nLAorICAgICAgICAgICAgICc3ZDQ0NDg0MDlkYzAxMWQxYjI0NTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgJ1x4N2RceDQ0XHg0OFx4NDBceDlkXHhjMFx4MTFceGQxXHhiMlx4NDVceDVmXHhmZFx4Y2VceDc0XHhmYVx4ZDInLAorICAgICAgICAgICAgICgweDdkNDQ0ODQwTCwgMHg5ZGMwLCAweDExZDEsIDB4YjIsIDB4NDUsIDB4NWZmZGNlNzRmYWQyTCksCisgICAgICAgICAgICAgMHg3ZDQ0NDg0MDlkYzAxMWQxYjI0NTVmZmRjZTc0ZmFkMkwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOjdkNDQ0ODQwLTlkYzAtMTFkMS1iMjQ1LTVmZmRjZTc0ZmFkMicsCisgICAgICAgICAgICAgMHgxZDE5ZGMwN2Q0NDQ4NDBMLCAweDMyNDUsIHV1aWQuUkZDXzQxMjIsIDEpLAorICAgICAgICAgICAgKCdlOTAyODkzYS05ZDIyLTNjN2UtYTdiOC1kNmUzMTNiNzFkOWYnLAorICAgICAgICAgICAgICd7ZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmfScsCisgICAgICAgICAgICAgJ2U5MDI4OTNhOWQyMjNjN2VhN2I4ZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAnXHhlOVx4MDJceDg5XHgzYVx4OWRceDIyXHgzY1x4N2VceGE3XHhiOFx4ZDZceGUzXHgxM1x4YjdceDFkXHg5ZicsCisgICAgICAgICAgICAgKDB4ZTkwMjg5M2FMLCAweDlkMjIsIDB4M2M3ZSwgMHhhNywgMHhiOCwgMHhkNmUzMTNiNzFkOWZMKSwKKyAgICAgICAgICAgICAweGU5MDI4OTNhOWQyMjNjN2VhN2I4ZDZlMzEzYjcxZDlmTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZTkwMjg5M2EtOWQyMi0zYzdlLWE3YjgtZDZlMzEzYjcxZDlmJywKKyAgICAgICAgICAgICAweGM3ZTlkMjJlOTAyODkzYUwsIDB4MjdiOCwgdXVpZC5SRkNfNDEyMiwgMyksCisgICAgICAgICAgICAoJ2ViNDI0MDI2LTZmNTQtNGVmOC1hNGQwLWJiNjU4YTFmYzZjZicsCisgICAgICAgICAgICAgJ3tlYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2Z9JywKKyAgICAgICAgICAgICAnZWI0MjQwMjY2ZjU0NGVmOGE0ZDBiYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgICdceGViXHg0Mlx4NDBceDI2XHg2Zlx4NTRceDRlXHhmOFx4YTRceGQwXHhiYlx4NjVceDhhXHgxZlx4YzZceGNmJywKKyAgICAgICAgICAgICAoMHhlYjQyNDAyNkwsIDB4NmY1NCwgMHg0ZWY4LCAweGE0LCAweGQwLCAweGJiNjU4YTFmYzZjZkwpLAorICAgICAgICAgICAgIDB4ZWI0MjQwMjY2ZjU0NGVmOGE0ZDBiYjY1OGExZmM2Y2ZMLAorICAgICAgICAgICAgICd1cm46dXVpZDplYjQyNDAyNi02ZjU0LTRlZjgtYTRkMC1iYjY1OGExZmM2Y2YnLAorICAgICAgICAgICAgIDB4ZWY4NmY1NGViNDI0MDI2TCwgMHgyNGQwLCB1dWlkLlJGQ180MTIyLCA0KSwKKyAgICAgICAgICAgICgnZjgxZDRmYWUtN2RlYy0xMWQwLWE3NjUtMDBhMGM5MWU2YmY2JywKKyAgICAgICAgICAgICAne2Y4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNn0nLAorICAgICAgICAgICAgICdmODFkNGZhZTdkZWMxMWQwYTc2NTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgJ1x4ZjhceDFkXHg0Zlx4YWVceDdkXHhlY1x4MTFceGQwXHhhN1x4NjVceDAwXHhhMFx4YzlceDFlXHg2Ylx4ZjYnLAorICAgICAgICAgICAgICgweGY4MWQ0ZmFlTCwgMHg3ZGVjLCAweDExZDAsIDB4YTcsIDB4NjUsIDB4MDBhMGM5MWU2YmY2TCksCisgICAgICAgICAgICAgMHhmODFkNGZhZTdkZWMxMWQwYTc2NTAwYTBjOTFlNmJmNkwsCisgICAgICAgICAgICAgJ3Vybjp1dWlkOmY4MWQ0ZmFlLTdkZWMtMTFkMC1hNzY1LTAwYTBjOTFlNmJmNicsCisgICAgICAgICAgICAgMHgxZDA3ZGVjZjgxZDRmYWVMLCAweDI3NjUsIHV1aWQuUkZDXzQxMjIsIDEpLAorICAgICAgICAgICAgKCdmZmZlZmRmYy1mZmZlLWZmZmUtZmZmZS1mZmZlZmRmY2ZiZmEnLAorICAgICAgICAgICAgICd7ZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhfScsCisgICAgICAgICAgICAgJ2ZmZmVmZGZjZmZmZWZmZmVmZmZlZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAnXHhmZlx4ZmVceGZkXHhmY1x4ZmZceGZlXHhmZlx4ZmVceGZmXHhmZVx4ZmZceGZlXHhmZFx4ZmNceGZiXHhmYScsCisgICAgICAgICAgICAgKDB4ZmZmZWZkZmNMLCAweGZmZmUsIDB4ZmZmZSwgMHhmZiwgMHhmZSwgMHhmZmZlZmRmY2ZiZmFMKSwKKyAgICAgICAgICAgICAweGZmZmVmZGZjZmZmZWZmZmVmZmZlZmZmZWZkZmNmYmZhTCwKKyAgICAgICAgICAgICAndXJuOnV1aWQ6ZmZmZWZkZmMtZmZmZS1mZmZlLWZmZmUtZmZmZWZkZmNmYmZhJywKKyAgICAgICAgICAgICAweGZmZWZmZmVmZmZlZmRmY0wsIDB4M2ZmZSwgdXVpZC5SRVNFUlZFRF9GVVRVUkUsIE5vbmUpLAorICAgICAgICAgICAgKCdmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnLAorICAgICAgICAgICAgICd7ZmZmZmZmZmYtZmZmZi1mZmZmLWZmZmYtZmZmZmZmZmZmZmZmfScsCisgICAgICAgICAgICAgJ2ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmJywKKyAgICAgICAgICAgICAnXHhmZicqMTYsCisgICAgICAgICAgICAgKDB4ZmZmZmZmZmZMLCAweGZmZmZMLCAweGZmZmZMLCAweGZmLCAweGZmLCAweGZmZmZmZmZmZmZmZkwpLAorICAgICAgICAgICAgIDB4ZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZMLAorICAgICAgICAgICAgICd1cm46dXVpZDpmZmZmZmZmZi1mZmZmLWZmZmYtZmZmZi1mZmZmZmZmZmZmZmYnLAorICAgICAgICAgICAgIDB4ZmZmZmZmZmZmZmZmZmZmTCwgMHgzZmZmLCB1dWlkLlJFU0VSVkVEX0ZVVFVSRSwgTm9uZSksCisgICAgICAgICAgICBdOgorICAgICAgICAgICAgZXF1aXZhbGVudHMgPSBbXQorICAgICAgICAgICAgIyBDb25zdHJ1Y3QgZWFjaCBVVUlEIGluIHNldmVyYWwgZGlmZmVyZW50IHdheXMuCisgICAgICAgICAgICBmb3IgdSBpbiBbdXVpZC5VVUlEKHN0cmluZyksIHV1aWQuVVVJRChjdXJseSksIHV1aWQuVVVJRChoZXgpLAorICAgICAgICAgICAgICAgICAgICAgIHV1aWQuVVVJRChieXRlcz1ieXRlcyksIHV1aWQuVVVJRChmaWVsZHM9ZmllbGRzKSwKKyAgICAgICAgICAgICAgICAgICAgICB1dWlkLlVVSUQoaW50PWludGVnZXIpLCB1dWlkLlVVSUQodXJuKV06CisgICAgICAgICAgICAgICAgIyBUZXN0IGFsbCBjb252ZXJzaW9ucyBhbmQgcHJvcGVydGllcyBvZiB0aGUgVVVJRCBvYmplY3QuCisgICAgICAgICAgICAgICAgZXF1YWwoc3RyKHUpLCBzdHJpbmcpCisgICAgICAgICAgICAgICAgZXF1YWwoaW50KHUpLCBpbnRlZ2VyKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuYnl0ZXMsIGJ5dGVzKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuZmllbGRzLCBmaWVsZHMpCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lX2xvdywgZmllbGRzWzBdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudGltZV9taWQsIGZpZWxkc1sxXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LnRpbWVfaGlfdmVyc2lvbiwgZmllbGRzWzJdKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQsIGZpZWxkc1szXSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmNsb2NrX3NlcV9sb3csIGZpZWxkc1s0XSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1Lm5vZGUsIGZpZWxkc1s1XSkKKyAgICAgICAgICAgICAgICBlcXVhbCh1LmhleCwgaGV4KQorICAgICAgICAgICAgICAgIGVxdWFsKHUuaW50LCBpbnRlZ2VyKQorICAgICAgICAgICAgICAgIGVxdWFsKHUudXJuLCB1cm4pCisgICAgICAgICAgICAgICAgZXF1YWwodS50aW1lLCB0aW1lKQorICAgICAgICAgICAgICAgIGVxdWFsKHUuY2xvY2tfc2VxLCBjbG9ja19zZXEpCisgICAgICAgICAgICAgICAgZXF1YWwodS52YXJpYW50LCB2YXJpYW50KQorICAgICAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgdmVyc2lvbikKKyAgICAgICAgICAgICAgICBlcXVpdmFsZW50cy5hcHBlbmQodSkKKworICAgICAgICAgICAgIyBEaWZmZXJlbnQgY29uc3RydWN0aW9uIG1ldGhvZHMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgVVVJRC4KKyAgICAgICAgICAgIGZvciB1IGluIGVxdWl2YWxlbnRzOgorICAgICAgICAgICAgICAgIGZvciB2IGluIGVxdWl2YWxlbnRzOgorICAgICAgICAgICAgICAgICAgICBlcXVhbCh1LCB2KQorICAgICAgICAgICAgYXNjZW5kaW5nLmFwcGVuZCh1KQorCisgICAgICAgICMgVGVzdCBjb21wYXJpc29uIG9mIFVVSURzLgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYXNjZW5kaW5nKSk6CisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4oYXNjZW5kaW5nKSk6CisgICAgICAgICAgICAgICAgZXF1YWwoY21wKGksIGopLCBjbXAoYXNjZW5kaW5nW2ldLCBhc2NlbmRpbmdbal0pKQorCisgICAgICAgICMgVGVzdCBzb3J0aW5nIG9mIFVVSURzIChhYm92ZSBsaXN0IGlzIGluIGFzY2VuZGluZyBvcmRlcikuCisgICAgICAgIHJlc29ydGVkID0gYXNjZW5kaW5nWzpdCisgICAgICAgIHJlc29ydGVkLnJldmVyc2UoKQorICAgICAgICByZXNvcnRlZC5zb3J0KCkKKyAgICAgICAgZXF1YWwoYXNjZW5kaW5nLCByZXNvcnRlZCkKKworICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6CisgICAgICAgIGJhZHZhbHVlID0gbGFtYmRhIGY6IHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYpCisgICAgICAgIGJhZHR5cGUgPSBsYW1iZGEgZjogc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmKQorCisgICAgICAgICMgQmFkbHkgZm9ybWVkIGhleCBzdHJpbmdzLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnJykpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKCdhYmMnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1NjcnKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4OScpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRCgnMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4ejIzNDU2NzgnKSkKKworICAgICAgICAjIEJhZGx5IGZvcm1lZCBieXRlcy4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J2FiYycpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz0nXDAnKjE1KSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9J1wwJyoxNykpCisKKyAgICAgICAgIyBCYWRseSBmb3JtZWQgZmllbGRzLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMSwgMiwgMywgNCwgNSkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDEsIDIsIDMsIDQsIDUsIDYsIDcpKSkKKworICAgICAgICAjIEZpZWxkIHZhbHVlcyBvdXQgb2YgcmFuZ2UuCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oLTEsIDAsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgweDEwMDAwMDAwMEwsIDAsIDAsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAtMSwgMCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDB4MTAwMDBMLCAwLCAwLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgLTEsIDAsIDAsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAweDEwMDAwTCwgMCwgMCwgMCkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIC0xLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMHgxMDBMLCAwLCAwKSkpCisgICAgICAgIGJhZHZhbHVlKGxhbWJkYTogdXVpZC5VVUlEKGZpZWxkcz0oMCwgMCwgMCwgMCwgLTEsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAweDEwMEwsIDApKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoZmllbGRzPSgwLCAwLCAwLCAwLCAwLCAtMSkpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9KDAsIDAsIDAsIDAsIDAsIDB4MTAwMDAwMDAwMDAwMEwpKSkKKworICAgICAgICAjIFZlcnNpb24gbnVtYmVyIG91dCBvZiByYW5nZS4KKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzAwJyoxNiwgdmVyc2lvbj0wKSkKKyAgICAgICAgYmFkdmFsdWUobGFtYmRhOiB1dWlkLlVVSUQoJzAwJyoxNiwgdmVyc2lvbj02KSkKKworICAgICAgICAjIEludGVnZXIgdmFsdWUgb3V0IG9mIHJhbmdlLgorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChpbnQ9LTEpKQorICAgICAgICBiYWR2YWx1ZShsYW1iZGE6IHV1aWQuVVVJRChpbnQ9MTw8MTI4TCkpCisKKyAgICAgICAgIyBNdXN0IHN1cHBseSBleGFjdGx5IG9uZSBvZiBoZXgsIGJ5dGVzLCBmaWVsZHMsIGludC4KKyAgICAgICAgaCwgYiwgZiwgaSA9ICcwMCcqMTYsICdcMCcqMTYsICgwLCAwLCAwLCAwLCAwLCAwKSwgMAorICAgICAgICB1dWlkLlVVSUQoaCkKKyAgICAgICAgdXVpZC5VVUlEKGhleD1oKQorICAgICAgICB1dWlkLlVVSUQoYnl0ZXM9YikKKyAgICAgICAgdXVpZC5VVUlEKGZpZWxkcz1mKQorICAgICAgICB1dWlkLlVVSUQoaW50PWkpCisKKyAgICAgICAgIyBXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIChwb3NpdGlvbmFsKS4KKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRCgpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGIpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGIsIGYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGIsIGYsIGkpKQorCisgICAgICAgICMgRHVwbGljYXRlIGFyZ3VtZW50cyAobmFtZWQpLgorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBieXRlcz1iKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGJ5dGVzPWIsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChmaWVsZHM9ZiwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBieXRlcz1iLCBmaWVsZHM9ZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaGV4PWgsIGJ5dGVzPWIsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoZXg9aCwgZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChieXRlcz1iLCBpbnQ9aSwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGhleD1oLCBieXRlcz1iLCBpbnQ9aSwgZmllbGRzPWYpKQorCisgICAgICAgICMgRHVwbGljYXRlIGFyZ3VtZW50cyAocG9zaXRpb25hbCBhbmQgbmFtZWQpLgorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBieXRlcz1iKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBmaWVsZHM9ZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBieXRlcz1iKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBpbnQ9aSkpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgYnl0ZXM9YiwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGJ5dGVzPWIsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBmaWVsZHM9ZiwgaW50PWkpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBieXRlcz1iLCBmaWVsZHM9ZikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiB1dWlkLlVVSUQoaCwgaGV4PWgsIGJ5dGVzPWIsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBoZXg9aCwgZmllbGRzPWYsIGludD1pKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHV1aWQuVVVJRChoLCBieXRlcz1iLCBpbnQ9aSwgZmllbGRzPWYpKQorICAgICAgICBiYWR0eXBlKGxhbWJkYTogdXVpZC5VVUlEKGgsIGhleD1oLCBieXRlcz1iLCBpbnQ9aSwgZmllbGRzPWYpKQorCisgICAgICAgICMgSW1tdXRhYmlsaXR5LgorICAgICAgICB1ID0gdXVpZC5VVUlEKGgpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdoZXgnLCBoKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2J5dGVzJywgYikpCisgICAgICAgIGJhZHR5cGUobGFtYmRhOiBzZXRhdHRyKHUsICdmaWVsZHMnLCBmKSkKKyAgICAgICAgYmFkdHlwZShsYW1iZGE6IHNldGF0dHIodSwgJ2ludCcsIGkpKQorCisgICAgZGVmIGNoZWNrX25vZGUoc2VsZiwgbm9kZSwgc291cmNlKToKKyAgICAgICAgaW5kaXZpZHVhbF9ncm91cF9iaXQgPSAobm9kZSA+PiA0MEwpICYgMQorICAgICAgICB1bml2ZXJzYWxfbG9jYWxfYml0ID0gKG5vZGUgPj4gNDBMKSAmIDIKKyAgICAgICAgbWVzc2FnZSA9ICIlMDEyeCBkb2Vzbid0IGxvb2sgbGlrZSBhIHJlYWwgTUFDIGFkZHJlc3MiICUgbm9kZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZGl2aWR1YWxfZ3JvdXBfYml0LCAwLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXZlcnNhbF9sb2NhbF9iaXQsIDAsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobm9kZSwgMCwgbWVzc2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChub2RlLCAweGZmZmZmZmZmZmZmZkwsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IG5vZGUsIG1lc3NhZ2UpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub2RlIDwgKDFMIDw8IDQ4KSwgbWVzc2FnZSkKKworICAgICAgICBUZXN0VVVJRC5zb3VyY2Uybm9kZVtzb3VyY2VdID0gbm9kZQorICAgICAgICBpZiBUZXN0VVVJRC5sYXN0X25vZGU6CisgICAgICAgICAgICBpZiBUZXN0VVVJRC5sYXN0X25vZGUgIT0gbm9kZToKKyAgICAgICAgICAgICAgICBtc2cgPSAiZGlmZmVyZW50IHNvdXJjZXMgZGlzYWdyZWUgb24gbm9kZTpcbiIKKyAgICAgICAgICAgICAgICBmb3IgcywgbiBpbiBUZXN0VVVJRC5zb3VyY2Uybm9kZS5pdGVyaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgbXNnICs9ICIgICAgZnJvbSBzb3VyY2UgJXIsIG5vZGUgd2FzICUwMTJ4XG4iICUgKHMsIG4pCisgICAgICAgICAgICAgICAgIyBUaGVyZSdzIGFjdHVhbGx5IG5vIHJlYXNvbiB0byBleHBlY3QgdGhlIE1BQyBhZGRyZXNzZXMKKyAgICAgICAgICAgICAgICAjIHRvIGFncmVlIGFjcm9zcyB2YXJpb3VzIG1ldGhvZHMgLS0gZS5nLiwgYSBib3ggbWF5IGhhdmUKKyAgICAgICAgICAgICAgICAjIG11bHRpcGxlIG5ldHdvcmsgaW50ZXJmYWNlcywgYW5kIGRpZmZlcmVudCB3YXlzIG9mIGdldHRpbmcKKyAgICAgICAgICAgICAgICAjIGEgTUFDIGFkZHJlc3MgbWF5IGZhdm9yIGRpZmZlcmVudCBIVy4KKyAgICAgICAgICAgICAgICAjI3NlbGYuZmFpbChtc2cpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBUZXN0VVVJRC5sYXN0X25vZGUgPSBub2RlCisKKyAgICBkZWYgdGVzdF9pZmNvbmZpZ19nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sIFwKKyIiIiAgICBXQVJOSU5HOiB1dWlkLl9pZmNvbmZpZ19nZXRub2RlIGlzIHVucmVsaWFibGUgb24gbWFueSBwbGF0Zm9ybXMuCisgICAgICAgIEl0IGlzIGRpc2FibGVkIHVudGlsIHRoZSBjb2RlIGFuZC9vciB0ZXN0IGNhbiBiZSBmaXhlZCBwcm9wZXJseS4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIG5vZGUgPSB1dWlkLl9pZmNvbmZpZ19nZXRub2RlKCkKKyAgICAgICAgICAgIGlmIG5vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKG5vZGUsICdpZmNvbmZpZycpCisKKyAgICBkZWYgdGVzdF9pcGNvbmZpZ19nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgbm9kZSA9IHV1aWQuX2lwY29uZmlnX2dldG5vZGUoKQorICAgICAgICAgICAgaWYgbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZSwgJ2lwY29uZmlnJykKKworICAgIGRlZiB0ZXN0X25ldGJpb3NfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnd2luMzJ3bmV0JykgYW5kIGltcG9ydGFibGUoJ25ldGJpb3MnKToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZSh1dWlkLl9uZXRiaW9zX2dldG5vZGUoKSwgJ25ldGJpb3MnKQorCisgICAgZGVmIHRlc3RfcmFuZG9tX2dldG5vZGUoc2VsZik6CisgICAgICAgIG5vZGUgPSB1dWlkLl9yYW5kb21fZ2V0bm9kZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhub2RlIDwgKDFMIDw8NDgpKQorCisgICAgZGVmIHRlc3RfdW5peGRsbF9nZXRub2RlKHNlbGYpOgorICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgIHByaW50ID4+c3lzLl9fc3Rkb3V0X18sIFwKKyIiIiAgICBXQVJOSU5HOiB1dWlkLl91bml4ZGxsX2dldG5vZGUgaXMgdW5yZWxpYWJsZSBvbiBtYW55IHBsYXRmb3Jtcy4KKyAgICAgICAgSXQgaXMgZGlzYWJsZWQgdW50aWwgdGhlIGNvZGUgYW5kL29yIHRlc3QgY2FuIGJlIGZpeGVkIHByb3Blcmx5LiIiIgorICAgICAgICByZXR1cm4KKworICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaWYgaW1wb3J0YWJsZSgnY3R5cGVzJykgYW5kIG9zLm5hbWUgPT0gJ3Bvc2l4JzoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tfbm9kZSh1dWlkLl91bml4ZGxsX2dldG5vZGUoKSwgJ3VuaXhkbGwnKQorCisgICAgZGVmIHRlc3Rfd2luZGxsX2dldG5vZGUoc2VsZik6CisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBpbXBvcnRhYmxlKCdjdHlwZXMnKSBhbmQgb3MubmFtZSA9PSAnbnQnOgorICAgICAgICAgICAgc2VsZi5jaGVja19ub2RlKHV1aWQuX3dpbmRsbF9nZXRub2RlKCksICd3aW5kbGwnKQorCisgICAgZGVmIHRlc3RfZ2V0bm9kZShzZWxmKToKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisiIiIgICAgV0FSTklORzogdXVpZC5nZXRub2RlIGlzIHVucmVsaWFibGUgb24gbWFueSBwbGF0Zm9ybXMuCisgICAgICAgIEl0IGlzIGRpc2FibGVkIHVudGlsIHRoZSBjb2RlIGFuZC9vciB0ZXN0IGNhbiBiZSBmaXhlZCBwcm9wZXJseS4iIiIKKyAgICAgICAgcmV0dXJuCisKKyAgICAgICAgbm9kZTEgPSB1dWlkLmdldG5vZGUoKQorICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZTEsICJnZXRub2RlMSIpCisKKyAgICAgICAgIyBUZXN0IGl0IGFnYWluIHRvIGVuc3VyZSBjb25zaXN0ZW5jeS4KKyAgICAgICAgbm9kZTIgPSB1dWlkLmdldG5vZGUoKQorICAgICAgICBzZWxmLmNoZWNrX25vZGUobm9kZTIsICJnZXRub2RlMiIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub2RlMSwgbm9kZTIpCisKKyAgICBkZWYgdGVzdF91dWlkMShzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdXVpZDQoKSBnZW5lcmF0ZXMgVVVJRHMgdGhhdCBhcmUgYWN0dWFsbHkgdmVyc2lvbiAxLgorICAgICAgICBmb3IgdSBpbiBbdXVpZC51dWlkMSgpIGZvciBpIGluIHJhbmdlKDEwKV06CisgICAgICAgICAgICBlcXVhbCh1LnZhcmlhbnQsIHV1aWQuUkZDXzQxMjIpCisgICAgICAgICAgICBlcXVhbCh1LnZlcnNpb24sIDEpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1cHBsaWVkIG5vZGUgSUQgYXBwZWFycyBpbiB0aGUgVVVJRC4KKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAwKQorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHhmZmZmZmZmZmZmZmYpCisgICAgICAgIGVxdWFsKHUubm9kZSwgMHhmZmZmZmZmZmZmZmYpCisKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1cHBsaWVkIGNsb2NrIHNlcXVlbmNlIGFwcGVhcnMgaW4gdGhlIFVVSUQuCisgICAgICAgIHUgPSB1dWlkLnV1aWQxKDB4MTIzNDU2Nzg5YWJjLCAwKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4MTIzNDU2Nzg5YWJjKQorICAgICAgICBlcXVhbCgoKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQgJiAweDNmKSA8PCA4KSB8IHUuY2xvY2tfc2VxX2xvdywgMCkKKyAgICAgICAgdSA9IHV1aWQudXVpZDEoMHgxMjM0NTY3ODlhYmMsIDB4MTIzNCkKKyAgICAgICAgZXF1YWwodS5ub2RlLCAweDEyMzQ1Njc4OWFiYykKKyAgICAgICAgZXF1YWwoKCh1LmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZikgPDwgOCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgIHUuY2xvY2tfc2VxX2xvdywgMHgxMjM0KQorICAgICAgICB1ID0gdXVpZC51dWlkMSgweDEyMzQ1Njc4OWFiYywgMHgzZmZmKQorICAgICAgICBlcXVhbCh1Lm5vZGUsIDB4MTIzNDU2Nzg5YWJjKQorICAgICAgICBlcXVhbCgoKHUuY2xvY2tfc2VxX2hpX3ZhcmlhbnQgJiAweDNmKSA8PCA4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgdS5jbG9ja19zZXFfbG93LCAweDNmZmYpCisKKyAgICBkZWYgdGVzdF91dWlkMyhzZWxmKToKKyAgICAgICAgZXF1YWwgPSBzZWxmLmFzc2VydEVxdWFsCisKKyAgICAgICAgIyBUZXN0IHNvbWUga25vd24gdmVyc2lvbi0zIFVVSURzLgorICAgICAgICBmb3IgdSwgdiBpbiBbKHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpLAorICAgICAgICAgICAgICAgICAgICAgICc2ZmE0NTllYS1lZThhLTNjYTQtODk0ZS1kYjc3ZTE2MDM1NWUnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX1VSTCwgJ2h0dHA6Ly9weXRob24ub3JnLycpLAorICAgICAgICAgICAgICAgICAgICAgICc5ZmU4ZThjNC1hYWE4LTMyYTktYTU1Yy00NTM1YTg4Yjc0OGQnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQzKHV1aWQuTkFNRVNQQUNFX09JRCwgJzEuMy42LjEnKSwKKyAgICAgICAgICAgICAgICAgICAgICAnZGQxYTFjZWYtMTNkNS0zNjhhLWFkODItZWNhNzFhY2Q0Y2QxJyksCisgICAgICAgICAgICAgICAgICAgICAodXVpZC51dWlkMyh1dWlkLk5BTUVTUEFDRV9YNTAwLCAnYz1jYScpLAorICAgICAgICAgICAgICAgICAgICAgICc2NThkMzAwMi1kYjZiLTMwNDAtYTFkMS04ZGRkN2QxODlhNGQnKSwKKyAgICAgICAgICAgICAgICAgICAgXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgMykKKyAgICAgICAgICAgIGVxdWFsKHUsIHV1aWQuVVVJRCh2KSkKKyAgICAgICAgICAgIGVxdWFsKHN0cih1KSwgdikKKworICAgIGRlZiB0ZXN0X3V1aWQ0KHNlbGYpOgorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICAjIE1ha2Ugc3VyZSB1dWlkNCgpIGdlbmVyYXRlcyBVVUlEcyB0aGF0IGFyZSBhY3R1YWxseSB2ZXJzaW9uIDQuCisgICAgICAgIGZvciB1IGluIFt1dWlkLnV1aWQ0KCkgZm9yIGkgaW4gcmFuZ2UoMTApXToKKyAgICAgICAgICAgIGVxdWFsKHUudmFyaWFudCwgdXVpZC5SRkNfNDEyMikKKyAgICAgICAgICAgIGVxdWFsKHUudmVyc2lvbiwgNCkKKworICAgIGRlZiB0ZXN0X3V1aWQ1KHNlbGYpOgorICAgICAgICBlcXVhbCA9IHNlbGYuYXNzZXJ0RXF1YWwKKworICAgICAgICAjIFRlc3Qgc29tZSBrbm93biB2ZXJzaW9uLTUgVVVJRHMuCisgICAgICAgIGZvciB1LCB2IGluIFsodXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJyksCisgICAgICAgICAgICAgICAgICAgICAgJzg4NjMxM2UxLTNiOGEtNTM3Mi05YjkwLTBjOWFlZTE5OWU1ZCcpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfVVJMLCAnaHR0cDovL3B5dGhvbi5vcmcvJyksCisgICAgICAgICAgICAgICAgICAgICAgJzRjNTY1ZjBkLTNmNWEtNTg5MC1iNDFiLTIwY2Y0NzcwMWM1ZScpLAorICAgICAgICAgICAgICAgICAgICAgKHV1aWQudXVpZDUodXVpZC5OQU1FU1BBQ0VfT0lELCAnMS4zLjYuMScpLAorICAgICAgICAgICAgICAgICAgICAgICcxNDQ3ZmE2MS01Mjc3LTVmZWYtYTliMy1mYmM2ZTQ0ZjRhZjMnKSwKKyAgICAgICAgICAgICAgICAgICAgICh1dWlkLnV1aWQ1KHV1aWQuTkFNRVNQQUNFX1g1MDAsICdjPWNhJyksCisgICAgICAgICAgICAgICAgICAgICAgJ2NjOTU3ZGQxLWE5NzItNTM0OS05OGNkLTg3NDE5MDAwMjc5OCcpLAorICAgICAgICAgICAgICAgICAgICBdOgorICAgICAgICAgICAgZXF1YWwodS52YXJpYW50LCB1dWlkLlJGQ180MTIyKQorICAgICAgICAgICAgZXF1YWwodS52ZXJzaW9uLCA1KQorICAgICAgICAgICAgZXF1YWwodSwgdXVpZC5VVUlEKHYpKQorICAgICAgICAgICAgZXF1YWwoc3RyKHUpLCB2KQorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFRlc3RVVUlEKQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5IGIvTGliL3Rlc3QvdGVzdF93YWl0My5weQppbmRleCBmNmE0MWE2Li45ZGU2NGIyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhaXQzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkKQEAgLTIsOCArMiw5IEBACiAiIiIKIAogaW1wb3J0IG9zCitpbXBvcnQgdGltZQogZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QsIHJlYXBfY2hpbGRyZW4KIAogdHJ5OgogICAgIG9zLmZvcmsKQEAgLTE3LDE2ICsxOCwyMSBAQAogCiBjbGFzcyBXYWl0M1Rlc3QoRm9ya1dhaXQpOgogICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6Ci0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQzKDApCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKKyAgICAgICAgICAgICMgd2FpdDMoKSBzaG91bGRuJ3QgaGFuZywgYnV0IHNvbWUgb2YgdGhlIGJ1aWxkYm90cyBzZWVtIHRvIGhhbmcKKyAgICAgICAgICAgICMgaW4gdGhlIGZvcmtpbmcgdGVzdHMuICBUaGlzIGlzIGFuIGF0dGVtcHQgdG8gZml4IHRoZSBwcm9ibGVtLgorICAgICAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0Myhvcy5XTk9IQU5HKQogICAgICAgICAgICAgaWYgc3BpZCA9PSBjcGlkOgogICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEuMCkKKwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChXYWl0M1Rlc3QpCisgICAgcmVhcF9jaGlsZHJlbigpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkgYi9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5CmluZGV4IDAyN2U1YzMuLjlmN2ZjMTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FpdDQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YWl0NC5weQpAQCAtMiw4ICsyLDkgQEAKICIiIgogCiBpbXBvcnQgb3MKK2ltcG9ydCB0aW1lCiBmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdCwgcmVhcF9jaGlsZHJlbgogCiB0cnk6CiAgICAgb3MuZm9yawpAQCAtMTcsMTMgKzE4LDIwIEBACiAKIGNsYXNzIFdhaXQ0VGVzdChGb3JrV2FpdCk6CiAgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKLSAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0NChjcGlkLCAwKQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxMCk6CisgICAgICAgICAgICAjIHdhaXQ0KCkgc2hvdWxkbid0IGhhbmcsIGJ1dCBzb21lIG9mIHRoZSBidWlsZGJvdHMgc2VlbSB0byBoYW5nCisgICAgICAgICAgICAjIGluIHRoZSBmb3JraW5nIHRlc3RzLiAgVGhpcyBpcyBhbiBhdHRlbXB0IHRvIGZpeCB0aGUgcHJvYmxlbS4KKyAgICAgICAgICAgIHNwaWQsIHN0YXR1cywgcnVzYWdlID0gb3Mud2FpdDQoY3BpZCwgb3MuV05PSEFORykKKyAgICAgICAgICAgIGlmIHNwaWQgPT0gY3BpZDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgxLjApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3BpZCwgY3BpZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0dXMsIDAsICJjYXVzZSA9ICVkLCBleGl0ID0gJWQiICUgKHN0YXR1cyYweGZmLCBzdGF0dXM+PjgpKQogICAgICAgICBzZWxmLmFzc2VydFRydWUocnVzYWdlKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgcnVuX3VuaXR0ZXN0KFdhaXQ0VGVzdCkKKyAgICByZWFwX2NoaWxkcmVuKCkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKaW5kZXggNWQwNTFhNS4uYTdjY2I2YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CkBAIC04MSw2ICs4MSwxOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5tZXNzYWdlLCB0ZXh0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5jYXRlZ29yeSwgJ1VzZXJXYXJuaW5nJykKIAorICAgIGRlZiB0ZXN0X29wdGlvbnMoc2VsZik6CisgICAgICAgICMgVXNlcyB0aGUgcHJpdmF0ZSBfc2V0b3B0aW9uKCkgZnVuY3Rpb24gdG8gdGVzdCB0aGUgcGFyc2luZworICAgICAgICAjIG9mIGNvbW1hbmQtbGluZSB3YXJuaW5nIGFyZ3VtZW50cworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3YXJuaW5ncy5fT3B0aW9uRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLl9zZXRvcHRpb24sICcxOjI6Mzo0OjU6NicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdhcm5pbmdzLl9PcHRpb25FcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuX3NldG9wdGlvbiwgJ2JvZ3VzOjpXYXJuaW5nJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2FybmluZ3MuX09wdGlvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5fc2V0b3B0aW9uLCAnaWdub3JlOjI6OjQ6LTUnKQorICAgICAgICB3YXJuaW5ncy5fc2V0b3B0aW9uKCdlcnJvcjo6V2FybmluZzo6MCcpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVzZXJXYXJuaW5nLCB3YXJuaW5ncy53YXJuLCAnY29udmVydCB0byBlcnJvcicpCisKKwogZGVmIHRlc3RfbWFpbih2ZXJib3NlPU5vbmUpOgogICAgICMgT2JzY3VyZSBoYWNrIHNvIHRoYXQgdGhpcyB0ZXN0IHBhc3NlcyBhZnRlciByZWxvYWRzIG9yIHJlcGVhdGVkIGNhbGxzCiAgICAgIyB0byB0ZXN0X21haW4gKHJlZ3J0ZXN0IC1SKS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2lucmVnLnB5IGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKaW5kZXggYTliYzk2Mi4uNTgzMGZkNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aW5yZWcucHkKQEAgLTE1MSwzICsxNTEsNiBAQAogZWxzZToKICAgICBwcmludCAiUmVtb3RlIHJlZ2lzdHJ5IGNhbGxzIGNhbiBiZSB0ZXN0ZWQgdXNpbmciLAogICAgIHByaW50ICIndGVzdF93aW5yZWcucHkgLS1yZW1vdGUgXFxcXG1hY2hpbmVfbmFtZSciCisgICAgIyBwZXJmb3JtIG1pbmltYWwgQ29ubmVjdFJlZ2lzdHJ5IHRlc3Qgd2hpY2gganVzdCBpbnZva2VzIGl0CisgICAgaCA9IENvbm5lY3RSZWdpc3RyeShOb25lLCBIS0VZX0xPQ0FMX01BQ0hJTkUpCisgICAgaC5DbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWVjMjcxYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQpAQCAtMCwwICsxLDYxNSBAQAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBuZXN0ZWRfc2NvcGVzICAgICMgQmFja3dhcmQgY29tcGF0IGZvciAyLjEKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RTdWl0ZSwgVGVzdENhc2UsIG1ha2VTdWl0ZQorZnJvbSB3c2dpcmVmLnV0aWwgaW1wb3J0IHNldHVwX3Rlc3RpbmdfZGVmYXVsdHMKK2Zyb20gd3NnaXJlZi5oZWFkZXJzIGltcG9ydCBIZWFkZXJzCitmcm9tIHdzZ2lyZWYuaGFuZGxlcnMgaW1wb3J0IEJhc2VIYW5kbGVyLCBCYXNlQ0dJSGFuZGxlcgorZnJvbSB3c2dpcmVmIGltcG9ydCB1dGlsCitmcm9tIHdzZ2lyZWYudmFsaWRhdGUgaW1wb3J0IHZhbGlkYXRvcgorZnJvbSB3c2dpcmVmLnNpbXBsZV9zZXJ2ZXIgaW1wb3J0IFdTR0lTZXJ2ZXIsIFdTR0lSZXF1ZXN0SGFuZGxlciwgZGVtb19hcHAKK2Zyb20gd3NnaXJlZi5zaW1wbGVfc2VydmVyIGltcG9ydCBtYWtlX3NlcnZlcgorZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gU29ja2V0U2VydmVyIGltcG9ydCBCYXNlU2VydmVyCitpbXBvcnQgcmUsIHN5cworCisKK2NsYXNzIE1vY2tTZXJ2ZXIoV1NHSVNlcnZlcik6CisgICAgIiIiTm9uLXNvY2tldCBIVFRQIHNlcnZlciIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZlcl9hZGRyZXNzLCBSZXF1ZXN0SGFuZGxlckNsYXNzKToKKyAgICAgICAgQmFzZVNlcnZlci5fX2luaXRfXyhzZWxmLCBzZXJ2ZXJfYWRkcmVzcywgUmVxdWVzdEhhbmRsZXJDbGFzcykKKyAgICAgICAgc2VsZi5zZXJ2ZXJfYmluZCgpCisKKyAgICBkZWYgc2VydmVyX2JpbmQoc2VsZik6CisgICAgICAgIGhvc3QsIHBvcnQgPSBzZWxmLnNlcnZlcl9hZGRyZXNzCisgICAgICAgIHNlbGYuc2VydmVyX25hbWUgPSBob3N0CisgICAgICAgIHNlbGYuc2VydmVyX3BvcnQgPSBwb3J0CisgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisKKworY2xhc3MgTW9ja0hhbmRsZXIoV1NHSVJlcXVlc3RIYW5kbGVyKToKKyAgICAiIiJOb24tc29ja2V0IEhUVFAgaGFuZGxlciIiIgorICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgc2VsZi5jb25uZWN0aW9uID0gc2VsZi5yZXF1ZXN0CisgICAgICAgIHNlbGYucmZpbGUsIHNlbGYud2ZpbGUgPSBzZWxmLmNvbm5lY3Rpb24KKworICAgIGRlZiBmaW5pc2goc2VsZik6CisgICAgICAgIHBhc3MKKworCisKKworCitkZWYgaGVsbG9fYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCBbCisgICAgICAgICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpLAorICAgICAgICAoJ0RhdGUnLCdNb24sIDA1IEp1biAyMDA2IDE4OjQ5OjU0IEdNVCcpCisgICAgXSkKKyAgICByZXR1cm4gWyJIZWxsbywgd29ybGQhIl0KKworZGVmIHJ1bl9hbW9jayhhcHA9aGVsbG9fYXBwLCBkYXRhPSJHRVQgLyBIVFRQLzEuMFxuXG4iKToKKyAgICBzZXJ2ZXIgPSBtYWtlX3NlcnZlcigiIiwgODAsIGFwcCwgTW9ja1NlcnZlciwgTW9ja0hhbmRsZXIpCisgICAgaW5wLCBvdXQsIGVyciwgb2xkZXJyID0gU3RyaW5nSU8oZGF0YSksIFN0cmluZ0lPKCksIFN0cmluZ0lPKCksIHN5cy5zdGRlcnIKKyAgICBzeXMuc3RkZXJyID0gZXJyCisKKyAgICB0cnk6CisgICAgICAgIHNlcnZlci5maW5pc2hfcmVxdWVzdCgoaW5wLG91dCksICgiMTI3LjAuMC4xIiw4ODg4KSkKKyAgICBmaW5hbGx5OgorICAgICAgICBzeXMuc3RkZXJyID0gb2xkZXJyCisKKyAgICByZXR1cm4gb3V0LmdldHZhbHVlKCksIGVyci5nZXR2YWx1ZSgpCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIGNvbXBhcmVfZ2VuZXJpY19pdGVyKG1ha2VfaXQsbWF0Y2gpOgorICAgICIiIlV0aWxpdHkgdG8gY29tcGFyZSBhIGdlbmVyaWMgMi4xLzIuMisgaXRlcmF0b3Igd2l0aCBhbiBpdGVyYWJsZQorCisgICAgSWYgcnVubmluZyB1bmRlciBQeXRob24gMi4yKywgdGhpcyB0ZXN0cyB0aGUgaXRlcmF0b3IgdXNpbmcgaXRlcigpL25leHQoKSwKKyAgICBhcyB3ZWxsIGFzIF9fZ2V0aXRlbV9fLiAgJ21ha2VfaXQnIG11c3QgYmUgYSBmdW5jdGlvbiByZXR1cm5pbmcgYSBmcmVzaAorICAgIGl0ZXJhdG9yIHRvIGJlIHRlc3RlZCAoc2luY2UgdGhpcyBtYXkgdGVzdCB0aGUgaXRlcmF0b3IgdHdpY2UpLiIiIgorCisgICAgaXQgPSBtYWtlX2l0KCkKKyAgICBuID0gMAorICAgIGZvciBpdGVtIGluIG1hdGNoOgorICAgICAgICBpZiBub3QgaXRbbl09PWl0ZW06IHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgIG4rPTEKKyAgICB0cnk6CisgICAgICAgIGl0W25dCisgICAgZXhjZXB0IEluZGV4RXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVG9vIG1hbnkgaXRlbXMgZnJvbSBfX2dldGl0ZW1fXyIsaXQpCisKKyAgICB0cnk6CisgICAgICAgIGl0ZXIsIFN0b3BJdGVyYXRpb24KKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgIyBPbmx5IHRlc3QgaXRlciBtb2RlIHVuZGVyIDIuMisKKyAgICAgICAgaXQgPSBtYWtlX2l0KCkKKyAgICAgICAgaWYgbm90IGl0ZXIoaXQpIGlzIGl0OiByYWlzZSBBc3NlcnRpb25FcnJvcgorICAgICAgICBmb3IgaXRlbSBpbiBtYXRjaDoKKyAgICAgICAgICAgIGlmIG5vdCBpdC5uZXh0KCk9PWl0ZW06IHJhaXNlIEFzc2VydGlvbkVycm9yCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGl0Lm5leHQoKQorICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUb28gbWFueSBpdGVtcyBmcm9tIC5uZXh0KCkiLGl0KQorCisKKworCisKKworY2xhc3MgSW50ZWdyYXRpb25UZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tfaGVsbG8oc2VsZiwgb3V0LCBoYXNfbGVuZ3RoPVRydWUpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dCwKKyAgICAgICAgICAgICJIVFRQLzEuMCAyMDAgT0tcclxuIgorICAgICAgICAgICAgIlNlcnZlcjogV1NHSVNlcnZlci8wLjEgUHl0aG9uLyIrc3lzLnZlcnNpb24uc3BsaXQoKVswXSsiXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIgorICAgICAgICAgICAgIkRhdGU6IE1vbiwgMDUgSnVuIDIwMDYgMTg6NDk6NTQgR01UXHJcbiIgKworICAgICAgICAgICAgKGhhc19sZW5ndGggYW5kICAiQ29udGVudC1MZW5ndGg6IDEzXHJcbiIgb3IgIiIpICsKKyAgICAgICAgICAgICJcclxuIgorICAgICAgICAgICAgIkhlbGxvLCB3b3JsZCEiCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X3BsYWluX2hlbGxvKHNlbGYpOgorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jaygpCisgICAgICAgIHNlbGYuY2hlY2tfaGVsbG8ob3V0KQorCisgICAgZGVmIHRlc3RfdmFsaWRhdGVkX2hlbGxvKHNlbGYpOgorICAgICAgICBvdXQsIGVyciA9IHJ1bl9hbW9jayh2YWxpZGF0b3IoaGVsbG9fYXBwKSkKKyAgICAgICAgIyB0aGUgbWlkZGxld2FyZSBkb2Vzbid0IHN1cHBvcnQgbGVuKCksIHNvIGNvbnRlbnQtbGVuZ3RoIGlzbid0IHRoZXJlCisgICAgICAgIHNlbGYuY2hlY2tfaGVsbG8ob3V0LCBoYXNfbGVuZ3RoPUZhbHNlKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3ZhbGlkYXRpb25fZXJyb3Ioc2VsZik6CisgICAgICAgIGRlZiBiYWRfYXBwKGVudmlyb24sc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2UoIjIwMCBPSyIsICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpKQorICAgICAgICAgICAgcmV0dXJuIFsiSGVsbG8sIHdvcmxkISJdCisgICAgICAgIG91dCwgZXJyID0gcnVuX2Ftb2NrKHZhbGlkYXRvcihiYWRfYXBwKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG91dC5lbmRzd2l0aCgKKyAgICAgICAgICAgICJBIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLiIKKyAgICAgICAgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGVyci5zcGxpdGxpbmVzKClbLTJdLAorICAgICAgICAgICAgIkFzc2VydGlvbkVycm9yOiBIZWFkZXJzICgoJ0NvbnRlbnQtVHlwZScsICd0ZXh0L3BsYWluJykpIG11c3QiCisgICAgICAgICAgICAiIGJlIG9mIHR5cGUgbGlzdDogPHR5cGUgJ3R1cGxlJz4iCisgICAgICAgICkKKworCisKKworCisKK2NsYXNzIFV0aWxpdHlUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tTaGlmdChzZWxmLHNuX2luLHBpX2luLHBhcnQsc25fb3V0LHBpX291dCk6CisgICAgICAgIGVudiA9IHsnU0NSSVBUX05BTUUnOnNuX2luLCdQQVRIX0lORk8nOnBpX2lufQorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuc2hpZnRfcGF0aF9pbmZvKGVudikscGFydCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZbJ1BBVEhfSU5GTyddLHBpX291dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZbJ1NDUklQVF9OQU1FJ10sc25fb3V0KQorICAgICAgICByZXR1cm4gZW52CisKKyAgICBkZWYgY2hlY2tEZWZhdWx0KHNlbGYsIGtleSwgdmFsdWUsIGFsdD1Ob25lKToKKyAgICAgICAgIyBDaGVjayBkZWZhdWx0aW5nIHdoZW4gZW1wdHkKKyAgICAgICAgZW52ID0ge30KKyAgICAgICAgdXRpbC5zZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGVudikKKyAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSxTdHJpbmdJTyk6CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShlbnZba2V5XSxTdHJpbmdJTykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVudltrZXldLHZhbHVlKQorCisgICAgICAgICMgQ2hlY2sgZXhpc3RpbmcgdmFsdWUKKyAgICAgICAgZW52ID0ge2tleTphbHR9CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbnZba2V5XSBpcyBhbHQpCisKKyAgICBkZWYgY2hlY2tDcm9zc0RlZmF1bHQoc2VsZixrZXksdmFsdWUsKiprdyk6CisgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhrdykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrd1trZXldLHZhbHVlKQorCisgICAgZGVmIGNoZWNrQXBwVVJJKHNlbGYsdXJpLCoqa3cpOgorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5hcHBsaWNhdGlvbl91cmkoa3cpLHVyaSkKKworICAgIGRlZiBjaGVja1JlcVVSSShzZWxmLHVyaSxxdWVyeT0xLCoqa3cpOgorICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5yZXF1ZXN0X3VyaShrdyxxdWVyeSksdXJpKQorCisKKworCisKKworICAgIGRlZiBjaGVja0ZXKHNlbGYsdGV4dCxzaXplLG1hdGNoKToKKworICAgICAgICBkZWYgbWFrZV9pdCh0ZXh0PXRleHQsc2l6ZT1zaXplKToKKyAgICAgICAgICAgIHJldHVybiB1dGlsLkZpbGVXcmFwcGVyKFN0cmluZ0lPKHRleHQpLHNpemUpCisKKyAgICAgICAgY29tcGFyZV9nZW5lcmljX2l0ZXIobWFrZV9pdCxtYXRjaCkKKworICAgICAgICBpdCA9IG1ha2VfaXQoKQorICAgICAgICBzZWxmLmZhaWxJZihpdC5maWxlbGlrZS5jbG9zZWQpCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXQ6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgc2VsZi5mYWlsSWYoaXQuZmlsZWxpa2UuY2xvc2VkKQorCisgICAgICAgIGl0LmNsb3NlKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGl0LmZpbGVsaWtlLmNsb3NlZCkKKworCisgICAgZGVmIHRlc3RTaW1wbGVTaGlmdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywnLycsICcnLCAnLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJycsJy94JywgJ3gnLCAnL3gnLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvJywnJywgTm9uZSwgJy8nLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94L3knLCAneCcsICcvYS94JywgJy95JykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYScsJy94LycsICAneCcsICcvYS94JywgJy8nKQorCisKKyAgICBkZWYgdGVzdE5vcm1hbGl6ZWRTaGlmdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi4veScsICcuLicsICcvYScsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnJywgJy8uLi95JywgJy4uJywgJycsICcveScpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvL3knLCAneScsICcvYS9iL3knLCAnJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8veS8nLCAneScsICcvYS9iL3knLCAnLycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi95JywgJ3knLCAnL2EvYi95JywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi95LycsICd5JywgJy9hL2IveScsICcvJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8vLy4vLi4vL3kvLi8vJywgJy4uJywgJy9hJywgJy95LycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLy8nLCAnJywgJy9hL2IvJywgJycpCisgICAgICAgIHNlbGYuY2hlY2tTaGlmdCgnL2EvYicsICcvLi8vJywgJycsICcvYS9iLycsICcnKQorICAgICAgICBzZWxmLmNoZWNrU2hpZnQoJy9hL2InLCAnL3gvLycsICd4JywgJy9hL2IveCcsICcvJykKKyAgICAgICAgc2VsZi5jaGVja1NoaWZ0KCcvYS9iJywgJy8uJywgTm9uZSwgJy9hL2InLCAnJykKKworCisgICAgZGVmIHRlc3REZWZhdWx0cyhzZWxmKToKKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gWworICAgICAgICAgICAgKCdTRVJWRVJfTkFNRScsJzEyNy4wLjAuMScpLAorICAgICAgICAgICAgKCdTRVJWRVJfUE9SVCcsICc4MCcpLAorICAgICAgICAgICAgKCdTRVJWRVJfUFJPVE9DT0wnLCdIVFRQLzEuMCcpLAorICAgICAgICAgICAgKCdIVFRQX0hPU1QnLCcxMjcuMC4wLjEnKSwKKyAgICAgICAgICAgICgnUkVRVUVTVF9NRVRIT0QnLCdHRVQnKSwKKyAgICAgICAgICAgICgnU0NSSVBUX05BTUUnLCcnKSwKKyAgICAgICAgICAgICgnUEFUSF9JTkZPJywnLycpLAorICAgICAgICAgICAgKCd3c2dpLnZlcnNpb24nLCAoMSwwKSksCisgICAgICAgICAgICAoJ3dzZ2kucnVuX29uY2UnLCAwKSwKKyAgICAgICAgICAgICgnd3NnaS5tdWx0aXRocmVhZCcsIDApLAorICAgICAgICAgICAgKCd3c2dpLm11bHRpcHJvY2VzcycsIDApLAorICAgICAgICAgICAgKCd3c2dpLmlucHV0JywgU3RyaW5nSU8oIiIpKSwKKyAgICAgICAgICAgICgnd3NnaS5lcnJvcnMnLCBTdHJpbmdJTygpKSwKKyAgICAgICAgICAgICgnd3NnaS51cmxfc2NoZW1lJywnaHR0cCcpLAorICAgICAgICBdOgorICAgICAgICAgICAgc2VsZi5jaGVja0RlZmF1bHQoa2V5LHZhbHVlKQorCisKKyAgICBkZWYgdGVzdENyb3NzRGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ0hUVFBfSE9TVCcsImZvby5iYXIiLFNFUlZFUl9OQU1FPSJmb28uYmFyIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cHMiLEhUVFBTPSJvbiIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0iMSIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ3dzZ2kudXJsX3NjaGVtZScsImh0dHBzIixIVFRQUz0ieWVzIikKKyAgICAgICAgc2VsZi5jaGVja0Nyb3NzRGVmYXVsdCgnd3NnaS51cmxfc2NoZW1lJywiaHR0cCIsSFRUUFM9ImZvbyIpCisgICAgICAgIHNlbGYuY2hlY2tDcm9zc0RlZmF1bHQoJ1NFUlZFUl9QT1JUJywiODAiLEhUVFBTPSJmb28iKQorICAgICAgICBzZWxmLmNoZWNrQ3Jvc3NEZWZhdWx0KCdTRVJWRVJfUE9SVCcsIjQ0MyIsSFRUUFM9Im9uIikKKworCisgICAgZGVmIHRlc3RHdWVzc1NjaGVtZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7fSksICJodHRwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlsLmd1ZXNzX3NjaGVtZSh7J0hUVFBTJzoiZm9vIn0pLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6Im9uIn0pLCAiaHR0cHMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWwuZ3Vlc3Nfc2NoZW1lKHsnSFRUUFMnOiJ5ZXMifSksICJodHRwcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbC5ndWVzc19zY2hlbWUoeydIVFRQUyc6IjEifSksICJodHRwcyIpCisKKworCisKKworICAgIGRlZiB0ZXN0QXBwVVJJcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMS8iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW0iLCBTQ1JJUFRfTkFNRT0iL3NwYW0iKQorICAgICAgICBzZWxmLmNoZWNrQXBwVVJJKCJodHRwOi8vc3BhbS5leGFtcGxlLmNvbToyMDcxLyIsCisgICAgICAgICAgICBIVFRQX0hPU1Q9InNwYW0uZXhhbXBsZS5jb206MjA3MSIsIFNFUlZFUl9QT1JUPSIyMDcxIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovL3NwYW0uZXhhbXBsZS5jb20vIiwKKyAgICAgICAgICAgIFNFUlZFUl9OQU1FPSJzcGFtLmV4YW1wbGUuY29tIikKKyAgICAgICAgc2VsZi5jaGVja0FwcFVSSSgiaHR0cDovLzEyNy4wLjAuMS8iLAorICAgICAgICAgICAgSFRUUF9IT1NUPSIxMjcuMC4wLjEiLCBTRVJWRVJfTkFNRT0ic3BhbS5leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHBzOi8vMTI3LjAuMC4xLyIsIEhUVFBTPSJvbiIpCisgICAgICAgIHNlbGYuY2hlY2tBcHBVUkkoImh0dHA6Ly8xMjcuMC4wLjE6ODAwMC8iLCBTRVJWRVJfUE9SVD0iODAwMCIsCisgICAgICAgICAgICBIVFRQX0hPU1Q9Tm9uZSkKKworICAgIGRlZiB0ZXN0UmVxVVJJcyhzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja1JlcVVSSSgiaHR0cDovLzEyNy4wLjAuMS8iKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW0iLCBTQ1JJUFRfTkFNRT0iL3NwYW0iKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0iLAorICAgICAgICAgICAgU0NSSVBUX05BTUU9Ii9zcGFtbWl0eSIsIFBBVEhfSU5GTz0iL3NwYW0iKQorICAgICAgICBzZWxmLmNoZWNrUmVxVVJJKCJodHRwOi8vMTI3LjAuMC4xL3NwYW1taXR5L3NwYW0/c2F5PW5pIiwKKyAgICAgICAgICAgIFNDUklQVF9OQU1FPSIvc3BhbW1pdHkiLCBQQVRIX0lORk89Ii9zcGFtIixRVUVSWV9TVFJJTkc9InNheT1uaSIpCisgICAgICAgIHNlbGYuY2hlY2tSZXFVUkkoImh0dHA6Ly8xMjcuMC4wLjEvc3BhbW1pdHkvc3BhbSIsIDAsCisgICAgICAgICAgICBTQ1JJUFRfTkFNRT0iL3NwYW1taXR5IiwgUEFUSF9JTkZPPSIvc3BhbSIsUVVFUllfU1RSSU5HPSJzYXk9bmkiKQorCisgICAgZGVmIHRlc3RGaWxlV3JhcHBlcihzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja0ZXKCJ4eXoiKjUwLCAxMjAsIFsieHl6Iio0MCwieHl6IioxMF0pCisKKyAgICBkZWYgdGVzdEhvcEJ5SG9wKHNlbGYpOgorICAgICAgICBmb3IgaG9wIGluICgKKyAgICAgICAgICAgICJDb25uZWN0aW9uIEtlZXAtQWxpdmUgUHJveHktQXV0aGVudGljYXRlIFByb3h5LUF1dGhvcml6YXRpb24gIgorICAgICAgICAgICAgIlRFIFRyYWlsZXJzIFRyYW5zZmVyLUVuY29kaW5nIFVwZ3JhZGUiCisgICAgICAgICkuc3BsaXQoKToKKyAgICAgICAgICAgIGZvciBhbHQgaW4gaG9wLCBob3AudGl0bGUoKSwgaG9wLnVwcGVyKCksIGhvcC5sb3dlcigpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh1dGlsLmlzX2hvcF9ieV9ob3AoYWx0KSkKKworICAgICAgICAjIE5vdCBjb21wcmVoZW5zaXZlLCBqdXN0IGEgZmV3IHJhbmRvbSBoZWFkZXIgbmFtZXMKKyAgICAgICAgZm9yIGhvcCBpbiAoCisgICAgICAgICAgICAiQWNjZXB0IENhY2hlLUNvbnRyb2wgRGF0ZSBQcmFnbWEgVHJhaWxlciBWaWEgV2FybmluZyIKKyAgICAgICAgKS5zcGxpdCgpOgorICAgICAgICAgICAgZm9yIGFsdCBpbiBob3AsIGhvcC50aXRsZSgpLCBob3AudXBwZXIoKSwgaG9wLmxvd2VyKCk6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYodXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisKK2NsYXNzIEhlYWRlclRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0TWFwcGluZ0ludGVyZmFjZShzZWxmKToKKyAgICAgICAgdGVzdCA9IFsoJ3gnLCd5JyldCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKEhlYWRlcnMoW10pKSwwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihIZWFkZXJzKHRlc3RbOl0pKSwxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkua2V5cygpLCBbJ3gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLnZhbHVlcygpLCBbJ3knXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChIZWFkZXJzKHRlc3RbOl0pLml0ZW1zKCksIHRlc3QpCisgICAgICAgIHNlbGYuZmFpbElmKEhlYWRlcnModGVzdCkuaXRlbXMoKSBpcyB0ZXN0KSAgIyBtdXN0IGJlIGNvcHkhCisKKyAgICAgICAgaD1IZWFkZXJzKFtdKQorICAgICAgICBkZWwgaFsnZm9vJ10gICAjIHNob3VsZCBub3QgcmFpc2UgYW4gZXJyb3IKKworICAgICAgICBoWydGb28nXSA9ICdiYXInCisgICAgICAgIGZvciBtIGluIGguaGFzX2tleSwgaC5fX2NvbnRhaW5zX18sIGguZ2V0LCBoLmdldF9hbGwsIGguX19nZXRpdGVtX186CisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobSgnZm9vJykpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobSgnRm9vJykpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobSgnRk9PJykpCisgICAgICAgICAgICBzZWxmLmZhaWxJZihtKCdiYXInKSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ2ZvbyddLCdiYXInKQorICAgICAgICBoWydmb28nXSA9ICdiYXonCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsnRk9PJ10sJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXRfYWxsKCdmb28nKSxbJ2JheiddKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXQoImZvbyIsIndoZWUiKSwgImJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5nZXQoInpvbyIsIndoZWUiKSwgIndoZWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc2V0ZGVmYXVsdCgiZm9vIiwid2hlZSIpLCAiYmF6IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnNldGRlZmF1bHQoInpvbyIsIndoZWUiKSwgIndoZWUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbImZvbyJdLCJiYXoiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbInpvbyJdLCJ3aGVlIikKKworICAgIGRlZiB0ZXN0UmVxdWlyZUxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgSGVhZGVycywgImZvbyIpCisKKworICAgIGRlZiB0ZXN0RXh0cmFzKHNlbGYpOgorICAgICAgICBoID0gSGVhZGVycyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaCksJ1xyXG4nKQorCisgICAgICAgIGguYWRkX2hlYWRlcignZm9vJywnYmFyJyxiYXo9InNwYW0iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhbJ2ZvbyddLCAnYmFyOyBiYXo9InNwYW0iJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoaCksJ2ZvbzogYmFyOyBiYXo9InNwYW0iXHJcblxyXG4nKQorCisgICAgICAgIGguYWRkX2hlYWRlcignRm9vJywnYmFyJyxjaGVlc2U9Tm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLmdldF9hbGwoJ2ZvbycpLAorICAgICAgICAgICAgWydiYXI7IGJhej0ic3BhbSInLCAnYmFyOyBjaGVlc2UnXSkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihoKSwKKyAgICAgICAgICAgICdmb286IGJhcjsgYmF6PSJzcGFtIlxyXG4nCisgICAgICAgICAgICAnRm9vOiBiYXI7IGNoZWVzZVxyXG4nCisgICAgICAgICAgICAnXHJcbicKKyAgICAgICAgKQorCisKK2NsYXNzIEVycm9ySGFuZGxlcihCYXNlQ0dJSGFuZGxlcik6CisgICAgIiIiU2ltcGxlIGhhbmRsZXIgc3ViY2xhc3MgZm9yIHRlc3RpbmcgQmFzZUhhbmRsZXIiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCoqa3cpOgorICAgICAgICBzZXR1cF90ZXN0aW5nX2RlZmF1bHRzKGt3KQorICAgICAgICBCYXNlQ0dJSGFuZGxlci5fX2luaXRfXygKKyAgICAgICAgICAgIHNlbGYsIFN0cmluZ0lPKCcnKSwgU3RyaW5nSU8oKSwgU3RyaW5nSU8oKSwga3csCisgICAgICAgICAgICBtdWx0aXRocmVhZD1UcnVlLCBtdWx0aXByb2Nlc3M9VHJ1ZQorICAgICAgICApCisKK2NsYXNzIFRlc3RIYW5kbGVyKEVycm9ySGFuZGxlcik6CisgICAgIiIiU2ltcGxlIGhhbmRsZXIgc3ViY2xhc3MgZm9yIHRlc3RpbmcgQmFzZUhhbmRsZXIsIHcvZXJyb3IgcGFzc3RocnUiIiIKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHJhaXNlICAgIyBmb3IgdGVzdGluZywgd2Ugd2FudCB0byBzZWUgd2hhdCdzIGhhcHBlbmluZworCisKKworCisKKworCisKKworCisKK2NsYXNzIEhhbmRsZXJUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgY2hlY2tFbnZpcm9uQXR0cnMoc2VsZiwgaGFuZGxlcik6CisgICAgICAgIGVudiA9IGhhbmRsZXIuZW52aXJvbgorICAgICAgICBmb3IgYXR0ciBpbiBbCisgICAgICAgICAgICAndmVyc2lvbicsJ211bHRpdGhyZWFkJywnbXVsdGlwcm9jZXNzJywncnVuX29uY2UnLCdmaWxlX3dyYXBwZXInCisgICAgICAgIF06CisgICAgICAgICAgICBpZiBhdHRyPT0nZmlsZV93cmFwcGVyJyBhbmQgaGFuZGxlci53c2dpX2ZpbGVfd3JhcHBlciBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldGF0dHIoaGFuZGxlciwnd3NnaV8nK2F0dHIpLGVudlsnd3NnaS4nK2F0dHJdKQorCisgICAgZGVmIGNoZWNrT1NFbnZpcm9uKHNlbGYsaGFuZGxlcik6CisgICAgICAgIGVtcHR5ID0ge307IHNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW1wdHkpCisgICAgICAgIGVudiA9IGhhbmRsZXIuZW52aXJvbgorICAgICAgICBmcm9tIG9zIGltcG9ydCBlbnZpcm9uCisgICAgICAgIGZvciBrLHYgaW4gZW52aXJvbi5pdGVtcygpOgorICAgICAgICAgICAgaWYgbm90IGVtcHR5Lmhhc19rZXkoayk6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba10sdikKKyAgICAgICAgZm9yIGssdiBpbiBlbXB0eS5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVudi5oYXNfa2V5KGspKQorCisgICAgZGVmIHRlc3RFbnZpcm9uKHNlbGYpOgorICAgICAgICBoID0gVGVzdEhhbmRsZXIoWD0iWSIpCisgICAgICAgIGguc2V0dXBfZW52aXJvbigpCisgICAgICAgIHNlbGYuY2hlY2tFbnZpcm9uQXR0cnMoaCkKKyAgICAgICAgc2VsZi5jaGVja09TRW52aXJvbihoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsiWCJdLCJZIikKKworICAgIGRlZiB0ZXN0Q0dJRW52aXJvbihzZWxmKToKKyAgICAgICAgaCA9IEJhc2VDR0lIYW5kbGVyKE5vbmUsTm9uZSxOb25lLHt9KQorICAgICAgICBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBmb3Iga2V5IGluICd3c2dpLnVybF9zY2hlbWUnLCAnd3NnaS5pbnB1dCcsICd3c2dpLmVycm9ycyc6CisgICAgICAgICAgICBzZWxmLmFzc2VydF8oaC5lbnZpcm9uLmhhc19rZXkoa2V5KSkKKworICAgIGRlZiB0ZXN0U2NoZW1lKHNlbGYpOgorICAgICAgICBoPVRlc3RIYW5kbGVyKEhUVFBTPSJvbiIpOyBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10sJ2h0dHBzJykKKyAgICAgICAgaD1UZXN0SGFuZGxlcigpOyBoLnNldHVwX2Vudmlyb24oKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ10sJ2h0dHAnKQorCisKKyAgICBkZWYgdGVzdEFic3RyYWN0TWV0aG9kcyhzZWxmKToKKyAgICAgICAgaCA9IEJhc2VIYW5kbGVyKCkKKyAgICAgICAgZm9yIG5hbWUgaW4gWworICAgICAgICAgICAgJ19mbHVzaCcsJ2dldF9zdGRpbicsJ2dldF9zdGRlcnInLCdhZGRfY2dpX3ZhcnMnCisgICAgICAgIF06CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhOb3RJbXBsZW1lbnRlZEVycm9yLCBnZXRhdHRyKGgsbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIGguX3dyaXRlLCAidGVzdCIpCisKKworICAgIGRlZiB0ZXN0Q29udGVudExlbmd0aChzZWxmKToKKyAgICAgICAgIyBEZW1vIG9uZSByZWFzb24gaXRlcmF0aW9uIGlzIGJldHRlciB0aGFuIHdyaXRlKCkuLi4gIDspCisKKyAgICAgICAgZGVmIHRyaXZpYWxfYXBwMShlLHMpOgorICAgICAgICAgICAgcygnMjAwIE9LJyxbXSkKKyAgICAgICAgICAgIHJldHVybiBbZVsnd3NnaS51cmxfc2NoZW1lJ11dCisKKyAgICAgICAgZGVmIHRyaXZpYWxfYXBwMihlLHMpOgorICAgICAgICAgICAgcygnMjAwIE9LJyxbXSkoZVsnd3NnaS51cmxfc2NoZW1lJ10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBoID0gVGVzdEhhbmRsZXIoKQorICAgICAgICBoLnJ1bih0cml2aWFsX2FwcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iCisgICAgICAgICAgICAiQ29udGVudC1MZW5ndGg6IDRcclxuIgorICAgICAgICAgICAgIlxyXG4iCisgICAgICAgICAgICAiaHR0cCIpCisKKyAgICAgICAgaCA9IFRlc3RIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4odHJpdmlhbF9hcHAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIlxyXG4iCisgICAgICAgICAgICAiaHR0cCIpCisKKworCisKKworCisKKyAgICBkZWYgdGVzdEJhc2ljRXJyb3JPdXRwdXQoc2VsZik6CisKKyAgICAgICAgZGVmIG5vbl9lcnJvcl9hcHAoZSxzKToKKyAgICAgICAgICAgIHMoJzIwMCBPSycsW10pCisgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBkZWYgZXJyb3JfYXBwKGUscyk6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiVGhpcyBzaG91bGQgYmUgY2F1Z2h0IGJ5IGhhbmRsZXIiKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihub25fZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIKKyAgICAgICAgICAgICJcclxuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZGVyci5nZXR2YWx1ZSgpLCIiKQorCisgICAgICAgIGggPSBFcnJvckhhbmRsZXIoKQorICAgICAgICBoLnJ1bihlcnJvcl9hcHApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgICJTdGF0dXM6ICVzXHJcbiIKKyAgICAgICAgICAgICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW5cclxuIgorICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoOiAlZFxyXG4iCisgICAgICAgICAgICAiXHJcbiVzIiAlIChoLmVycm9yX3N0YXR1cyxsZW4oaC5lcnJvcl9ib2R5KSxoLmVycm9yX2JvZHkpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhoLnN0ZGVyci5nZXR2YWx1ZSgpLmZpbmQoIkFzc2VydGlvbkVycm9yIik8Pi0xKQorCisgICAgZGVmIHRlc3RFcnJvckFmdGVyT3V0cHV0KHNlbGYpOgorICAgICAgICBNU0cgPSAiU29tZSBvdXRwdXQgaGFzIGJlZW4gc2VudCIKKyAgICAgICAgZGVmIGVycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcygiMjAwIE9LIixbXSkoTVNHKQorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIlRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBoYW5kbGVyIikKKworICAgICAgICBoID0gRXJyb3JIYW5kbGVyKCkKKyAgICAgICAgaC5ydW4oZXJyb3JfYXBwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguc3Rkb3V0LmdldHZhbHVlKCksCisgICAgICAgICAgICAiU3RhdHVzOiAyMDAgT0tcclxuIgorICAgICAgICAgICAgIlxyXG4iK01TRykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKTw+LTEpCisKKworICAgIGRlZiB0ZXN0SGVhZGVyRm9ybWF0cyhzZWxmKToKKworICAgICAgICBkZWYgbm9uX2Vycm9yX2FwcChlLHMpOgorICAgICAgICAgICAgcygnMjAwIE9LJyxbXSkKKyAgICAgICAgICAgIHJldHVybiBbXQorCisgICAgICAgIHN0ZHBhdCA9ICgKKyAgICAgICAgICAgIHIiSFRUUC8lcyAyMDAgT0tcclxuIgorICAgICAgICAgICAgciJEYXRlOiBcd3szfSwgWyAwMTIzXVxkIFx3ezN9IFxkezR9IFxkXGQ6XGRcZDpcZFxkIEdNVFxyXG4iCisgICAgICAgICAgICByIiVzIiByIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIgciJcclxuIgorICAgICAgICApCisgICAgICAgIHNob3J0cGF0ID0gKAorICAgICAgICAgICAgIlN0YXR1czogMjAwIE9LXHJcbiIgIkNvbnRlbnQtTGVuZ3RoOiAwXHJcbiIgIlxyXG4iCisgICAgICAgICkKKworICAgICAgICBmb3Igc3N3IGluICJGb29CYXIvMS4wIiwgTm9uZToKKyAgICAgICAgICAgIHN3ID0gc3N3IGFuZCAiU2VydmVyOiAlc1xyXG4iICUgc3N3IG9yICIiCisKKyAgICAgICAgICAgIGZvciB2ZXJzaW9uIGluICIxLjAiLCAiMS4xIjoKKyAgICAgICAgICAgICAgICBmb3IgcHJvdG8gaW4gIkhUVFAvMC45IiwgIkhUVFAvMS4wIiwgIkhUVFAvMS4xIjoKKworICAgICAgICAgICAgICAgICAgICBoID0gVGVzdEhhbmRsZXIoU0VSVkVSX1BST1RPQ09MPXByb3RvKQorICAgICAgICAgICAgICAgICAgICBoLm9yaWdpbl9zZXJ2ZXIgPSBGYWxzZQorICAgICAgICAgICAgICAgICAgICBoLmh0dHBfdmVyc2lvbiA9IHZlcnNpb24KKyAgICAgICAgICAgICAgICAgICAgaC5zZXJ2ZXJfc29mdHdhcmUgPSBzc3cKKyAgICAgICAgICAgICAgICAgICAgaC5ydW4obm9uX2Vycm9yX2FwcCkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaG9ydHBhdCxoLnN0ZG91dC5nZXR2YWx1ZSgpKQorCisgICAgICAgICAgICAgICAgICAgIGggPSBUZXN0SGFuZGxlcihTRVJWRVJfUFJPVE9DT0w9cHJvdG8pCisgICAgICAgICAgICAgICAgICAgIGgub3JpZ2luX3NlcnZlciA9IFRydWUKKyAgICAgICAgICAgICAgICAgICAgaC5odHRwX3ZlcnNpb24gPSB2ZXJzaW9uCisgICAgICAgICAgICAgICAgICAgIGguc2VydmVyX3NvZnR3YXJlID0gc3N3CisgICAgICAgICAgICAgICAgICAgIGgucnVuKG5vbl9lcnJvcl9hcHApCisgICAgICAgICAgICAgICAgICAgIGlmIHByb3RvPT0iSFRUUC8wLjkiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoLnN0ZG91dC5nZXR2YWx1ZSgpLCIiKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlLm1hdGNoKHN0ZHBhdCUodmVyc2lvbixzdyksIGguc3Rkb3V0LmdldHZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorCisjIFRoaXMgZXBpbG9ndWUgaXMgbmVlZGVkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFB5dGhvbiAyLjUgcmVncnRlc3QgbW9kdWxlCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBpbXBvcnQgdW5pdHRlc3QKKyAgICBmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fc3VpdGUKKyAgICBydW5fc3VpdGUoCisgICAgICAgIHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyLmxvYWRUZXN0c0Zyb21Nb2R1bGUoc3lzLm1vZHVsZXNbX19uYW1lX19dKQorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMgdGhlIGFib3ZlIGxpbmVzIGludGVudGlvbmFsbHkgbGVmdCBibGFuawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWUucHkgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQppbmRleCA4NjA1MmQ3Li43OGFkYjQyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZS5weQpAQCAtMSw0ICsxLDQgQEAKLSMgeG1sY29yZS5ldHJlZSB0ZXN0LiAgVGhpcyBmaWxlIGNvbnRhaW5zIGVub3VnaCB0ZXN0cyB0byBtYWtlIHN1cmUgdGhhdAorIyB4bWwuZXRyZWUgdGVzdC4gIFRoaXMgZmlsZSBjb250YWlucyBlbm91Z2ggdGVzdHMgdG8gbWFrZSBzdXJlIHRoYXQKICMgYWxsIGluY2x1ZGVkIGNvbXBvbmVudHMgd29yayBhcyB0aGV5IHNob3VsZC4gIEZvciBhIG1vcmUgZXh0ZW5zaXZlCiAjIHRlc3Qgc3VpdGUsIHNlZSB0aGUgc2VsZnRlc3Qgc2NyaXB0IGluIHRoZSBFbGVtZW50VHJlZSBkaXN0cmlidXRpb24uCiAKQEAgLTYsOCArNiw2IEBACiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiAKLWZyb20geG1sY29yZS5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKLQogU0FNUExFX1hNTCA9ICIiIgogPGJvZHk+CiAgIDx0YWc+dGV4dDwvdGFnPgpAQCAtMzIsOSArMzAsOSBAQAogICAgICIiIgogICAgIEltcG9ydCBzYW5pdHkuCiAKLSAgICA+Pj4gZnJvbSB4bWxjb3JlLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZQotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCi0gICAgPj4+IGZyb20geG1sY29yZS5ldHJlZSBpbXBvcnQgRWxlbWVudFBhdGgKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50SW5jbHVkZQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFBhdGgKICAgICAiIiIKIAogZGVmIGNoZWNrX21ldGhvZChtZXRob2QpOgpAQCAtNjEsNiArNTksOCBAQAogICAgICIiIgogICAgIFRlc3QgZWxlbWVudCB0cmVlIGludGVyZmFjZS4KIAorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKwogICAgID4+PiBlbGVtZW50ID0gRVQuRWxlbWVudCgidGFnIiwga2V5PSJ2YWx1ZSIpCiAgICAgPj4+IHRyZWUgPSBFVC5FbGVtZW50VHJlZShlbGVtZW50KQogCkBAIC0xMDgsNiArMTA4LDggQEAKICAgICAiIiIKICAgICBUZXN0IGZpbmQgbWV0aG9kcyAoaW5jbHVkaW5nIHhwYXRoIHN5bnRheCkuCiAKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKICAgICA+Pj4gZWxlbSA9IEVULlhNTChTQU1QTEVfWE1MKQogICAgID4+PiBlbGVtLmZpbmQoInRhZyIpLnRhZwogICAgICd0YWcnCkBAIC0xNzQsNiArMTc2LDggQEAKIGRlZiBwYXJzZWxpdGVyYWwoKToKICAgICByIiIiCiAKKyAgICA+Pj4gZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlIGFzIEVUCisKICAgICA+Pj4gZWxlbWVudCA9IEVULlhNTCgiPGh0bWw+PGJvZHk+dGV4dDwvYm9keT48L2h0bWw+IikKICAgICA+Pj4gRVQuRWxlbWVudFRyZWUoZWxlbWVudCkud3JpdGUoc3lzLnN0ZG91dCkKICAgICA8aHRtbD48Ym9keT50ZXh0PC9ib2R5PjwvaHRtbD4KQEAgLTE5NSwxOCArMTk5LDIwIEBACiAgICAgJ2JvZHknCiAgICAgIiIiCiAKLWRlZiBjaGVja19lbmNvZGluZyhlbmNvZGluZyk6CisKK2RlZiBjaGVja19lbmNvZGluZyhFVCwgZW5jb2RpbmcpOgogICAgICIiIgotICAgID4+PiBjaGVja19lbmNvZGluZygiYXNjaWkiKQotICAgID4+PiBjaGVja19lbmNvZGluZygidXMtYXNjaWkiKQotICAgID4+PiBjaGVja19lbmNvZGluZygiaXNvLTg4NTktMSIpCi0gICAgPj4+IGNoZWNrX2VuY29kaW5nKCJpc28tODg1OS0xNSIpCi0gICAgPj4+IGNoZWNrX2VuY29kaW5nKCJjcDQzNyIpCi0gICAgPj4+IGNoZWNrX2VuY29kaW5nKCJtYWMtcm9tYW4iKQorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUgYXMgRVQKKworICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImFzY2lpIikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJ1cy1hc2NpaSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAiaXNvLTg4NTktMSIpCisgICAgPj4+IGNoZWNrX2VuY29kaW5nKEVULCAiaXNvLTg4NTktMTUiKQorICAgID4+PiBjaGVja19lbmNvZGluZyhFVCwgImNwNDM3IikKKyAgICA+Pj4gY2hlY2tfZW5jb2RpbmcoRVQsICJtYWMtcm9tYW4iKQogICAgICIiIgotICAgIEVULlhNTCgKLSAgICAgICAgIjw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9JyVzJz8+PHhtbCAvPiIgJSBlbmNvZGluZwotICAgICAgICApCisgICAgRVQuWE1MKCI8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSclcyc/Pjx4bWwgLz4iICUgZW5jb2RpbmcpCisKIAogIwogIyB4aW5jbHVkZSB0ZXN0cyAoc2FtcGxlcyBmcm9tIGFwcGVuZGl4IEMgb2YgdGhlIHhpbmNsdWRlIHNwZWNpZmljYXRpb24pCkBAIC0yODIsMTQgKzI4OCwxNiBAQAogICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgcmFpc2UgSU9FcnJvcigicmVzb3VyY2Ugbm90IGZvdW5kIikKICAgICBpZiBwYXJzZSA9PSAieG1sIjoKLSAgICAgICAgcmV0dXJuIEVULlhNTChkYXRhKQorICAgICAgICBmcm9tIHhtbC5ldHJlZS5FbGVtZW50VHJlZSBpbXBvcnQgWE1MCisgICAgICAgIHJldHVybiBYTUwoZGF0YSkKICAgICByZXR1cm4gZGF0YQogCiBkZWYgeGluY2x1ZGUoKToKICAgICByIiIiCiAgICAgQmFzaWMgaW5jbHVzaW9uIGV4YW1wbGUgKFhJbmNsdWRlIEMuMSkKIAotICAgID4+PiBmcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IEVsZW1lbnRJbmNsdWRlCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBFbGVtZW50VHJlZSBhcyBFVAorICAgID4+PiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudEluY2x1ZGUKIAogICAgID4+PiBkb2N1bWVudCA9IHhpbmNsdWRlX2xvYWRlcigiQzEueG1sIikKICAgICA+Pj4gRWxlbWVudEluY2x1ZGUuaW5jbHVkZShkb2N1bWVudCwgeGluY2x1ZGVfbG9hZGVyKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weSBiL0xpYi90ZXN0L3Rlc3RfeG1sX2V0cmVlX2MucHkKaW5kZXggNTg3ZWE5OS4uNTZlN2ZlZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxfZXRyZWVfYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3htbF9ldHJlZV9jLnB5CkBAIC0xLDEwICsxLDEwIEBACi0jIHhtbGNvcmUuZXRyZWUgdGVzdCBmb3IgY0VsZW1lbnRUcmVlCisjIHhtbC5ldHJlZSB0ZXN0IGZvciBjRWxlbWVudFRyZWUKIAogaW1wb3J0IGRvY3Rlc3QsIHN5cwogCiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCi1mcm9tIHhtbGNvcmUuZXRyZWUgaW1wb3J0IGNFbGVtZW50VHJlZSBhcyBFVAorZnJvbSB4bWwuZXRyZWUgaW1wb3J0IGNFbGVtZW50VHJlZSBhcyBFVAogCiBTQU1QTEVfWE1MID0gIiIiCiA8Ym9keT4KQEAgLTMwLDcgKzMwLDcgQEAKICAgICAiIiIKICAgICBJbXBvcnQgc2FuaXR5LgogCi0gICAgPj4+IGZyb20geG1sY29yZS5ldHJlZSBpbXBvcnQgY0VsZW1lbnRUcmVlCisgICAgPj4+IGZyb20geG1sLmV0cmVlIGltcG9ydCBjRWxlbWVudFRyZWUKICAgICAiIiIKIAogZGVmIGNoZWNrX21ldGhvZChtZXRob2QpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CmluZGV4IDAyNDEzNDguLjU0Njg0ZjMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKQEAgLTQsNyArNCw3IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgemxpYiA9IE5vbmUKIAotaW1wb3J0IHppcGZpbGUsIG9zLCB1bml0dGVzdAoraW1wb3J0IHppcGZpbGUsIG9zLCB1bml0dGVzdCwgc3lzLCBzaHV0aWwKIAogZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIGZyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeUZpbGUKQEAgLTI4LDE0ICsyOCw3MCBAQAogICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKQogICAgICAgICB6aXBmcC53cml0ZShURVNURk4sICJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiKQogICAgICAgICB6aXBmcC53cml0ZShURVNURk4sIFRFU1RGTikKKyAgICAgICAgemlwZnAud3JpdGVzdHIoInN0cmZpbGUiLCBzZWxmLmRhdGEpCiAgICAgICAgIHppcGZwLmNsb3NlKCkKIAogICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCiAgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZChURVNURk4pLCBzZWxmLmRhdGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiksIHNlbGYuZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5yZWFkKCJzdHJmaWxlIiksIHNlbGYuZGF0YSkKKworICAgICAgICAjIFByaW50IHRoZSBaSVAgZGlyZWN0b3J5CisgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICBzdGRvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHN5cy5zdGRvdXQgPSBmcAorCisgICAgICAgICAgICB6aXBmcC5wcmludGRpcigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc3Rkb3V0CisKKyAgICAgICAgZGlyZWN0b3J5ID0gZnAuZ2V0dmFsdWUoKQorICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKKworICAgICAgICBzZWxmLmFzc2VydF8oJ0ZpbGUgTmFtZScgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0XygnTW9kaWZpZWQnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydF8oJ1NpemUnIGluIGxpbmVzWzBdKQorCisgICAgICAgIGZuLCBkYXRlLCB0aW1lLCBzaXplID0gbGluZXNbMV0uc3BsaXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmbiwgJ2Fub3RoZXIubmFtZScpCisgICAgICAgICMgWFhYOiB0aW1lc3RhbXAgaXMgbm90IHRlc3RlZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzaXplLCBzdHIobGVuKHNlbGYuZGF0YSkpKQorCisgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CisgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmFtZXMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Xygic3RyZmlsZSIgaW4gbmFtZXMpCisKKyAgICAgICAgIyBDaGVjayBpbmZvbGlzdAorICAgICAgICBpbmZvcyA9IHppcGZwLmluZm9saXN0KCkKKyAgICAgICAgbmFtZXMgPSBbIGkuZmlsZW5hbWUgZm9yIGkgaW4gaW5mb3MgXQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmFtZXMpLCAzKQorICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0Xygic3RyZmlsZSIgaW4gbmFtZXMpCisgICAgICAgIGZvciBpIGluIGluZm9zOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICMgY2hlY2sgZ2V0aW5mbworICAgICAgICBmb3Igbm0gaW4gKFRFU1RGTiwgImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIsICJzdHJmaWxlIik6CisgICAgICAgICAgICBpbmZvID0gemlwZnAuZ2V0aW5mbyhubSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZmlsZW5hbWUsIG5tKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaW5mby5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQorCisgICAgICAgICMgQ2hlY2sgdGhhdCB0ZXN0emlwIGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgIHppcGZwLnRlc3R6aXAoKQorCisKICAgICAgICAgemlwZnAuY2xvc2UoKQogCisKKworCiAgICAgZGVmIHRlc3RTdG9yZWQoc2VsZik6CiAgICAgICAgIGZvciBmIGluIChURVNURk4yLCBUZW1wb3JhcnlGaWxlKCksIFN0cmluZ0lPKCkpOgogICAgICAgICAgICAgc2VsZi56aXBUZXN0KGYsIHppcGZpbGUuWklQX1NUT1JFRCkKQEAgLTU5LDYgKzExNSwxOTcgQEAKICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKICAgICAgICAgb3MucmVtb3ZlKFRFU1RGTjIpCiAKK2NsYXNzIFRlc3RaaXA2NEluU21hbGxGaWxlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyBUaGVzZSB0ZXN0cyB0ZXN0IHRoZSBaSVA2NCBmdW5jdGlvbmFsaXR5IHdpdGhvdXQgdXNpbmcgbGFyZ2UgZmlsZXMsCisgICAgIyBzZWUgdGVzdF96aXBmaWxlNjQgZm9yIHByb3BlciB0ZXN0cy4KKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbGltaXQgPSB6aXBmaWxlLlpJUDY0X0xJTUlUCisgICAgICAgIHppcGZpbGUuWklQNjRfTElNSVQgPSA1CisKKyAgICAgICAgbGluZV9nZW4gPSAoIlRlc3Qgb2YgemlwZmlsZSBsaW5lICVkLiIgJSBpIGZvciBpIGluIHJhbmdlKDAsIDEwMDApKQorICAgICAgICBzZWxmLmRhdGEgPSAnXG4nLmpvaW4obGluZV9nZW4pCisKKyAgICAgICAgIyBNYWtlIGEgc291cmNlIGZpbGUgd2l0aCBzb21lIGxpbmVzCisgICAgICAgIGZwID0gb3BlbihURVNURk4sICJ3YiIpCisgICAgICAgIGZwLndyaXRlKHNlbGYuZGF0YSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgZGVmIGxhcmdlRmlsZUV4Y2VwdGlvblRlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAidyIsIGNvbXByZXNzaW9uKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh6aXBmaWxlLkxhcmdlWmlwRmlsZSwKKyAgICAgICAgICAgICAgICB6aXBmcC53cml0ZSwgVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIikKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIGxhcmdlRmlsZUV4Y2VwdGlvblRlc3QyKHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoemlwZmlsZS5MYXJnZVppcEZpbGUsCisgICAgICAgICAgICAgICAgemlwZnAud3JpdGVzdHIsICJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiLCBzZWxmLmRhdGEpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0TGFyZ2VGaWxlRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYubGFyZ2VGaWxlRXhjZXB0aW9uVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisgICAgICAgICAgICBzZWxmLmxhcmdlRmlsZUV4Y2VwdGlvblRlc3QyKGYsIHppcGZpbGUuWklQX1NUT1JFRCkKKworICAgIGRlZiB6aXBUZXN0KHNlbGYsIGYsIGNvbXByZXNzaW9uKToKKyAgICAgICAgIyBDcmVhdGUgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJ3IiwgY29tcHJlc3Npb24sIGFsbG93WmlwNjQ9VHJ1ZSkKKyAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCAiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIikKKyAgICAgICAgemlwZnAud3JpdGUoVEVTVEZOLCBURVNURk4pCisgICAgICAgIHppcGZwLndyaXRlc3RyKCJzdHJmaWxlIiwgc2VsZi5kYXRhKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICAgICAgIyBSZWFkIHRoZSBaSVAgYXJjaGl2ZQorICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShmLCAiciIsIGNvbXByZXNzaW9uKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoVEVTVEZOKSwgc2VsZi5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHppcGZwLnJlYWQoImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIpLCBzZWxmLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgic3RyZmlsZSIpLCBzZWxmLmRhdGEpCisKKyAgICAgICAgIyBQcmludCB0aGUgWklQIGRpcmVjdG9yeQorICAgICAgICBmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgc3Rkb3V0ID0gc3lzLnN0ZG91dAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gZnAKKworICAgICAgICAgICAgemlwZnAucHJpbnRkaXIoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZG91dCA9IHN0ZG91dAorCisgICAgICAgIGRpcmVjdG9yeSA9IGZwLmdldHZhbHVlKCkKKyAgICAgICAgbGluZXMgPSBkaXJlY3Rvcnkuc3BsaXRsaW5lcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsaW5lcyksIDQpICMgTnVtYmVyIG9mIGZpbGVzICsgaGVhZGVyCisKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdGaWxlIE5hbWUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydF8oJ01vZGlmaWVkJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCdTaXplJyBpbiBsaW5lc1swXSkKKworICAgICAgICBmbiwgZGF0ZSwgdGltZSwgc2l6ZSA9IGxpbmVzWzFdLnNwbGl0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZm4sICdhbm90aGVyLm5hbWUnKQorICAgICAgICAjIFhYWDogdGltZXN0YW1wIGlzIG5vdCB0ZXN0ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2l6ZSwgc3RyKGxlbihzZWxmLmRhdGEpKSkKKworICAgICAgICAjIENoZWNrIHRoZSBuYW1lbGlzdAorICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorCisgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKKyAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCisgICAgICAgIG5hbWVzID0gWyBpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zIF0KKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorICAgICAgICBmb3IgaSBpbiBpbmZvczoKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIGNoZWNrIGdldGluZm8KKyAgICAgICAgZm9yIG5tIGluIChURVNURk4sICJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiLCAic3RyZmlsZSIpOgorICAgICAgICAgICAgaW5mbyA9IHppcGZwLmdldGluZm8obm0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpbmZvLmZpbGVuYW1lLCBubSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGluZm8uZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKKworICAgICAgICAjIENoZWNrIHRoYXQgdGVzdHppcCBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbgorICAgICAgICB6aXBmcC50ZXN0emlwKCkKKworCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0U3RvcmVkKHNlbGYpOgorICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKworICAgIGlmIHpsaWI6CisgICAgICAgIGRlZiB0ZXN0RGVmbGF0ZWQoc2VsZik6CisgICAgICAgICAgICBmb3IgZiBpbiAoVEVTVEZOMiwgVGVtcG9yYXJ5RmlsZSgpLCBTdHJpbmdJTygpKToKKyAgICAgICAgICAgICAgICBzZWxmLnppcFRlc3QoZiwgemlwZmlsZS5aSVBfREVGTEFURUQpCisKKyAgICBkZWYgdGVzdEFic29sdXRlQXJjbmFtZXMoc2VsZik6CisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTjIsICJ3IiwgemlwZmlsZS5aSVBfU1RPUkVELCBhbGxvd1ppcDY0PVRydWUpCisgICAgICAgIHppcGZwLndyaXRlKFRFU1RGTiwgIi9hYnNvbHV0ZSIpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgICAgICB6aXBmcCA9IHppcGZpbGUuWmlwRmlsZShURVNURk4yLCAiciIsIHppcGZpbGUuWklQX1NUT1JFRCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6aXBmcC5uYW1lbGlzdCgpLCBbImFic29sdXRlIl0pCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICB6aXBmaWxlLlpJUDY0X0xJTUlUID0gc2VsZi5fbGltaXQKKyAgICAgICAgb3MucmVtb3ZlKFRFU1RGTikKKyAgICAgICAgb3MucmVtb3ZlKFRFU1RGTjIpCisKK2NsYXNzIFB5WmlwRmlsZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdFdyaXRlUHlmaWxlKHNlbGYpOgorICAgICAgICB6aXBmcCAgPSB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikKKyAgICAgICAgZm4gPSBfX2ZpbGVfXworICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLnB5YycpIG9yIGZuLmVuZHN3aXRoKCcucHlvJyk6CisgICAgICAgICAgICBmbiA9IGZuWzotMV0KKworICAgICAgICB6aXBmcC53cml0ZXB5KGZuKQorCisgICAgICAgIGJuID0gb3MucGF0aC5iYXNlbmFtZShmbikKKyAgICAgICAgc2VsZi5hc3NlcnRfKGJuIG5vdCBpbiB6aXBmcC5uYW1lbGlzdCgpKQorICAgICAgICBzZWxmLmFzc2VydF8oYm4gKyAnbycgaW4gemlwZnAubmFtZWxpc3QoKSBvciBibiArICdjJyBpbiB6aXBmcC5uYW1lbGlzdCgpKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKworICAgICAgICB6aXBmcCAgPSB6aXBmaWxlLlB5WmlwRmlsZShUZW1wb3JhcnlGaWxlKCksICJ3IikKKyAgICAgICAgZm4gPSBfX2ZpbGVfXworICAgICAgICBpZiBmbi5lbmRzd2l0aCgnLnB5YycpIG9yIGZuLmVuZHN3aXRoKCcucHlvJyk6CisgICAgICAgICAgICBmbiA9IGZuWzotMV0KKworICAgICAgICB6aXBmcC53cml0ZXB5KGZuLCAidGVzdHBhY2thZ2UiKQorCisgICAgICAgIGJuID0gIiVzLyVzIiUoInRlc3RwYWNrYWdlIiwgb3MucGF0aC5iYXNlbmFtZShmbikpCisgICAgICAgIHNlbGYuYXNzZXJ0XyhibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgemlwZnAuY2xvc2UoKQorCisgICAgZGVmIHRlc3RXcml0ZVB5dGhvblBhY2thZ2Uoc2VsZik6CisgICAgICAgIGltcG9ydCBlbWFpbAorICAgICAgICBwYWNrYWdlZGlyID0gb3MucGF0aC5kaXJuYW1lKGVtYWlsLl9fZmlsZV9fKQorCisgICAgICAgIHppcGZwICA9IHppcGZpbGUuUHlaaXBGaWxlKFRlbXBvcmFyeUZpbGUoKSwgInciKQorICAgICAgICB6aXBmcC53cml0ZXB5KHBhY2thZ2VkaXIpCisKKyAgICAgICAgIyBDaGVjayBmb3IgYSBjb3VwbGUgb2YgbW9kdWxlcyBhdCBkaWZmZXJlbnQgbGV2ZWxzIG9mIHRoZSBoaWVhcmFyY2h5CisgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQorICAgICAgICBzZWxmLmFzc2VydF8oJ2VtYWlsL19faW5pdF9fLnB5bycgaW4gbmFtZXMgb3IgJ2VtYWlsL19faW5pdF9fLnB5YycgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0XygnZW1haWwvbWltZS90ZXh0LnB5bycgaW4gbmFtZXMgb3IgJ2VtYWlsL21pbWUvdGV4dC5weWMnIGluIG5hbWVzKQorCisgICAgZGVmIHRlc3RXcml0ZVB5dGhvbkRpcmVjdG9yeShzZWxmKToKKyAgICAgICAgb3MubWtkaXIoVEVTVEZOMikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnAgPSBvcGVuKG9zLnBhdGguam9pbihURVNURk4yLCAibW9kMS5weSIpLCAidyIpCisgICAgICAgICAgICBmcC53cml0ZSgicHJpbnQgNDJcbiIpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDIucHkiKSwgInciKQorICAgICAgICAgICAgZnAud3JpdGUoInByaW50IDQyICogNDJcbiIpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisKKyAgICAgICAgICAgIGZwID0gb3Blbihvcy5wYXRoLmpvaW4oVEVTVEZOMiwgIm1vZDIudHh0IiksICJ3IikKKyAgICAgICAgICAgIGZwLndyaXRlKCJibGEgYmxhIGJsYVxuIikKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICAgICAgemlwZnAgID0gemlwZmlsZS5QeVppcEZpbGUoVGVtcG9yYXJ5RmlsZSgpLCAidyIpCisgICAgICAgICAgICB6aXBmcC53cml0ZXB5KFRFU1RGTjIpCisKKyAgICAgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdtb2QxLnB5YycgaW4gbmFtZXMgb3IgJ21vZDEucHlvJyBpbiBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnbW9kMi5weWMnIGluIG5hbWVzIG9yICdtb2QyLnB5bycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydF8oJ21vZDIudHh0JyBub3QgaW4gbmFtZXMpCisKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoVEVTVEZOMikKKworCisKIGNsYXNzIE90aGVyVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0Q2xvc2VFcnJvbmVvdXNGaWxlKHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdCBjaGVja3MgdGhhdCB0aGUgWmlwRmlsZSBjb25zdHJ1Y3RvciBjbG9zZXMgdGhlIGZpbGUgb2JqZWN0CkBAIC0xMDMsNyArMzUwLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCB6aXBmLnRlc3R6aXApCiAKIGRlZiB0ZXN0X21haW4oKToKLSAgICBydW5fdW5pdHRlc3QoVGVzdHNXaXRoU291cmNlRmlsZSwgT3RoZXJUZXN0cykKKyAgICBydW5fdW5pdHRlc3QoVGVzdHNXaXRoU291cmNlRmlsZSwgVGVzdFppcDY0SW5TbWFsbEZpbGVzLCBPdGhlclRlc3RzLCBQeVppcEZpbGVUZXN0cykKKyAgICAjcnVuX3VuaXR0ZXN0KFRlc3RaaXA2NEluU21hbGxGaWxlcykKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlNjQucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGU2NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDljZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBmaWxlNjQucHkKQEAgLTAsMCArMSwxMDEgQEAKKyMgVGVzdHMgb2YgdGhlIGZ1bGwgWklQNjQgZnVuY3Rpb25hbGl0eSBvZiB6aXBmaWxlCisjIFRoZSB0ZXN0X3N1cHBvcnQucmVxdWlyZXMgY2FsbCBpcyB0aGUgb25seSByZWFzb24gZm9yIGtlZXBpbmcgdGhpcyBzZXBhcmF0ZQorIyBmcm9tIHRlc3RfemlwZmlsZQorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKyMgWFhYKG5ub3J3aXR6KTogZGlzYWJsZSB0aGlzIHRlc3QgYnkgbG9va2luZyBmb3IgZXh0cmEgbGFyZ2ZpbGUgcmVzb3VyY2UKKyMgd2hpY2ggZG9lc24ndCBleGlzdC4gIFRoaXMgdGVzdCB0YWtlcyBvdmVyIDMwIG1pbnV0ZXMgdG8gcnVuIGluIGdlbmVyYWwKKyMgYW5kIHJlcXVpcmVzIG1vcmUgZGlzayBzcGFjZSB0aGFuIG1vc3Qgb2YgdGhlIGJ1aWxkYm90cy4KK3Rlc3Rfc3VwcG9ydC5yZXF1aXJlcygKKyAgICAgICAgJ2V4dHJhbGFyZ2VmaWxlJywKKyAgICAgICAgJ3Rlc3QgcmVxdWlyZXMgbG9hZHMgb2YgZGlzay1zcGFjZSBieXRlcyBhbmQgYSBsb25nIHRpbWUgdG8gcnVuJworICAgICkKKworIyBXZSBjYW4gdGVzdCBwYXJ0IG9mIHRoZSBtb2R1bGUgd2l0aG91dCB6bGliLgordHJ5OgorICAgIGltcG9ydCB6bGliCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgemxpYiA9IE5vbmUKKworaW1wb3J0IHppcGZpbGUsIG9zLCB1bml0dGVzdAoraW1wb3J0IHRpbWUKK2ltcG9ydCBzeXMKKworZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdGVtcGZpbGUgaW1wb3J0IFRlbXBvcmFyeUZpbGUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVEVTVEZOLCBydW5fdW5pdHRlc3QKKworVEVTVEZOMiA9IFRFU1RGTiArICIyIgorCisjIEhvdyBtdWNoIHRpbWUgaW4gc2Vjb25kcyBjYW4gcGFzcyBiZWZvcmUgd2UgcHJpbnQgYSAnU3RpbGwgd29ya2luZycgbWVzc2FnZS4KK19QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTCA9IDUgKiA2MAorCitjbGFzcyBUZXN0c1dpdGhTb3VyY2VGaWxlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgICMgQ3JlYXRlIHRlc3QgZGF0YS4KKyAgICAgICAgIyB4cmFuZ2UoKSBpcyBpbXBvcnRhbnQgaGVyZSAtLSBkb24ndCB3YW50IHRvIGNyZWF0ZSBpbW1vcnRhbCBzcGFjZQorICAgICAgICAjIGZvciBhIG1pbGxpb24gaW50cy4KKyAgICAgICAgbGluZV9nZW4gPSAoIlRlc3Qgb2YgemlwZmlsZSBsaW5lICVkLiIgJSBpIGZvciBpIGluIHhyYW5nZSgxMDAwMDAwKSkKKyAgICAgICAgc2VsZi5kYXRhID0gJ1xuJy5qb2luKGxpbmVfZ2VuKQorCisgICAgICAgICMgQW5kIHdyaXRlIGl0IHRvIGEgZmlsZS4KKyAgICAgICAgZnAgPSBvcGVuKFRFU1RGTiwgIndiIikKKyAgICAgICAgZnAud3JpdGUoc2VsZi5kYXRhKQorICAgICAgICBmcC5jbG9zZSgpCisKKyAgICBkZWYgemlwVGVzdChzZWxmLCBmLCBjb21wcmVzc2lvbik6CisgICAgICAgICMgQ3JlYXRlIHRoZSBaSVAgYXJjaGl2ZS4KKyAgICAgICAgemlwZnAgPSB6aXBmaWxlLlppcEZpbGUoZiwgInciLCBjb21wcmVzc2lvbiwgYWxsb3daaXA2ND1UcnVlKQorCisgICAgICAgICMgSXQgd2lsbCBjb250YWluIGVub3VnaCBjb3BpZXMgb2Ygc2VsZi5kYXRhIHRvIHJlYWNoIGFib3V0IDZHQiBvZgorICAgICAgICAjIHJhdyBkYXRhIHRvIHN0b3JlLgorICAgICAgICBmaWxlY291bnQgPSA2KjEwMjQqKjMgLy8gbGVuKHNlbGYuZGF0YSkKKworICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICBmb3IgbnVtIGluIHJhbmdlKGZpbGVjb3VudCk6CisgICAgICAgICAgICB6aXBmcC53cml0ZXN0cigidGVzdGZuJWQiICUgbnVtLCBzZWxmLmRhdGEpCisgICAgICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CisgICAgICAgICAgICBpZiBuZXh0X3RpbWUgPD0gdGltZS50aW1lKCk6CisgICAgICAgICAgICAgICAgbmV4dF90aW1lID0gdGltZS50aW1lKCkgKyBfUFJJTlRfV09SS0lOR19NU0dfSU5URVJWQUwKKyAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCAoCisgICAgICAgICAgICAgICAgICAgJyAgemlwVGVzdCBzdGlsbCB3cml0aW5nICVkIG9mICVkLCBiZSBwYXRpZW50Li4uJyAlCisgICAgICAgICAgICAgICAgICAgKG51bSwgZmlsZWNvdW50KSkKKyAgICAgICAgICAgICAgICBzeXMuX19zdGRvdXRfXy5mbHVzaCgpCisgICAgICAgIHppcGZwLmNsb3NlKCkKKworICAgICAgICAjIFJlYWQgdGhlIFpJUCBhcmNoaXZlCisgICAgICAgIHppcGZwID0gemlwZmlsZS5aaXBGaWxlKGYsICJyIiwgY29tcHJlc3Npb24pCisgICAgICAgIGZvciBudW0gaW4gcmFuZ2UoZmlsZWNvdW50KToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemlwZnAucmVhZCgidGVzdGZuJWQiICUgbnVtKSwgc2VsZi5kYXRhKQorICAgICAgICAgICAgIyBQcmludCBzdGlsbCB3b3JraW5nIG1lc3NhZ2Ugc2luY2UgdGhpcyB0ZXN0IGNhbiBiZSByZWFsbHkgc2xvdworICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCisgICAgICAgICAgICAgICAgcHJpbnQgPj5zeXMuX19zdGRvdXRfXywgKAorICAgICAgICAgICAgICAgICAgICcgIHppcFRlc3Qgc3RpbGwgcmVhZGluZyAlZCBvZiAlZCwgYmUgcGF0aWVudC4uLicgJQorICAgICAgICAgICAgICAgICAgIChudW0sIGZpbGVjb3VudCkpCisgICAgICAgICAgICAgICAgc3lzLl9fc3Rkb3V0X18uZmx1c2goKQorICAgICAgICB6aXBmcC5jbG9zZSgpCisKKyAgICBkZWYgdGVzdFN0b3JlZChzZWxmKToKKyAgICAgICAgIyBUcnkgdGhlIHRlbXAgZmlsZSBmaXJzdC4gIElmIHdlIGRvIFRFU1RGTjIgZmlyc3QsIHRoZW4gaXQgaG9ncworICAgICAgICAjIGdpZ2FieXRlcyBvZiBkaXNrIHNwYWNlIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIHRlc3QuCisgICAgICAgIGZvciBmIGluIFRlbXBvcmFyeUZpbGUoKSwgVEVTVEZOMjoKKyAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9TVE9SRUQpCisKKyAgICBpZiB6bGliOgorICAgICAgICBkZWYgdGVzdERlZmxhdGVkKHNlbGYpOgorICAgICAgICAgICAgIyBUcnkgdGhlIHRlbXAgZmlsZSBmaXJzdC4gIElmIHdlIGRvIFRFU1RGTjIgZmlyc3QsIHRoZW4gaXQgaG9ncworICAgICAgICAgICAgIyBnaWdhYnl0ZXMgb2YgZGlzayBzcGFjZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSB0ZXN0LgorICAgICAgICAgICAgZm9yIGYgaW4gVGVtcG9yYXJ5RmlsZSgpLCBURVNURk4yOgorICAgICAgICAgICAgICAgIHNlbGYuemlwVGVzdChmLCB6aXBmaWxlLlpJUF9ERUZMQVRFRCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZm9yIGZuYW1lIGluIFRFU1RGTiwgVEVTVEZOMjoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuYW1lKToKKyAgICAgICAgICAgICAgICBvcy5yZW1vdmUoZm5hbWUpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoVGVzdHNXaXRoU291cmNlRmlsZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF96bGliLnB5IGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CmluZGV4IGNjYmM4ZmQuLjQ0NDA5NDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3psaWIucHkKQEAgLTMwMiw2MyArMzAyLDY1IEBACiAgICAgICAgIGRjbyA9IHpsaWIuZGVjb21wcmVzc29iaigpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGNvLmZsdXNoKCksICIiKSAjIFJldHVybnMgbm90aGluZwogCi0gICAgZGVmIHRlc3RfY29tcHJlc3Njb3B5KHNlbGYpOgotICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdAotICAgICAgICBkYXRhMCA9IEhBTUxFVF9TQ0VORQotICAgICAgICBkYXRhMSA9IEhBTUxFVF9TQ0VORS5zd2FwY2FzZSgpCi0gICAgICAgIGMwID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKLSAgICAgICAgYnVmczAgPSBbXQotICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQorICAgIGlmIGhhc2F0dHIoemxpYi5jb21wcmVzc29iaigpLCAiY29weSIpOgorICAgICAgICBkZWYgdGVzdF9jb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdAorICAgICAgICAgICAgZGF0YTAgPSBIQU1MRVRfU0NFTkUKKyAgICAgICAgICAgIGRhdGExID0gSEFNTEVUX1NDRU5FLnN3YXBjYXNlKCkKKyAgICAgICAgICAgIGMwID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfQkVTVF9DT01QUkVTU0lPTikKKyAgICAgICAgICAgIGJ1ZnMwID0gW10KKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5jb21wcmVzcyhkYXRhMCkpCiAKLSAgICAgICAgYzEgPSBjMC5jb3B5KCkKLSAgICAgICAgYnVmczEgPSBidWZzMFs6XQorICAgICAgICAgICAgYzEgPSBjMC5jb3B5KCkKKyAgICAgICAgICAgIGJ1ZnMxID0gYnVmczBbOl0KIAotICAgICAgICBidWZzMC5hcHBlbmQoYzAuY29tcHJlc3MoZGF0YTApKQotICAgICAgICBidWZzMC5hcHBlbmQoYzAuZmx1c2goKSkKLSAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQorICAgICAgICAgICAgYnVmczAuYXBwZW5kKGMwLmNvbXByZXNzKGRhdGEwKSkKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChjMC5mbHVzaCgpKQorICAgICAgICAgICAgczAgPSAnJy5qb2luKGJ1ZnMwKQogCi0gICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5jb21wcmVzcyhkYXRhMSkpCi0gICAgICAgIGJ1ZnMxLmFwcGVuZChjMS5mbHVzaCgpKQotICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCisgICAgICAgICAgICBidWZzMS5hcHBlbmQoYzEuY29tcHJlc3MoZGF0YTEpKQorICAgICAgICAgICAgYnVmczEuYXBwZW5kKGMxLmZsdXNoKCkpCisgICAgICAgICAgICBzMSA9ICcnLmpvaW4oYnVmczEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmRlY29tcHJlc3MoczApLGRhdGEwK2RhdGEwKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMSksZGF0YTArZGF0YTEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMCksZGF0YTArZGF0YTApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpsaWIuZGVjb21wcmVzcyhzMSksZGF0YTArZGF0YTEpCiAKLSAgICBkZWYgdGVzdF9iYWRjb21wcmVzc2NvcHkoc2VsZik6Ci0gICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQotICAgICAgICBjID0gemxpYi5jb21wcmVzc29iaigpCi0gICAgICAgIGMuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQotICAgICAgICBjLmZsdXNoKCkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgYy5jb3B5KQorICAgICAgICBkZWYgdGVzdF9iYWRjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgICAgIGMgPSB6bGliLmNvbXByZXNzb2JqKCkKKyAgICAgICAgICAgIGMuY29tcHJlc3MoSEFNTEVUX1NDRU5FKQorICAgICAgICAgICAgYy5mbHVzaCgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjLmNvcHkpCiAKLSAgICBkZWYgdGVzdF9kZWNvbXByZXNzY29weShzZWxmKToKLSAgICAgICAgIyBUZXN0IGNvcHlpbmcgYSBkZWNvbXByZXNzaW9uIG9iamVjdAotICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FCi0gICAgICAgIGNvbXAgPSB6bGliLmNvbXByZXNzKGRhdGEpCisgICAgaWYgaGFzYXR0cih6bGliLmRlY29tcHJlc3NvYmooKSwgImNvcHkiKToKKyAgICAgICAgZGVmIHRlc3RfZGVjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGRlY29tcHJlc3Npb24gb2JqZWN0CisgICAgICAgICAgICBkYXRhID0gSEFNTEVUX1NDRU5FCisgICAgICAgICAgICBjb21wID0gemxpYi5jb21wcmVzcyhkYXRhKQogCi0gICAgICAgIGQwID0gemxpYi5kZWNvbXByZXNzb2JqKCkKLSAgICAgICAgYnVmczAgPSBbXQotICAgICAgICBidWZzMC5hcHBlbmQoZDAuZGVjb21wcmVzcyhjb21wWzozMl0pKQorICAgICAgICAgICAgZDAgPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICAgICAgYnVmczAgPSBbXQorICAgICAgICAgICAgYnVmczAuYXBwZW5kKGQwLmRlY29tcHJlc3MoY29tcFs6MzJdKSkKIAotICAgICAgICBkMSA9IGQwLmNvcHkoKQotICAgICAgICBidWZzMSA9IGJ1ZnMwWzpdCisgICAgICAgICAgICBkMSA9IGQwLmNvcHkoKQorICAgICAgICAgICAgYnVmczEgPSBidWZzMFs6XQogCi0gICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCi0gICAgICAgIHMwID0gJycuam9pbihidWZzMCkKKyAgICAgICAgICAgIGJ1ZnMwLmFwcGVuZChkMC5kZWNvbXByZXNzKGNvbXBbMzI6XSkpCisgICAgICAgICAgICBzMCA9ICcnLmpvaW4oYnVmczApCiAKLSAgICAgICAgYnVmczEuYXBwZW5kKGQxLmRlY29tcHJlc3MoY29tcFszMjpdKSkKLSAgICAgICAgczEgPSAnJy5qb2luKGJ1ZnMxKQorICAgICAgICAgICAgYnVmczEuYXBwZW5kKGQxLmRlY29tcHJlc3MoY29tcFszMjpdKSkKKyAgICAgICAgICAgIHMxID0gJycuam9pbihidWZzMSkKIAotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLHMxKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMwLHMxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzMCxkYXRhKQogCi0gICAgZGVmIHRlc3RfYmFkZGVjb21wcmVzc2NvcHkoc2VsZik6Ci0gICAgICAgICMgVGVzdCBjb3B5aW5nIGEgY29tcHJlc3Npb24gb2JqZWN0IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZQotICAgICAgICBkYXRhID0gemxpYi5jb21wcmVzcyhIQU1MRVRfU0NFTkUpCi0gICAgICAgIGQgPSB6bGliLmRlY29tcHJlc3NvYmooKQotICAgICAgICBkLmRlY29tcHJlc3MoZGF0YSkKLSAgICAgICAgZC5mbHVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGQuY29weSkKKyAgICAgICAgZGVmIHRlc3RfYmFkZGVjb21wcmVzc2NvcHkoc2VsZik6CisgICAgICAgICAgICAjIFRlc3QgY29weWluZyBhIGNvbXByZXNzaW9uIG9iamVjdCBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUKKyAgICAgICAgICAgIGRhdGEgPSB6bGliLmNvbXByZXNzKEhBTUxFVF9TQ0VORSkKKyAgICAgICAgICAgIGQgPSB6bGliLmRlY29tcHJlc3NvYmooKQorICAgICAgICAgICAgZC5kZWNvbXByZXNzKGRhdGEpCisgICAgICAgICAgICBkLmZsdXNoKCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGQuY29weSkKIAogZGVmIGdlbmJsb2NrKHNlZWQsIGxlbmd0aCwgc3RlcD0xMDI0LCBnZW5lcmF0b3I9cmFuZG9tKToKICAgICAiIiJsZW5ndGgtYnl0ZSBzdHJlYW0gb2YgcmFuZG9tIGRhdGEgZnJvbSBhIHNlZWQgKGluIHN0ZXAtYnl0ZSBibG9ja3MpLiIiIgpkaWZmIC0tZ2l0IGEvTGliL3RleHR3cmFwLnB5IGIvTGliL3RleHR3cmFwLnB5CmluZGV4IDdjNjgyODAuLmNjZmYyYWIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXh0d3JhcC5weQorKysgYi9MaWIvdGV4dHdyYXAucHkKQEAgLTMxNyw0MSArMzE3LDU4IEBACiAKICMgLS0gTG9vc2VseSByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitfd2hpdGVzcGFjZV9vbmx5X3JlID0gcmUuY29tcGlsZSgnXlsgXHRdKyQnLCByZS5NVUxUSUxJTkUpCitfbGVhZGluZ193aGl0ZXNwYWNlX3JlID0gcmUuY29tcGlsZSgnKF5bIFx0XSopKD86W14gXHRcbl0pJywgcmUuTVVMVElMSU5FKQorCiBkZWYgZGVkZW50KHRleHQpOgotICAgICIiImRlZGVudCh0ZXh0IDogc3RyaW5nKSAtPiBzdHJpbmcKKyAgICAiIiJSZW1vdmUgYW55IGNvbW1vbiBsZWFkaW5nIHdoaXRlc3BhY2UgZnJvbSBldmVyeSBsaW5lIGluIGB0ZXh0YC4KIAotICAgIFJlbW92ZSBhbnkgd2hpdGVzcGFjZSB0aGFuIGNhbiBiZSB1bmlmb3JtbHkgcmVtb3ZlZCBmcm9tIHRoZSBsZWZ0Ci0gICAgb2YgZXZlcnkgbGluZSBpbiBgdGV4dGAuCisgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBtYWtlIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBsaW5lIHVwIHdpdGggdGhlIGxlZnQKKyAgICBlZGdlIG9mIHRoZSBkaXNwbGF5LCB3aGlsZSBzdGlsbCBwcmVzZW50aW5nIHRoZW0gaW4gdGhlIHNvdXJjZSBjb2RlCisgICAgaW4gaW5kZW50ZWQgZm9ybS4KIAotICAgIFRoaXMgY2FuIGJlIHVzZWQgZS5nLiB0byBtYWtlIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBsaW5lIHVwIHdpdGgKLSAgICB0aGUgbGVmdCBlZGdlIG9mIHNjcmVlbi93aGF0ZXZlciwgd2hpbGUgc3RpbGwgcHJlc2VudGluZyBpdCBpbiB0aGUKLSAgICBzb3VyY2UgY29kZSBpbiBpbmRlbnRlZCBmb3JtLgotCi0gICAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgICAgZGVmIHRlc3QoKToKLSAgICAgICAgICAgICMgZW5kIGZpcnN0IGxpbmUgd2l0aCBcIHRvIGF2b2lkIHRoZSBlbXB0eSBsaW5lIQotICAgICAgICAgICAgcyA9ICcnJ1wKLSAgICAgICAgICAgIGhlbGxvCi0gICAgICAgICAgICAgIHdvcmxkCi0gICAgICAgICAgICAnJycKLSAgICAgICAgICAgIHByaW50IHJlcHIocykgICAgICAgICAgIyBwcmludHMgJyAgICBoZWxsb1xuICAgICAgd29ybGRcbiAgICAnCi0gICAgICAgICAgICBwcmludCByZXByKGRlZGVudChzKSkgICMgcHJpbnRzICdoZWxsb1xuICB3b3JsZFxuJworICAgIE5vdGUgdGhhdCB0YWJzIGFuZCBzcGFjZXMgYXJlIGJvdGggdHJlYXRlZCBhcyB3aGl0ZXNwYWNlLCBidXQgdGhleQorICAgIGFyZSBub3QgZXF1YWw6IHRoZSBsaW5lcyAiICBoZWxsbyIgYW5kICJcdGhlbGxvIiBhcmUKKyAgICBjb25zaWRlcmVkIHRvIGhhdmUgbm8gY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS4gIChUaGlzIGJlaGF2aW91ciBpcworICAgIG5ldyBpbiBQeXRob24gMi41OyBvbGRlciB2ZXJzaW9ucyBvZiB0aGlzIG1vZHVsZSBpbmNvcnJlY3RseQorICAgIGV4cGFuZGVkIHRhYnMgYmVmb3JlIHNlYXJjaGluZyBmb3IgY29tbW9uIGxlYWRpbmcgd2hpdGVzcGFjZS4pCiAgICAgIiIiCi0gICAgbGluZXMgPSB0ZXh0LmV4cGFuZHRhYnMoKS5zcGxpdCgnXG4nKQorICAgICMgTG9vayBmb3IgdGhlIGxvbmdlc3QgbGVhZGluZyBzdHJpbmcgb2Ygc3BhY2VzIGFuZCB0YWJzIGNvbW1vbiB0bworICAgICMgYWxsIGxpbmVzLgogICAgIG1hcmdpbiA9IE5vbmUKLSAgICBmb3IgbGluZSBpbiBsaW5lczoKLSAgICAgICAgY29udGVudCA9IGxpbmUubHN0cmlwKCkKLSAgICAgICAgaWYgbm90IGNvbnRlbnQ6Ci0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBpbmRlbnQgPSBsZW4obGluZSkgLSBsZW4oY29udGVudCkKKyAgICB0ZXh0ID0gX3doaXRlc3BhY2Vfb25seV9yZS5zdWIoJycsIHRleHQpCisgICAgaW5kZW50cyA9IF9sZWFkaW5nX3doaXRlc3BhY2VfcmUuZmluZGFsbCh0ZXh0KQorICAgIGZvciBpbmRlbnQgaW4gaW5kZW50czoKICAgICAgICAgaWYgbWFyZ2luIGlzIE5vbmU6CiAgICAgICAgICAgICBtYXJnaW4gPSBpbmRlbnQKKworICAgICAgICAjIEN1cnJlbnQgbGluZSBtb3JlIGRlZXBseSBpbmRlbnRlZCB0aGFuIHByZXZpb3VzIHdpbm5lcjoKKyAgICAgICAgIyBubyBjaGFuZ2UgKHByZXZpb3VzIHdpbm5lciBpcyBzdGlsbCBvbiB0b3ApLgorICAgICAgICBlbGlmIGluZGVudC5zdGFydHN3aXRoKG1hcmdpbik6CisgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgY29uc2lzdGVudCB3aXRoIGFuZCBubyBkZWVwZXIgdGhhbiBwcmV2aW91cyB3aW5uZXI6CisgICAgICAgICMgaXQncyB0aGUgbmV3IHdpbm5lci4KKyAgICAgICAgZWxpZiBtYXJnaW4uc3RhcnRzd2l0aChpbmRlbnQpOgorICAgICAgICAgICAgbWFyZ2luID0gaW5kZW50CisKKyAgICAgICAgIyBDdXJyZW50IGxpbmUgYW5kIHByZXZpb3VzIHdpbm5lciBoYXZlIG5vIGNvbW1vbiB3aGl0ZXNwYWNlOgorICAgICAgICAjIHRoZXJlIGlzIG5vIG1hcmdpbi4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG1hcmdpbiA9IG1pbihtYXJnaW4sIGluZGVudCkKKyAgICAgICAgICAgIG1hcmdpbiA9ICIiCisgICAgICAgICAgICBicmVhawogCi0gICAgaWYgbWFyZ2luIGlzIG5vdCBOb25lIGFuZCBtYXJnaW4gPiAwOgotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKLSAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV1bbWFyZ2luOl0KKyAgICAjIHNhbml0eSBjaGVjayAodGVzdGluZy9kZWJ1Z2dpbmcgb25seSkKKyAgICBpZiAwIGFuZCBtYXJnaW46CisgICAgICAgIGZvciBsaW5lIGluIHRleHQuc3BsaXQoIlxuIik6CisgICAgICAgICAgICBhc3NlcnQgbm90IGxpbmUgb3IgbGluZS5zdGFydHN3aXRoKG1hcmdpbiksIFwKKyAgICAgICAgICAgICAgICAgICAibGluZSA9ICVyLCBtYXJnaW4gPSAlciIgJSAobGluZSwgbWFyZ2luKQogCi0gICAgcmV0dXJuICdcbicuam9pbihsaW5lcykKKyAgICBpZiBtYXJnaW46CisgICAgICAgIHRleHQgPSByZS5zdWIocicoP20pXicgKyBtYXJnaW4sICcnLCB0ZXh0KQorICAgIHJldHVybiB0ZXh0CisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgI3ByaW50IGRlZGVudCgiXHRmb29cblx0YmFyIikKKyAgICAjcHJpbnQgZGVkZW50KCIgIFx0aGVsbG8gdGhlcmVcbiAgXHQgIGhvdyBhcmUgeW91PyIpCisgICAgcHJpbnQgZGVkZW50KCJIZWxsbyB0aGVyZS5cbiAgVGhpcyBpcyBpbmRlbnRlZC4iKQpkaWZmIC0tZ2l0IGEvTGliL3RocmVhZGluZy5weSBiL0xpYi90aHJlYWRpbmcucHkKaW5kZXggYzI3MTQwZC4uNTY1NWRkZSAxMDA2NDQKLS0tIGEvTGliL3RocmVhZGluZy5weQorKysgYi9MaWIvdGhyZWFkaW5nLnB5CkBAIC0xNSw3ICsxNSw3IEBACiAjIFJlbmFtZSBzb21lIHN0dWZmIHNvICJmcm9tIHRocmVhZGluZyBpbXBvcnQgKiIgaXMgc2FmZQogX19hbGxfXyA9IFsnYWN0aXZlQ291bnQnLCAnQ29uZGl0aW9uJywgJ2N1cnJlbnRUaHJlYWQnLCAnZW51bWVyYXRlJywgJ0V2ZW50JywKICAgICAgICAgICAgJ0xvY2snLCAnUkxvY2snLCAnU2VtYXBob3JlJywgJ0JvdW5kZWRTZW1hcGhvcmUnLCAnVGhyZWFkJywKLSAgICAgICAgICAgJ1RpbWVyJywgJ3NldHByb2ZpbGUnLCAnc2V0dHJhY2UnLCAnbG9jYWwnXQorICAgICAgICAgICAnVGltZXInLCAnc2V0cHJvZmlsZScsICdzZXR0cmFjZScsICdsb2NhbCcsICdzdGFja19zaXplJ10KIAogX3N0YXJ0X25ld190aHJlYWQgPSB0aHJlYWQuc3RhcnRfbmV3X3RocmVhZAogX2FsbG9jYXRlX2xvY2sgPSB0aHJlYWQuYWxsb2NhdGVfbG9jawpAQCAtNzEzLDYgKzcxMyw4IEBACiAgICAgX2FjdGl2ZV9saW1ib19sb2NrLnJlbGVhc2UoKQogICAgIHJldHVybiBhY3RpdmUKIAorZnJvbSB0aHJlYWQgaW1wb3J0IHN0YWNrX3NpemUKKwogIyBDcmVhdGUgdGhlIG1haW4gdGhyZWFkIG9iamVjdAogCiBfTWFpblRocmVhZCgpCmRpZmYgLS1naXQgYS9MaWIvdHJhY2UucHkgYi9MaWIvdHJhY2UucHkKaW5kZXggY2E2Mjk0ZS4uZGIzNmUxZCAxMDA2NDQKLS0tIGEvTGliL3RyYWNlLnB5CisrKyBiL0xpYi90cmFjZS5weQpAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSAiPHN0cmluZz4iOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKLSAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCIucHljIikgb3IgZmlsZW5hbWUuZW5kc3dpdGgoIi5weW8iKToKKyAgICAgICAgICAgIGlmIGZpbGVuYW1lLmVuZHN3aXRoKCgiLnB5YyIsICIucHlvIikpOgogICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQogCiAgICAgICAgICAgICBpZiBjb3ZlcmRpciBpcyBOb25lOgpkaWZmIC0tZ2l0IGEvTGliL3RyYWNlYmFjay5weSBiL0xpYi90cmFjZWJhY2sucHkKaW5kZXggZjVjNGIyOS4uZWZkMGY3NSAxMDA2NDQKLS0tIGEvTGliL3RyYWNlYmFjay5weQorKysgYi9MaWIvdHJhY2ViYWNrLnB5CkBAIC0xNTAsNTAgKzE1MCw1MyBAQAogCiAgICAgVGhlIGFyZ3VtZW50cyBhcmUgdGhlIGV4Y2VwdGlvbiB0eXBlIGFuZCB2YWx1ZSBzdWNoIGFzIGdpdmVuIGJ5CiAgICAgc3lzLmxhc3RfdHlwZSBhbmQgc3lzLmxhc3RfdmFsdWUuIFRoZSByZXR1cm4gdmFsdWUgaXMgYSBsaXN0IG9mCi0gICAgc3RyaW5ncywgZWFjaCBlbmRpbmcgaW4gYSBuZXdsaW5lLiAgTm9ybWFsbHksIHRoZSBsaXN0IGNvbnRhaW5zIGEKLSAgICBzaW5nbGUgc3RyaW5nOyBob3dldmVyLCBmb3IgU3ludGF4RXJyb3IgZXhjZXB0aW9ucywgaXQgY29udGFpbnMKLSAgICBzZXZlcmFsIGxpbmVzIHRoYXQgKHdoZW4gcHJpbnRlZCkgZGlzcGxheSBkZXRhaWxlZCBpbmZvcm1hdGlvbgotICAgIGFib3V0IHdoZXJlIHRoZSBzeW50YXggZXJyb3Igb2NjdXJyZWQuICBUaGUgbWVzc2FnZSBpbmRpY2F0aW5nCi0gICAgd2hpY2ggZXhjZXB0aW9uIG9jY3VycmVkIGlzIHRoZSBhbHdheXMgbGFzdCBzdHJpbmcgaW4gdGhlIGxpc3QuCisgICAgc3RyaW5ncywgZWFjaCBlbmRpbmcgaW4gYSBuZXdsaW5lLgorCisgICAgTm9ybWFsbHksIHRoZSBsaXN0IGNvbnRhaW5zIGEgc2luZ2xlIHN0cmluZzsgaG93ZXZlciwgZm9yCisgICAgU3ludGF4RXJyb3IgZXhjZXB0aW9ucywgaXQgY29udGFpbnMgc2V2ZXJhbCBsaW5lcyB0aGF0ICh3aGVuCisgICAgcHJpbnRlZCkgZGlzcGxheSBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB3aGVyZSB0aGUgc3ludGF4CisgICAgZXJyb3Igb2NjdXJyZWQuCisKKyAgICBUaGUgbWVzc2FnZSBpbmRpY2F0aW5nIHdoaWNoIGV4Y2VwdGlvbiBvY2N1cnJlZCBpcyBhbHdheXMgdGhlIGxhc3QKKyAgICBzdHJpbmcgaW4gdGhlIGxpc3QuCisKICAgICAiIiIKLSAgICBsaXN0ID0gW10KLSAgICBpZiAodHlwZShldHlwZSkgPT0gdHlwZXMuQ2xhc3NUeXBlCi0gICAgICAgIG9yIChpc2luc3RhbmNlKGV0eXBlLCB0eXBlKSBhbmQgaXNzdWJjbGFzcyhldHlwZSwgQmFzZUV4Y2VwdGlvbikpKToKLSAgICAgICAgc3R5cGUgPSBldHlwZS5fX25hbWVfXworCisgICAgc3R5cGUgPSBldHlwZS5fX25hbWVfXworCisgICAgaWYgbm90IGlzc3ViY2xhc3MoZXR5cGUsIFN5bnRheEVycm9yKToKKyAgICAgICAgcmV0dXJuIFtfZm9ybWF0X2ZpbmFsX2V4Y19saW5lKHN0eXBlLCB2YWx1ZSldCisKKyAgICAjIEl0IHdhcyBhIHN5bnRheCBlcnJvcjsgc2hvdyBleGFjdGx5IHdoZXJlIHRoZSBwcm9ibGVtIHdhcyBmb3VuZC4KKyAgICBsaW5lcyA9IFtdCisgICAgdHJ5OgorICAgICAgICBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGJhZGxpbmUpID0gdmFsdWUKKyAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBwYXNzCiAgICAgZWxzZToKLSAgICAgICAgc3R5cGUgPSBldHlwZQotICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgIGxpc3QuYXBwZW5kKHN0cihzdHlwZSkgKyAnXG4nKQorICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lIG9yICI8c3RyaW5nPiIKKyAgICAgICAgbGluZXMuYXBwZW5kKCcgIEZpbGUgIiVzIiwgbGluZSAlZFxuJyAlIChmaWxlbmFtZSwgbGluZW5vKSkKKyAgICAgICAgaWYgYmFkbGluZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZCgnICAgICVzXG4nICUgYmFkbGluZS5zdHJpcCgpKQorICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGNhcmV0c3BhY2UgPSBiYWRsaW5lWzpvZmZzZXRdLmxzdHJpcCgpCisgICAgICAgICAgICAgICAgIyBub24tc3BhY2Ugd2hpdGVzcGFjZSAobGlrZXMgdGFicykgbXVzdCBiZSBrZXB0IGZvciBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICBjYXJldHNwYWNlID0gKChjLmlzc3BhY2UoKSBhbmQgYyBvciAnICcpIGZvciBjIGluIGNhcmV0c3BhY2UpCisgICAgICAgICAgICAgICAgIyBvbmx5IHRocmVlIHNwYWNlcyB0byBhY2NvdW50IGZvciBvZmZzZXQxID09IHBvcyAwCisgICAgICAgICAgICAgICAgbGluZXMuYXBwZW5kKCcgICAlc15cbicgJSAnJy5qb2luKGNhcmV0c3BhY2UpKQorICAgICAgICAgICAgdmFsdWUgPSBtc2cKKworICAgIGxpbmVzLmFwcGVuZChfZm9ybWF0X2ZpbmFsX2V4Y19saW5lKHN0eXBlLCB2YWx1ZSkpCisgICAgcmV0dXJuIGxpbmVzCisKK2RlZiBfZm9ybWF0X2ZpbmFsX2V4Y19saW5lKGV0eXBlLCB2YWx1ZSk6CisgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhIHNpbmdsZSBsaW5lIC0tIG5vcm1hbCBjYXNlIGZvciBmb3JtYXRfZXhjZXB0aW9uX29ubHkiIiIKKyAgICB2YWx1ZXN0ciA9IF9zb21lX3N0cih2YWx1ZSkKKyAgICBpZiB2YWx1ZSBpcyBOb25lIG9yIG5vdCB2YWx1ZXN0cjoKKyAgICAgICAgbGluZSA9ICIlc1xuIiAlIGV0eXBlCiAgICAgZWxzZToKLSAgICAgICAgaWYgaXNzdWJjbGFzcyhldHlwZSwgU3ludGF4RXJyb3IpOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG1zZywgKGZpbGVuYW1lLCBsaW5lbm8sIG9mZnNldCwgbGluZSkgPSB2YWx1ZQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgbm90IGZpbGVuYW1lOiBmaWxlbmFtZSA9ICI8c3RyaW5nPiIKLSAgICAgICAgICAgICAgICBsaXN0LmFwcGVuZCgnICBGaWxlICIlcyIsIGxpbmUgJWRcbicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlbmFtZSwgbGluZW5vKSkKLSAgICAgICAgICAgICAgICBpZiBsaW5lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBpID0gMAotICAgICAgICAgICAgICAgICAgICB3aGlsZSBpIDwgbGVuKGxpbmUpIGFuZCBsaW5lW2ldLmlzc3BhY2UoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKLSAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQoJyAgICAlc1xuJyAlIGxpbmUuc3RyaXAoKSkKLSAgICAgICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICAgICAgcyA9ICcgICAgJwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gbGluZVtpOm9mZnNldC0xXToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBjLmlzc3BhY2UoKToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyBjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IHMgKyAnICcKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYXBwZW5kKCclc15cbicgJSBzKQotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1zZwotICAgICAgICBzID0gX3NvbWVfc3RyKHZhbHVlKQotICAgICAgICBpZiBzOgotICAgICAgICAgICAgbGlzdC5hcHBlbmQoJyVzOiAlc1xuJyAlIChzdHIoc3R5cGUpLCBzKSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxpc3QuYXBwZW5kKCclc1xuJyAlIHN0cihzdHlwZSkpCi0gICAgcmV0dXJuIGxpc3QKKyAgICAgICAgbGluZSA9ICIlczogJXNcbiIgJSAoZXR5cGUsIHZhbHVlc3RyKQorICAgIHJldHVybiBsaW5lCiAKIGRlZiBfc29tZV9zdHIodmFsdWUpOgogICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90eXBlcy5weSBiL0xpYi90eXBlcy5weQppbmRleCBkYjYzYzk2Li41YTg5YWQxIDEwMDY0NAotLS0gYS9MaWIvdHlwZXMucHkKKysrIGIvTGliL3R5cGVzLnB5CkBAIC04NCw0ICs4NCwxNiBAQAogRGljdFByb3h5VHlwZSA9IHR5cGUoVHlwZVR5cGUuX19kaWN0X18pCiBOb3RJbXBsZW1lbnRlZFR5cGUgPSB0eXBlKE5vdEltcGxlbWVudGVkKQogCi1kZWwgc3lzLCBfZiwgX2csIF9DICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0CisjIEV4dGVuc2lvbiB0eXBlcyBkZWZpbmVkIGluIGEgQyBoZWxwZXIgbW9kdWxlLiAgWFhYIFRoZXJlIG1heSBiZSBubworIyBlcXVpdmFsZW50IGluIGltcGxlbWVudGF0aW9ucyBvdGhlciB0aGFuIENQeXRob24sIHNvIGl0IHNlZW1zIGJldHRlciB0bworIyBsZWF2ZSB0aGVtIHVuZGVmaW5lZCB0aGVuIHRvIHNldCB0aGVtIHRvIGUuZy4gTm9uZS4KK3RyeToKKyAgICBpbXBvcnQgX3R5cGVzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcworZWxzZToKKyAgICBHZXRTZXREZXNjcmlwdG9yVHlwZSA9IHR5cGUoX3R5cGVzLkhlbHBlci5nZXR0ZXIpCisgICAgTWVtYmVyRGVzY3JpcHRvclR5cGUgPSB0eXBlKF90eXBlcy5IZWxwZXIubWVtYmVyKQorICAgIGRlbCBfdHlwZXMKKworZGVsIHN5cywgX2YsIF9nLCBfQywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE5vdCBmb3IgZXhwb3J0CmRpZmYgLS1naXQgYS9MaWIvdXJsbGliLnB5IGIvTGliL3VybGxpYi5weQppbmRleCBmMGFlNTNhLi5kMmE0YzQ4IDEwMDY0NAotLS0gYS9MaWIvdXJsbGliLnB5CisrKyBiL0xpYi91cmxsaWIucHkKQEAgLTExOCw3ICsxMTgsNyBAQAogICAgICAgICBzZWxmLnByb3hpZXMgPSBwcm94aWVzCiAgICAgICAgIHNlbGYua2V5X2ZpbGUgPSB4NTA5LmdldCgna2V5X2ZpbGUnKQogICAgICAgICBzZWxmLmNlcnRfZmlsZSA9IHg1MDkuZ2V0KCdjZXJ0X2ZpbGUnKQotICAgICAgICBzZWxmLmFkZGhlYWRlcnMgPSBbKCdVc2VyLWFnZW50Jywgc2VsZi52ZXJzaW9uKV0KKyAgICAgICAgc2VsZi5hZGRoZWFkZXJzID0gWygnVXNlci1BZ2VudCcsIHNlbGYudmVyc2lvbildCiAgICAgICAgIHNlbGYuX190ZW1wZmlsZXMgPSBbXQogICAgICAgICBzZWxmLl9fdW5saW5rID0gb3MudW5saW5rICMgU2VlIGNsZWFudXAoKQogICAgICAgICBzZWxmLnRlbXBjYWNoZSA9IE5vbmUKQEAgLTMxNCw4ICszMTQsOCBAQAogICAgICAgICBoID0gaHR0cGxpYi5IVFRQKGhvc3QpCiAgICAgICAgIGlmIGRhdGEgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxlY3RvcikKLSAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LXR5cGUnLCAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKLSAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCisgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCcpCisgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgaC5wdXRyZXF1ZXN0KCdHRVQnLCBzZWxlY3RvcikKICAgICAgICAgaWYgcHJveHlfYXV0aDogaC5wdXRoZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb24nLCAnQmFzaWMgJXMnICUgcHJveHlfYXV0aCkKQEAgLTQwMCw5ICs0MDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VydF9maWxlPXNlbGYuY2VydF9maWxlKQogICAgICAgICAgICAgaWYgZGF0YSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICAgICBoLnB1dHJlcXVlc3QoJ1BPU1QnLCBzZWxlY3RvcikKLSAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1UeXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJykKLSAgICAgICAgICAgICAgICBoLnB1dGhlYWRlcignQ29udGVudC1sZW5ndGgnLCAnJWQnICUgbGVuKGRhdGEpKQorICAgICAgICAgICAgICAgIGgucHV0aGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICclZCcgJSBsZW4oZGF0YSkpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGgucHV0cmVxdWVzdCgnR0VUJywgc2VsZWN0b3IpCiAgICAgICAgICAgICBpZiBwcm94eV9hdXRoOiBoLnB1dGhlYWRlcignUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgJXMnICUgcHJveHlfYXV0aCkKQEAgLTU4NCw3ICs1ODQsNyBAQAogICAgICAgICAgICAgZGF0YSA9IGJhc2U2NC5kZWNvZGVzdHJpbmcoZGF0YSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGRhdGEgPSB1bnF1b3RlKGRhdGEpCi0gICAgICAgIG1zZy5hcHBlbmQoJ0NvbnRlbnQtbGVuZ3RoOiAlZCcgJSBsZW4oZGF0YSkpCisgICAgICAgIG1zZy5hcHBlbmQoJ0NvbnRlbnQtTGVuZ3RoOiAlZCcgJSBsZW4oZGF0YSkpCiAgICAgICAgIG1zZy5hcHBlbmQoJycpCiAgICAgICAgIG1zZy5hcHBlbmQoZGF0YSkKICAgICAgICAgbXNnID0gJ1xuJy5qb2luKG1zZykKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIyLnB5IGIvTGliL3VybGxpYjIucHkKaW5kZXggMjI3MzExYy4uNmVlOWUyYyAxMDA2NDQKLS0tIGEvTGliL3VybGxpYjIucHkKKysrIGIvTGliL3VybGxpYjIucHkKQEAgLTI2MywxMSArMjYzLDExIEBACiAKICAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBrZXksIHZhbCk6CiAgICAgICAgICMgdXNlZnVsIGZvciBzb21ldGhpbmcgbGlrZSBhdXRoZW50aWNhdGlvbgotICAgICAgICBzZWxmLmhlYWRlcnNba2V5LmNhcGl0YWxpemUoKV0gPSB2YWwKKyAgICAgICAgc2VsZi5oZWFkZXJzW2tleS50aXRsZSgpXSA9IHZhbAogCiAgICAgZGVmIGFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKHNlbGYsIGtleSwgdmFsKToKICAgICAgICAgIyB3aWxsIG5vdCBiZSBhZGRlZCB0byBhIHJlZGlyZWN0ZWQgcmVxdWVzdAotICAgICAgICBzZWxmLnVucmVkaXJlY3RlZF9oZHJzW2tleS5jYXBpdGFsaXplKCldID0gdmFsCisgICAgICAgIHNlbGYudW5yZWRpcmVjdGVkX2hkcnNba2V5LnRpdGxlKCldID0gdmFsCiAKICAgICBkZWYgaGFzX2hlYWRlcihzZWxmLCBoZWFkZXJfbmFtZSk6CiAgICAgICAgIHJldHVybiAoaGVhZGVyX25hbWUgaW4gc2VsZi5oZWFkZXJzIG9yCkBAIC0yODYsNyArMjg2LDcgQEAKIGNsYXNzIE9wZW5lckRpcmVjdG9yOgogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgY2xpZW50X3ZlcnNpb24gPSAiUHl0aG9uLXVybGxpYi8lcyIgJSBfX3ZlcnNpb25fXwotICAgICAgICBzZWxmLmFkZGhlYWRlcnMgPSBbKCdVc2VyLWFnZW50JywgY2xpZW50X3ZlcnNpb24pXQorICAgICAgICBzZWxmLmFkZGhlYWRlcnMgPSBbKCdVc2VyLUFnZW50JywgY2xpZW50X3ZlcnNpb24pXQogICAgICAgICAjIG1hbmFnZSB0aGUgaW5kaXZpZHVhbCBoYW5kbGVycwogICAgICAgICBzZWxmLmhhbmRsZXJzID0gW10KICAgICAgICAgc2VsZi5oYW5kbGVfb3BlbiA9IHt9CkBAIC02NzUsNyArNjc1LDcgQEAKICAgICAgICAgaWYgdXNlciBhbmQgcGFzc3dvcmQ6CiAgICAgICAgICAgICB1c2VyX3Bhc3MgPSAnJXM6JXMnICUgKHVucXVvdGUodXNlciksIHVucXVvdGUocGFzc3dvcmQpKQogICAgICAgICAgICAgY3JlZHMgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKHVzZXJfcGFzcykuc3RyaXAoKQotICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LWF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGNyZWRzKQorICAgICAgICAgICAgcmVxLmFkZF9oZWFkZXIoJ1Byb3h5LUF1dGhvcml6YXRpb24nLCAnQmFzaWMgJyArIGNyZWRzKQogICAgICAgICBob3N0cG9ydCA9IHVucXVvdGUoaG9zdHBvcnQpCiAgICAgICAgIHJlcS5zZXRfcHJveHkoaG9zdHBvcnQsIHByb3h5X3R5cGUpCiAgICAgICAgIGlmIG9yaWdfdHlwZSA9PSBwcm94eV90eXBlOgpAQCAtODE5LDcgKzgxOSw3IEBACiAKIGNsYXNzIFByb3h5QmFzaWNBdXRoSGFuZGxlcihBYnN0cmFjdEJhc2ljQXV0aEhhbmRsZXIsIEJhc2VIYW5kbGVyKToKIAotICAgIGF1dGhfaGVhZGVyID0gJ1Byb3h5LWF1dGhvcml6YXRpb24nCisgICAgYXV0aF9oZWFkZXIgPSAnUHJveHktQXV0aG9yaXphdGlvbicKIAogICAgIGRlZiBodHRwX2Vycm9yXzQwNyhzZWxmLCByZXEsIGZwLCBjb2RlLCBtc2csIGhlYWRlcnMpOgogICAgICAgICAjIGh0dHBfZXJyb3JfYXV0aF9yZXFlZCByZXF1aXJlcyB0aGF0IHRoZXJlIGlzIG5vIHVzZXJpbmZvIGNvbXBvbmVudCBpbgpAQCAtMTAyMiwyMCArMTAyMiwyMCBAQAogCiAgICAgICAgIGlmIHJlcXVlc3QuaGFzX2RhdGEoKTogICMgUE9TVAogICAgICAgICAgICAgZGF0YSA9IHJlcXVlc3QuZ2V0X2RhdGEoKQotICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC10eXBlJyk6CisgICAgICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdDb250ZW50LVR5cGUnKToKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKAotICAgICAgICAgICAgICAgICAgICAnQ29udGVudC10eXBlJywKKyAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZScsCiAgICAgICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQnKQotICAgICAgICAgICAgaWYgbm90IHJlcXVlc3QuaGFzX2hlYWRlcignQ29udGVudC1sZW5ndGgnKToKKyAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoJyk6CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcigKLSAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtbGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKKyAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJywgJyVkJyAlIGxlbihkYXRhKSkKIAogICAgICAgICBzY2hlbWUsIHNlbCA9IHNwbGl0dHlwZShyZXF1ZXN0LmdldF9zZWxlY3RvcigpKQogICAgICAgICBzZWxfaG9zdCwgc2VsX3BhdGggPSBzcGxpdGhvc3Qoc2VsKQogICAgICAgICBpZiBub3QgcmVxdWVzdC5oYXNfaGVhZGVyKCdIb3N0Jyk6CiAgICAgICAgICAgICByZXF1ZXN0LmFkZF91bnJlZGlyZWN0ZWRfaGVhZGVyKCdIb3N0Jywgc2VsX2hvc3Qgb3IgaG9zdCkKICAgICAgICAgZm9yIG5hbWUsIHZhbHVlIGluIHNlbGYucGFyZW50LmFkZGhlYWRlcnM6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZS5jYXBpdGFsaXplKCkKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnRpdGxlKCkKICAgICAgICAgICAgIGlmIG5vdCByZXF1ZXN0Lmhhc19oZWFkZXIobmFtZSk6CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hZGRfdW5yZWRpcmVjdGVkX2hlYWRlcihuYW1lLCB2YWx1ZSkKIApAQCAtMTIxNyw3ICsxMjE3LDcgQEAKICAgICAgICAgbW9kaWZpZWQgPSBlbWFpbC5VdGlscy5mb3JtYXRkYXRlKHN0YXRzLnN0X210aW1lLCB1c2VnbXQ9VHJ1ZSkKICAgICAgICAgbXR5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShmaWxlKVswXQogICAgICAgICBoZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoU3RyaW5nSU8oCi0gICAgICAgICAgICAnQ29udGVudC10eXBlOiAlc1xuQ29udGVudC1sZW5ndGg6ICVkXG5MYXN0LW1vZGlmaWVkOiAlc1xuJyAlCisgICAgICAgICAgICAnQ29udGVudC1UeXBlOiAlc1xuQ29udGVudC1MZW5ndGg6ICVkXG5MYXN0LU1vZGlmaWVkOiAlc1xuJyAlCiAgICAgICAgICAgICAobXR5cGUgb3IgJ3RleHQvcGxhaW4nLCBzaXplLCBtb2RpZmllZCkpKQogICAgICAgICBpZiBob3N0OgogICAgICAgICAgICAgaG9zdCwgcG9ydCA9IHNwbGl0cG9ydChob3N0KQpAQCAtMTI3Miw5ICsxMjcyLDkgQEAKICAgICAgICAgICAgIGhlYWRlcnMgPSAiIgogICAgICAgICAgICAgbXR5cGUgPSBtaW1ldHlwZXMuZ3Vlc3NfdHlwZShyZXEuZ2V0X2Z1bGxfdXJsKCkpWzBdCiAgICAgICAgICAgICBpZiBtdHlwZToKLSAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LXR5cGU6ICVzXG4iICUgbXR5cGUKKyAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LVR5cGU6ICVzXG4iICUgbXR5cGUKICAgICAgICAgICAgIGlmIHJldHJsZW4gaXMgbm90IE5vbmUgYW5kIHJldHJsZW4gPj0gMDoKLSAgICAgICAgICAgICAgICBoZWFkZXJzICs9ICJDb250ZW50LWxlbmd0aDogJWRcbiIgJSByZXRybGVuCisgICAgICAgICAgICAgICAgaGVhZGVycyArPSAiQ29udGVudC1MZW5ndGg6ICVkXG4iICUgcmV0cmxlbgogICAgICAgICAgICAgc2YgPSBTdHJpbmdJTyhoZWFkZXJzKQogICAgICAgICAgICAgaGVhZGVycyA9IG1pbWV0b29scy5NZXNzYWdlKHNmKQogICAgICAgICAgICAgcmV0dXJuIGFkZGluZm91cmwoZnAsIGhlYWRlcnMsIHJlcS5nZXRfZnVsbF91cmwoKSkKZGlmZiAtLWdpdCBhL0xpYi91dWlkLnB5IGIvTGliL3V1aWQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY0NDZhMQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi91dWlkLnB5CkBAIC0wLDAgKzEsNTE1IEBACityIiIiVVVJRCBvYmplY3RzICh1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMpIGFjY29yZGluZyB0byBSRkMgNDEyMi4KKworVGhpcyBtb2R1bGUgcHJvdmlkZXMgaW1tdXRhYmxlIFVVSUQgb2JqZWN0cyAoY2xhc3MgVVVJRCkgYW5kIHRoZSBmdW5jdGlvbnMKK3V1aWQxKCksIHV1aWQzKCksIHV1aWQ0KCksIHV1aWQ1KCkgZm9yIGdlbmVyYXRpbmcgdmVyc2lvbiAxLCAzLCA0LCBhbmQgNQorVVVJRHMgYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyLgorCitJZiBhbGwgeW91IHdhbnQgaXMgYSB1bmlxdWUgSUQsIHlvdSBzaG91bGQgcHJvYmFibHkgY2FsbCB1dWlkMSgpIG9yIHV1aWQ0KCkuCitOb3RlIHRoYXQgdXVpZDEoKSBtYXkgY29tcHJvbWlzZSBwcml2YWN5IHNpbmNlIGl0IGNyZWF0ZXMgYSBVVUlEIGNvbnRhaW5pbmcKK3RoZSBjb21wdXRlcidzIG5ldHdvcmsgYWRkcmVzcy4gIHV1aWQ0KCkgY3JlYXRlcyBhIHJhbmRvbSBVVUlELgorCitUeXBpY2FsIHVzYWdlOgorCisgICAgPj4+IGltcG9ydCB1dWlkCisKKyAgICAjIG1ha2UgYSBVVUlEIGJhc2VkIG9uIHRoZSBob3N0IElEIGFuZCBjdXJyZW50IHRpbWUKKyAgICA+Pj4gdXVpZC51dWlkMSgpCisgICAgVVVJRCgnYTgwOThjMWEtZjg2ZS0xMWRhLWJkMWEtMDAxMTI0NDRiZTFlJykKKworICAgICMgbWFrZSBhIFVVSUQgdXNpbmcgYW4gTUQ1IGhhc2ggb2YgYSBuYW1lc3BhY2UgVVVJRCBhbmQgYSBuYW1lCisgICAgPj4+IHV1aWQudXVpZDModXVpZC5OQU1FU1BBQ0VfRE5TLCAncHl0aG9uLm9yZycpCisgICAgVVVJRCgnNmZhNDU5ZWEtZWU4YS0zY2E0LTg5NGUtZGI3N2UxNjAzNTVlJykKKworICAgICMgbWFrZSBhIHJhbmRvbSBVVUlECisgICAgPj4+IHV1aWQudXVpZDQoKQorICAgIFVVSUQoJzE2ZmQyNzA2LThiYWYtNDMzYi04MmViLThjN2ZhZGE4NDdkYScpCisKKyAgICAjIG1ha2UgYSBVVUlEIHVzaW5nIGEgU0hBLTEgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUKKyAgICA+Pj4gdXVpZC51dWlkNSh1dWlkLk5BTUVTUEFDRV9ETlMsICdweXRob24ub3JnJykKKyAgICBVVUlEKCc4ODYzMTNlMS0zYjhhLTUzNzItOWI5MC0wYzlhZWUxOTllNWQnKQorCisgICAgIyBtYWtlIGEgVVVJRCBmcm9tIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgKGJyYWNlcyBhbmQgaHlwaGVucyBpZ25vcmVkKQorICAgID4+PiB4ID0gdXVpZC5VVUlEKCd7MDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmfScpCisKKyAgICAjIGNvbnZlcnQgYSBVVUlEIHRvIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaW4gc3RhbmRhcmQgZm9ybQorICAgID4+PiBzdHIoeCkKKyAgICAnMDAwMTAyMDMtMDQwNS0wNjA3LTA4MDktMGEwYjBjMGQwZTBmJworCisgICAgIyBnZXQgdGhlIHJhdyAxNiBieXRlcyBvZiB0aGUgVVVJRAorICAgID4+PiB4LmJ5dGVzCisgICAgJ1x4MDBceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOFx0XG5ceDBiXHgwY1xyXHgwZVx4MGYnCisKKyAgICAjIG1ha2UgYSBVVUlEIGZyb20gYSAxNi1ieXRlIHN0cmluZworICAgID4+PiB1dWlkLlVVSUQoYnl0ZXM9eC5ieXRlcykKKyAgICBVVUlEKCcwMDAxMDIwMy0wNDA1LTA2MDctMDgwOS0wYTBiMGMwZDBlMGYnKQorIiIiCisKK19fYXV0aG9yX18gPSAnS2EtUGluZyBZZWUgPHBpbmdAemVzdHkuY2E+JworX19kYXRlX18gPSAnJERhdGU6IDIwMDYvMDYvMTIgMjM6MTU6NDAgJCcuc3BsaXQoKVsxXS5yZXBsYWNlKCcvJywgJy0nKQorX192ZXJzaW9uX18gPSAnJFJldmlzaW9uOiAxLjMwICQnLnNwbGl0KClbMV0KKworUkVTRVJWRURfTkNTLCBSRkNfNDEyMiwgUkVTRVJWRURfTUlDUk9TT0ZULCBSRVNFUlZFRF9GVVRVUkUgPSBbCisgICAgJ3Jlc2VydmVkIGZvciBOQ1MgY29tcGF0aWJpbGl0eScsICdzcGVjaWZpZWQgaW4gUkZDIDQxMjInLAorICAgICdyZXNlcnZlZCBmb3IgTWljcm9zb2Z0IGNvbXBhdGliaWxpdHknLCAncmVzZXJ2ZWQgZm9yIGZ1dHVyZSBkZWZpbml0aW9uJ10KKworY2xhc3MgVVVJRChvYmplY3QpOgorICAgICIiIkluc3RhbmNlcyBvZiB0aGUgVVVJRCBjbGFzcyByZXByZXNlbnQgVVVJRHMgYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyLgorICAgIFVVSUQgb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBoYXNoYWJsZSwgYW5kIHVzYWJsZSBhcyBkaWN0aW9uYXJ5IGtleXMuCisgICAgQ29udmVydGluZyBhIFVVSUQgdG8gYSBzdHJpbmcgd2l0aCBzdHIoKSB5aWVsZHMgc29tZXRoaW5nIGluIHRoZSBmb3JtCisgICAgJzEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYycuICBUaGUgVVVJRCBjb25zdHJ1Y3RvciBhY2NlcHRzCisgICAgZm91ciBwb3NzaWJsZSBmb3JtczogYSBzaW1pbGFyIHN0cmluZyBvZiBoZXhhZGVjaW1hbCBkaWdpdHMsIG9yIGEKKyAgICBzdHJpbmcgb2YgMTYgcmF3IGJ5dGVzIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdieXRlcycsIG9yIGEgdHVwbGUgb2YKKyAgICBzaXggaW50ZWdlciBmaWVsZHMgKHdpdGggMzItYml0LCAxNi1iaXQsIDE2LWJpdCwgOC1iaXQsIDgtYml0LCBhbmQKKyAgICA0OC1iaXQgdmFsdWVzIHJlc3BlY3RpdmVseSkgYXMgYW4gYXJndW1lbnQgbmFtZWQgJ2ZpZWxkcycsIG9yIGEgc2luZ2xlCisgICAgMTI4LWJpdCBpbnRlZ2VyIGFzIGFuIGFyZ3VtZW50IG5hbWVkICdpbnQnLgorCisgICAgVVVJRHMgaGF2ZSB0aGVzZSByZWFkLW9ubHkgYXR0cmlidXRlczoKKworICAgICAgICBieXRlcyAgICAgICB0aGUgVVVJRCBhcyBhIDE2LWJ5dGUgc3RyaW5nCisKKyAgICAgICAgZmllbGRzICAgICAgYSB0dXBsZSBvZiB0aGUgc2l4IGludGVnZXIgZmllbGRzIG9mIHRoZSBVVUlELAorICAgICAgICAgICAgICAgICAgICB3aGljaCBhcmUgYWxzbyBhdmFpbGFibGUgYXMgc2l4IGluZGl2aWR1YWwgYXR0cmlidXRlcworICAgICAgICAgICAgICAgICAgICBhbmQgdHdvIGRlcml2ZWQgYXR0cmlidXRlczoKKworICAgICAgICAgICAgdGltZV9sb3cgICAgICAgICAgICAgICAgdGhlIGZpcnN0IDMyIGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIHRpbWVfbWlkICAgICAgICAgICAgICAgIHRoZSBuZXh0IDE2IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIHRpbWVfaGlfdmVyc2lvbiAgICAgICAgIHRoZSBuZXh0IDE2IGJpdHMgb2YgdGhlIFVVSUQKKyAgICAgICAgICAgIGNsb2NrX3NlcV9oaV92YXJpYW50ICAgIHRoZSBuZXh0IDggYml0cyBvZiB0aGUgVVVJRAorICAgICAgICAgICAgY2xvY2tfc2VxX2xvdyAgICAgICAgICAgdGhlIG5leHQgOCBiaXRzIG9mIHRoZSBVVUlECisgICAgICAgICAgICBub2RlICAgICAgICAgICAgICAgICAgICB0aGUgbGFzdCA0OCBiaXRzIG9mIHRoZSBVVUlECisKKyAgICAgICAgICAgIHRpbWUgICAgICAgICAgICAgICAgICAgIHRoZSA2MC1iaXQgdGltZXN0YW1wCisgICAgICAgICAgICBjbG9ja19zZXEgICAgICAgICAgICAgICB0aGUgMTQtYml0IHNlcXVlbmNlIG51bWJlcgorCisgICAgICAgIGhleCAgICAgICAgIHRoZSBVVUlEIGFzIGEgMzItY2hhcmFjdGVyIGhleGFkZWNpbWFsIHN0cmluZworCisgICAgICAgIGludCAgICAgICAgIHRoZSBVVUlEIGFzIGEgMTI4LWJpdCBpbnRlZ2VyCisKKyAgICAgICAgdXJuICAgICAgICAgdGhlIFVVSUQgYXMgYSBVUk4gYXMgc3BlY2lmaWVkIGluIFJGQyA0MTIyCisKKyAgICAgICAgdmFyaWFudCAgICAgdGhlIFVVSUQgdmFyaWFudCAob25lIG9mIHRoZSBjb25zdGFudHMgUkVTRVJWRURfTkNTLAorICAgICAgICAgICAgICAgICAgICBSRkNfNDEyMiwgUkVTRVJWRURfTUlDUk9TT0ZULCBvciBSRVNFUlZFRF9GVVRVUkUpCisKKyAgICAgICAgdmVyc2lvbiAgICAgdGhlIFVVSUQgdmVyc2lvbiBudW1iZXIgKDEgdGhyb3VnaCA1LCBtZWFuaW5nZnVsIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgdmFyaWFudCBpcyBSRkNfNDEyMikKKyAgICAiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoZXg9Tm9uZSwgYnl0ZXM9Tm9uZSwgZmllbGRzPU5vbmUsIGludD1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uPU5vbmUpOgorICAgICAgICByIiIiQ3JlYXRlIGEgVVVJRCBmcm9tIGVpdGhlciBhIHN0cmluZyBvZiAzMiBoZXhhZGVjaW1hbCBkaWdpdHMsCisgICAgICAgIGEgc3RyaW5nIG9mIDE2IGJ5dGVzIGFzIHRoZSAnYnl0ZXMnIGFyZ3VtZW50LCBhIHR1cGxlIG9mIHNpeAorICAgICAgICBpbnRlZ2VycyAoMzItYml0IHRpbWVfbG93LCAxNi1iaXQgdGltZV9taWQsIDE2LWJpdCB0aW1lX2hpX3ZlcnNpb24sCisgICAgICAgIDgtYml0IGNsb2NrX3NlcV9oaV92YXJpYW50LCA4LWJpdCBjbG9ja19zZXFfbG93LCA0OC1iaXQgbm9kZSkgYXMKKyAgICAgICAgdGhlICdmaWVsZHMnIGFyZ3VtZW50LCBvciBhIHNpbmdsZSAxMjgtYml0IGludGVnZXIgYXMgdGhlICdpbnQnCisgICAgICAgIGFyZ3VtZW50LiAgV2hlbiBhIHN0cmluZyBvZiBoZXggZGlnaXRzIGlzIGdpdmVuLCBjdXJseSBicmFjZXMsCisgICAgICAgIGh5cGhlbnMsIGFuZCBhIFVSTiBwcmVmaXggYXJlIGFsbCBvcHRpb25hbC4gIEZvciBleGFtcGxlLCB0aGVzZQorICAgICAgICBleHByZXNzaW9ucyBhbGwgeWllbGQgdGhlIHNhbWUgVVVJRDoKKworICAgICAgICBVVUlEKCd7MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4fScpCisgICAgICAgIFVVSUQoJzEyMzQ1Njc4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4JykKKyAgICAgICAgVVVJRCgndXJuOnV1aWQ6MTIzNDU2NzgtMTIzNC01Njc4LTEyMzQtNTY3ODEyMzQ1Njc4JykKKyAgICAgICAgVVVJRChieXRlcz0nXHgxMlx4MzRceDU2XHg3OCcqNCkKKyAgICAgICAgVVVJRChmaWVsZHM9KDB4MTIzNDU2NzgsIDB4MTIzNCwgMHg1Njc4LCAweDEyLCAweDM0LCAweDU2NzgxMjM0NTY3OCkpCisgICAgICAgIFVVSUQoaW50PTB4MTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgpCisKKyAgICAgICAgRXhhY3RseSBvbmUgb2YgJ2hleCcsICdieXRlcycsICdmaWVsZHMnLCBvciAnaW50JyBtdXN0IGJlIGdpdmVuLgorICAgICAgICBUaGUgJ3ZlcnNpb24nIGFyZ3VtZW50IGlzIG9wdGlvbmFsOyBpZiBnaXZlbiwgdGhlIHJlc3VsdGluZyBVVUlECisgICAgICAgIHdpbGwgaGF2ZSBpdHMgdmFyaWFudCBhbmQgdmVyc2lvbiBudW1iZXIgc2V0IGFjY29yZGluZyB0byBSRkMgNDEyMiwKKyAgICAgICAgb3ZlcnJpZGluZyBiaXRzIGluIHRoZSBnaXZlbiAnaGV4JywgJ2J5dGVzJywgJ2ZpZWxkcycsIG9yICdpbnQnLgorICAgICAgICAiIiIKKworICAgICAgICBpZiBbaGV4LCBieXRlcywgZmllbGRzLCBpbnRdLmNvdW50KE5vbmUpICE9IDM6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ25lZWQganVzdCBvbmUgb2YgaGV4LCBieXRlcywgZmllbGRzLCBvciBpbnQnKQorICAgICAgICBpZiBoZXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBoZXggPSBoZXgucmVwbGFjZSgndXJuOicsICcnKS5yZXBsYWNlKCd1dWlkOicsICcnKQorICAgICAgICAgICAgaGV4ID0gaGV4LnN0cmlwKCd7fScpLnJlcGxhY2UoJy0nLCAnJykKKyAgICAgICAgICAgIGlmIGxlbihoZXgpICE9IDMyOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2JhZGx5IGZvcm1lZCBoZXhhZGVjaW1hbCBVVUlEIHN0cmluZycpCisgICAgICAgICAgICBpbnQgPSBsb25nKGhleCwgMTYpCisgICAgICAgIGlmIGJ5dGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbGVuKGJ5dGVzKSAhPSAxNjoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdieXRlcyBpcyBub3QgYSAxNi1jaGFyIHN0cmluZycpCisgICAgICAgICAgICBpbnQgPSBsb25nKCgnJTAyeCcqMTYpICUgdHVwbGUobWFwKG9yZCwgYnl0ZXMpKSwgMTYpCisgICAgICAgIGlmIGZpZWxkcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihmaWVsZHMpICE9IDY6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGRzIGlzIG5vdCBhIDYtdHVwbGUnKQorICAgICAgICAgICAgKHRpbWVfbG93LCB0aW1lX21pZCwgdGltZV9oaV92ZXJzaW9uLAorICAgICAgICAgICAgIGNsb2NrX3NlcV9oaV92YXJpYW50LCBjbG9ja19zZXFfbG93LCBub2RlKSA9IGZpZWxkcworICAgICAgICAgICAgaWYgbm90IDAgPD0gdGltZV9sb3cgPCAxPDwzMkw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgMSBvdXQgb2YgcmFuZ2UgKG5lZWQgYSAzMi1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IHRpbWVfbWlkIDwgMTw8MTZMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ZpZWxkIDIgb3V0IG9mIHJhbmdlIChuZWVkIGEgMTYtYml0IHZhbHVlKScpCisgICAgICAgICAgICBpZiBub3QgMCA8PSB0aW1lX2hpX3ZlcnNpb24gPCAxPDwxNkw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgMyBvdXQgb2YgcmFuZ2UgKG5lZWQgYSAxNi1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IGNsb2NrX3NlcV9oaV92YXJpYW50IDwgMTw8OEw6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignZmllbGQgNCBvdXQgb2YgcmFuZ2UgKG5lZWQgYW4gOC1iaXQgdmFsdWUpJykKKyAgICAgICAgICAgIGlmIG5vdCAwIDw9IGNsb2NrX3NlcV9sb3cgPCAxPDw4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCA1IG91dCBvZiByYW5nZSAobmVlZCBhbiA4LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgaWYgbm90IDAgPD0gbm9kZSA8IDE8PDQ4TDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdmaWVsZCA2IG91dCBvZiByYW5nZSAobmVlZCBhIDQ4LWJpdCB2YWx1ZSknKQorICAgICAgICAgICAgY2xvY2tfc2VxID0gKGNsb2NrX3NlcV9oaV92YXJpYW50IDw8IDhMKSB8IGNsb2NrX3NlcV9sb3cKKyAgICAgICAgICAgIGludCA9ICgodGltZV9sb3cgPDwgOTZMKSB8ICh0aW1lX21pZCA8PCA4MEwpIHwKKyAgICAgICAgICAgICAgICAgICAodGltZV9oaV92ZXJzaW9uIDw8IDY0TCkgfCAoY2xvY2tfc2VxIDw8IDQ4TCkgfCBub2RlKQorICAgICAgICBpZiBpbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgMCA8PSBpbnQgPCAxPDwxMjhMOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2ludCBpcyBvdXQgb2YgcmFuZ2UgKG5lZWQgYSAxMjgtYml0IHZhbHVlKScpCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBub3QgMSA8PSB2ZXJzaW9uIDw9IDU6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignaWxsZWdhbCB2ZXJzaW9uIG51bWJlcicpCisgICAgICAgICAgICAjIFNldCB0aGUgdmFyaWFudCB0byBSRkMgNDEyMi4KKyAgICAgICAgICAgIGludCAmPSB+KDB4YzAwMCA8PCA0OEwpCisgICAgICAgICAgICBpbnQgfD0gMHg4MDAwIDw8IDQ4TAorICAgICAgICAgICAgIyBTZXQgdGhlIHZlcnNpb24gbnVtYmVyLgorICAgICAgICAgICAgaW50ICY9IH4oMHhmMDAwIDw8IDY0TCkKKyAgICAgICAgICAgIGludCB8PSB2ZXJzaW9uIDw8IDc2TAorICAgICAgICBzZWxmLl9fZGljdF9fWydpbnQnXSA9IGludAorCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBVVUlEKToKKyAgICAgICAgICAgIHJldHVybiBjbXAoc2VsZi5pbnQsIG90aGVyLmludCkKKyAgICAgICAgcmV0dXJuIE5vdEltcGxlbWVudGVkCisKKyAgICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgICAgIHJldHVybiBoYXNoKHNlbGYuaW50KQorCisgICAgZGVmIF9faW50X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmludAorCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gJ1VVSUQoJXIpJyAlIHN0cihzZWxmKQorCisgICAgZGVmIF9fc2V0YXR0cl9fKHNlbGYsIG5hbWUsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yKCdVVUlEIG9iamVjdHMgYXJlIGltbXV0YWJsZScpCisKKyAgICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICAgICAgaGV4ID0gJyUwMzJ4JyAlIHNlbGYuaW50CisgICAgICAgIHJldHVybiAnJXMtJXMtJXMtJXMtJXMnICUgKAorICAgICAgICAgICAgaGV4Wzo4XSwgaGV4Wzg6MTJdLCBoZXhbMTI6MTZdLCBoZXhbMTY6MjBdLCBoZXhbMjA6XSkKKworICAgIGRlZiBnZXRfYnl0ZXMoc2VsZik6CisgICAgICAgIGJ5dGVzID0gJycKKyAgICAgICAgZm9yIHNoaWZ0IGluIHJhbmdlKDAsIDEyOCwgOCk6CisgICAgICAgICAgICBieXRlcyA9IGNocigoc2VsZi5pbnQgPj4gc2hpZnQpICYgMHhmZikgKyBieXRlcworICAgICAgICByZXR1cm4gYnl0ZXMKKworICAgIGJ5dGVzID0gcHJvcGVydHkoZ2V0X2J5dGVzKQorCisgICAgZGVmIGdldF9maWVsZHMoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi50aW1lX2xvdywgc2VsZi50aW1lX21pZCwgc2VsZi50aW1lX2hpX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgc2VsZi5jbG9ja19zZXFfaGlfdmFyaWFudCwgc2VsZi5jbG9ja19zZXFfbG93LCBzZWxmLm5vZGUpCisKKyAgICBmaWVsZHMgPSBwcm9wZXJ0eShnZXRfZmllbGRzKQorCisgICAgZGVmIGdldF90aW1lX2xvdyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50ID4+IDk2TAorCisgICAgdGltZV9sb3cgPSBwcm9wZXJ0eShnZXRfdGltZV9sb3cpCisKKyAgICBkZWYgZ2V0X3RpbWVfbWlkKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDgwTCkgJiAweGZmZmYKKworICAgIHRpbWVfbWlkID0gcHJvcGVydHkoZ2V0X3RpbWVfbWlkKQorCisgICAgZGVmIGdldF90aW1lX2hpX3ZlcnNpb24oc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5pbnQgPj4gNjRMKSAmIDB4ZmZmZgorCisgICAgdGltZV9oaV92ZXJzaW9uID0gcHJvcGVydHkoZ2V0X3RpbWVfaGlfdmVyc2lvbikKKworICAgIGRlZiBnZXRfY2xvY2tfc2VxX2hpX3ZhcmlhbnQoc2VsZik6CisgICAgICAgIHJldHVybiAoc2VsZi5pbnQgPj4gNTZMKSAmIDB4ZmYKKworICAgIGNsb2NrX3NlcV9oaV92YXJpYW50ID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcV9oaV92YXJpYW50KQorCisgICAgZGVmIGdldF9jbG9ja19zZXFfbG93KHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYuaW50ID4+IDQ4TCkgJiAweGZmCisKKyAgICBjbG9ja19zZXFfbG93ID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcV9sb3cpCisKKyAgICBkZWYgZ2V0X3RpbWUoc2VsZik6CisgICAgICAgIHJldHVybiAoKChzZWxmLnRpbWVfaGlfdmVyc2lvbiAmIDB4MGZmZkwpIDw8IDQ4TCkgfAorICAgICAgICAgICAgICAgIChzZWxmLnRpbWVfbWlkIDw8IDMyTCkgfCBzZWxmLnRpbWVfbG93KQorCisgICAgdGltZSA9IHByb3BlcnR5KGdldF90aW1lKQorCisgICAgZGVmIGdldF9jbG9ja19zZXEoc2VsZik6CisgICAgICAgIHJldHVybiAoKChzZWxmLmNsb2NrX3NlcV9oaV92YXJpYW50ICYgMHgzZkwpIDw8IDhMKSB8CisgICAgICAgICAgICAgICAgc2VsZi5jbG9ja19zZXFfbG93KQorCisgICAgY2xvY2tfc2VxID0gcHJvcGVydHkoZ2V0X2Nsb2NrX3NlcSkKKworICAgIGRlZiBnZXRfbm9kZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaW50ICYgMHhmZmZmZmZmZmZmZmYKKworICAgIG5vZGUgPSBwcm9wZXJ0eShnZXRfbm9kZSkKKworICAgIGRlZiBnZXRfaGV4KHNlbGYpOgorICAgICAgICByZXR1cm4gJyUwMzJ4JyAlIHNlbGYuaW50CisKKyAgICBoZXggPSBwcm9wZXJ0eShnZXRfaGV4KQorCisgICAgZGVmIGdldF91cm4oc2VsZik6CisgICAgICAgIHJldHVybiAndXJuOnV1aWQ6JyArIHN0cihzZWxmKQorCisgICAgdXJuID0gcHJvcGVydHkoZ2V0X3VybikKKworICAgIGRlZiBnZXRfdmFyaWFudChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuaW50ICYgKDB4ODAwMCA8PCA0OEwpOgorICAgICAgICAgICAgcmV0dXJuIFJFU0VSVkVEX05DUworICAgICAgICBlbGlmIG5vdCBzZWxmLmludCAmICgweDQwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRkNfNDEyMgorICAgICAgICBlbGlmIG5vdCBzZWxmLmludCAmICgweDIwMDAgPDwgNDhMKToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9NSUNST1NPRlQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBSRVNFUlZFRF9GVVRVUkUKKworICAgIHZhcmlhbnQgPSBwcm9wZXJ0eShnZXRfdmFyaWFudCkKKworICAgIGRlZiBnZXRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgIyBUaGUgdmVyc2lvbiBiaXRzIGFyZSBvbmx5IG1lYW5pbmdmdWwgZm9yIFJGQyA0MTIyIFVVSURzLgorICAgICAgICBpZiBzZWxmLnZhcmlhbnQgPT0gUkZDXzQxMjI6CisgICAgICAgICAgICByZXR1cm4gaW50KChzZWxmLmludCA+PiA3NkwpICYgMHhmKQorCisgICAgdmVyc2lvbiA9IHByb3BlcnR5KGdldF92ZXJzaW9uKQorCitkZWYgX2ZpbmRfbWFjKGNvbW1hbmQsIGFyZ3MsIGh3X2lkZW50aWZpZXJzLCBnZXRfaW5kZXgpOgorICAgIGltcG9ydCBvcworICAgIGZvciBkaXIgaW4gWycnLCAnL3NiaW4vJywgJy91c3Ivc2JpbiddOgorICAgICAgICBleGVjdXRhYmxlID0gb3MucGF0aC5qb2luKGRpciwgY29tbWFuZCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGV4ZWN1dGFibGUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICB0cnk6CisgICAgICAgICAgICAjIExDX0FMTCB0byBnZXQgRW5nbGlzaCBvdXRwdXQsIDI+L2Rldi9udWxsIHRvCisgICAgICAgICAgICAjIHByZXZlbnQgb3V0cHV0IG9uIHN0ZGVycgorICAgICAgICAgICAgY21kID0gJ0xDX0FMTD1DICVzICVzIDI+L2Rldi9udWxsJyAlIChleGVjdXRhYmxlLCBhcmdzKQorICAgICAgICAgICAgcGlwZSA9IG9zLnBvcGVuKGNtZCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3I6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGZvciBsaW5lIGluIHBpcGU6CisgICAgICAgICAgICB3b3JkcyA9IGxpbmUubG93ZXIoKS5zcGxpdCgpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4od29yZHMpKToKKyAgICAgICAgICAgICAgICBpZiB3b3Jkc1tpXSBpbiBod19pZGVudGlmaWVyczoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludCh3b3Jkc1tnZXRfaW5kZXgoaSldLnJlcGxhY2UoJzonLCAnJyksIDE2KQorICAgIHJldHVybiBOb25lCisKK2RlZiBfaWZjb25maWdfZ2V0bm9kZSgpOgorICAgICIiIkdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvbiBVbml4IGJ5IHJ1bm5pbmcgaWZjb25maWcuIiIiCisKKyAgICAjIFRoaXMgd29ya3Mgb24gTGludXggKCcnIG9yICctYScpLCBUcnU2NCAoJy1hdicpLCBidXQgbm90IGFsbCBVbml4ZXMuCisgICAgZm9yIGFyZ3MgaW4gKCcnLCAnLWEnLCAnLWF2Jyk6CisgICAgICAgIG1hYyA9IF9maW5kX21hYygnaWZjb25maWcnLCBhcmdzLCBbJ2h3YWRkcicsICdldGhlciddLCBsYW1iZGEgaTogaSsxKQorICAgICAgICBpZiBtYWM6CisgICAgICAgICAgICByZXR1cm4gbWFjCisKKyAgICBpbXBvcnQgc29ja2V0CisgICAgaXBfYWRkciA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorCisgICAgIyBUcnkgZ2V0dGluZyB0aGUgTUFDIGFkZHIgZnJvbSBhcnAgYmFzZWQgb24gb3VyIElQIGFkZHJlc3MgKFNvbGFyaXMpLgorICAgIG1hYyA9IF9maW5kX21hYygnYXJwJywgJy1hbicsIFtpcF9hZGRyXSwgbGFtYmRhIGk6IC0xKQorICAgIGlmIG1hYzoKKyAgICAgICAgcmV0dXJuIG1hYworCisgICAgIyBUaGlzIG1pZ2h0IHdvcmsgb24gSFAtVVguCisgICAgbWFjID0gX2ZpbmRfbWFjKCdsYW5zY2FuJywgJy1haScsIFsnbGFuMCddLCBsYW1iZGEgaTogMCkKKyAgICBpZiBtYWM6CisgICAgICAgIHJldHVybiBtYWMKKworICAgIHJldHVybiBOb25lCisKK2RlZiBfaXBjb25maWdfZ2V0bm9kZSgpOgorICAgICIiIkdldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvbiBXaW5kb3dzIGJ5IHJ1bm5pbmcgaXBjb25maWcuZXhlLiIiIgorICAgIGltcG9ydCBvcywgcmUKKyAgICBkaXJzID0gWycnLCByJ2M6XHdpbmRvd3Ncc3lzdGVtMzInLCByJ2M6XHdpbm50XHN5c3RlbTMyJ10KKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBjdHlwZXMKKyAgICAgICAgYnVmZmVyID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKDMwMCkKKyAgICAgICAgY3R5cGVzLndpbmRsbC5rZXJuZWwzMi5HZXRTeXN0ZW1EaXJlY3RvcnlBKGJ1ZmZlciwgMzAwKQorICAgICAgICBkaXJzLmluc2VydCgwLCBidWZmZXIudmFsdWUuZGVjb2RlKCdtYmNzJykpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisgICAgZm9yIGRpciBpbiBkaXJzOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwaXBlID0gb3MucG9wZW4ob3MucGF0aC5qb2luKGRpciwgJ2lwY29uZmlnJykgKyAnIC9hbGwnKQorICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGZvciBsaW5lIGluIHBpcGU6CisgICAgICAgICAgICB2YWx1ZSA9IGxpbmUuc3BsaXQoJzonKVstMV0uc3RyaXAoKS5sb3dlcigpCisgICAgICAgICAgICBpZiByZS5tYXRjaCgnKFswLTlhLWZdWzAtOWEtZl0tKXs1fVswLTlhLWZdWzAtOWEtZl0nLCB2YWx1ZSk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGludCh2YWx1ZS5yZXBsYWNlKCctJywgJycpLCAxNikKKworZGVmIF9uZXRiaW9zX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyB1c2luZyBOZXRCSU9TIGNhbGxzLgorICAgIFNlZSBodHRwOi8vc3VwcG9ydC5taWNyb3NvZnQuY29tL2tiLzExODYyMyBmb3IgZGV0YWlscy4iIiIKKyAgICBpbXBvcnQgd2luMzJ3bmV0LCBuZXRiaW9zCisgICAgbmNiID0gbmV0Ymlvcy5OQ0IoKQorICAgIG5jYi5Db21tYW5kID0gbmV0Ymlvcy5OQ0JFTlVNCisgICAgbmNiLkJ1ZmZlciA9IGFkYXB0ZXJzID0gbmV0Ymlvcy5MQU5BX0VOVU0oKQorICAgIGFkYXB0ZXJzLl9wYWNrKCkKKyAgICBpZiB3aW4zMnduZXQuTmV0YmlvcyhuY2IpICE9IDA6CisgICAgICAgIHJldHVybgorICAgIGFkYXB0ZXJzLl91bnBhY2soKQorICAgIGZvciBpIGluIHJhbmdlKGFkYXB0ZXJzLmxlbmd0aCk6CisgICAgICAgIG5jYi5SZXNldCgpCisgICAgICAgIG5jYi5Db21tYW5kID0gbmV0Ymlvcy5OQ0JSRVNFVAorICAgICAgICBuY2IuTGFuYV9udW0gPSBvcmQoYWRhcHRlcnMubGFuYVtpXSkKKyAgICAgICAgaWYgd2luMzJ3bmV0Lk5ldGJpb3MobmNiKSAhPSAwOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbmNiLlJlc2V0KCkKKyAgICAgICAgbmNiLkNvbW1hbmQgPSBuZXRiaW9zLk5DQkFTVEFUCisgICAgICAgIG5jYi5MYW5hX251bSA9IG9yZChhZGFwdGVycy5sYW5hW2ldKQorICAgICAgICBuY2IuQ2FsbG5hbWUgPSAnKicubGp1c3QoMTYpCisgICAgICAgIG5jYi5CdWZmZXIgPSBzdGF0dXMgPSBuZXRiaW9zLkFEQVBURVJfU1RBVFVTKCkKKyAgICAgICAgaWYgd2luMzJ3bmV0Lk5ldGJpb3MobmNiKSAhPSAwOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgc3RhdHVzLl91bnBhY2soKQorICAgICAgICBieXRlcyA9IG1hcChvcmQsIHN0YXR1cy5hZGFwdGVyX2FkZHJlc3MpCisgICAgICAgIHJldHVybiAoKGJ5dGVzWzBdPDw0MEwpICsgKGJ5dGVzWzFdPDwzMkwpICsgKGJ5dGVzWzJdPDwyNEwpICsKKyAgICAgICAgICAgICAgICAoYnl0ZXNbM108PDE2TCkgKyAoYnl0ZXNbNF08PDhMKSArIGJ5dGVzWzVdKQorCisjIFRoYW5rcyB0byBUaG9tYXMgSGVsbGVyIGZvciBjdHlwZXMgYW5kIGZvciBoaXMgaGVscCB3aXRoIGl0cyB1c2UgaGVyZS4KKworIyBJZiBjdHlwZXMgaXMgYXZhaWxhYmxlLCB1c2UgaXQgdG8gZmluZCBzeXN0ZW0gcm91dGluZXMgZm9yIFVVSUQgZ2VuZXJhdGlvbi4KK191dWlkX2dlbmVyYXRlX3JhbmRvbSA9IF91dWlkX2dlbmVyYXRlX3RpbWUgPSBfVXVpZENyZWF0ZSA9IE5vbmUKK3RyeToKKyAgICBpbXBvcnQgY3R5cGVzLCBjdHlwZXMudXRpbAorICAgIF9idWZmZXIgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIoMTYpCisKKyAgICAjIFRoZSB1dWlkX2dlbmVyYXRlXyogcm91dGluZXMgYXJlIHByb3ZpZGVkIGJ5IGxpYnV1aWQgb24gYXQgbGVhc3QKKyAgICAjIExpbnV4IGFuZCBGcmVlQlNELCBhbmQgcHJvdmlkZWQgYnkgbGliYyBvbiBNYWMgT1MgWC4KKyAgICBmb3IgbGlibmFtZSBpbiBbJ3V1aWQnLCAnYyddOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaWIgPSBjdHlwZXMuQ0RMTChjdHlwZXMudXRpbC5maW5kX2xpYnJhcnkobGlibmFtZSkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGhhc2F0dHIobGliLCAndXVpZF9nZW5lcmF0ZV9yYW5kb20nKToKKyAgICAgICAgICAgIF91dWlkX2dlbmVyYXRlX3JhbmRvbSA9IGxpYi51dWlkX2dlbmVyYXRlX3JhbmRvbQorICAgICAgICBpZiBoYXNhdHRyKGxpYiwgJ3V1aWRfZ2VuZXJhdGVfdGltZScpOgorICAgICAgICAgICAgX3V1aWRfZ2VuZXJhdGVfdGltZSA9IGxpYi51dWlkX2dlbmVyYXRlX3RpbWUKKworICAgICMgT24gV2luZG93cyBwcmlvciB0byAyMDAwLCBVdWlkQ3JlYXRlIGdpdmVzIGEgVVVJRCBjb250YWluaW5nIHRoZQorICAgICMgaGFyZHdhcmUgYWRkcmVzcy4gIE9uIFdpbmRvd3MgMjAwMCBhbmQgbGF0ZXIsIFV1aWRDcmVhdGUgbWFrZXMgYQorICAgICMgcmFuZG9tIFVVSUQgYW5kIFV1aWRDcmVhdGVTZXF1ZW50aWFsIGdpdmVzIGEgVVVJRCBjb250YWluaW5nIHRoZQorICAgICMgaGFyZHdhcmUgYWRkcmVzcy4gIFRoZXNlIHJvdXRpbmVzIGFyZSBwcm92aWRlZCBieSB0aGUgUlBDIHJ1bnRpbWUuCisgICAgIyBOT1RFOiAgYXQgbGVhc3Qgb24gVGltJ3MgV2luWFAgUHJvIFNQMiBkZXNrdG9wIGJveCwgd2hpbGUgdGhlIGxhc3QKKyAgICAjIDYgYnl0ZXMgcmV0dXJuZWQgYnkgVXVpZENyZWF0ZVNlcXVlbnRpYWwgYXJlIGZpeGVkLCB0aGV5IGRvbid0IGFwcGVhcgorICAgICMgdG8gYmVhciBhbnkgcmVsYXRpb25zaGlwIHRvIHRoZSBNQUMgYWRkcmVzcyBvZiBhbnkgbmV0d29yayBkZXZpY2UKKyAgICAjIG9uIHRoZSBib3guCisgICAgdHJ5OgorICAgICAgICBsaWIgPSBjdHlwZXMud2luZGxsLnJwY3J0NAorICAgIGV4Y2VwdDoKKyAgICAgICAgbGliID0gTm9uZQorICAgIF9VdWlkQ3JlYXRlID0gZ2V0YXR0cihsaWIsICdVdWlkQ3JlYXRlU2VxdWVudGlhbCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIobGliLCAnVXVpZENyZWF0ZScsIE5vbmUpKQorZXhjZXB0OgorICAgIHBhc3MKKworZGVmIF91bml4ZGxsX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gVW5peCB1c2luZyBjdHlwZXMuIiIiCisgICAgX3V1aWRfZ2VuZXJhdGVfdGltZShfYnVmZmVyKQorICAgIHJldHVybiBVVUlEKGJ5dGVzPV9idWZmZXIucmF3KS5ub2RlCisKK2RlZiBfd2luZGxsX2dldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb24gV2luZG93cyB1c2luZyBjdHlwZXMuIiIiCisgICAgaWYgX1V1aWRDcmVhdGUoX2J1ZmZlcikgPT0gMDoKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9X2J1ZmZlci5yYXcpLm5vZGUKKworZGVmIF9yYW5kb21fZ2V0bm9kZSgpOgorICAgICIiIkdldCBhIHJhbmRvbSBub2RlIElELCB3aXRoIGVpZ2h0aCBiaXQgc2V0IGFzIHN1Z2dlc3RlZCBieSBSRkMgNDEyMi4iIiIKKyAgICBpbXBvcnQgcmFuZG9tCisgICAgcmV0dXJuIHJhbmRvbS5yYW5kcmFuZ2UoMCwgMTw8NDhMKSB8IDB4MDEwMDAwMDAwMDAwTAorCitfbm9kZSA9IE5vbmUKKworZGVmIGdldG5vZGUoKToKKyAgICAiIiJHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgYXMgYSA0OC1iaXQgcG9zaXRpdmUgaW50ZWdlci4KKworICAgIFRoZSBmaXJzdCB0aW1lIHRoaXMgcnVucywgaXQgbWF5IGxhdW5jaCBhIHNlcGFyYXRlIHByb2dyYW0sIHdoaWNoIGNvdWxkCisgICAgYmUgcXVpdGUgc2xvdy4gIElmIGFsbCBhdHRlbXB0cyB0byBvYnRhaW4gdGhlIGhhcmR3YXJlIGFkZHJlc3MgZmFpbCwgd2UKKyAgICBjaG9vc2UgYSByYW5kb20gNDgtYml0IG51bWJlciB3aXRoIGl0cyBlaWdodGggYml0IHNldCB0byAxIGFzIHJlY29tbWVuZGVkCisgICAgaW4gUkZDIDQxMjIuCisgICAgIiIiCisKKyAgICBnbG9iYWwgX25vZGUKKyAgICBpZiBfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuIF9ub2RlCisKKyAgICBpbXBvcnQgc3lzCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CisgICAgICAgIGdldHRlcnMgPSBbX3dpbmRsbF9nZXRub2RlLCBfbmV0Ymlvc19nZXRub2RlLCBfaXBjb25maWdfZ2V0bm9kZV0KKyAgICBlbHNlOgorICAgICAgICBnZXR0ZXJzID0gW191bml4ZGxsX2dldG5vZGUsIF9pZmNvbmZpZ19nZXRub2RlXQorCisgICAgZm9yIGdldHRlciBpbiBnZXR0ZXJzICsgW19yYW5kb21fZ2V0bm9kZV06CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9ub2RlID0gZ2V0dGVyKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gX25vZGUKKworZGVmIHV1aWQxKG5vZGU9Tm9uZSwgY2xvY2tfc2VxPU5vbmUpOgorICAgICIiIkdlbmVyYXRlIGEgVVVJRCBmcm9tIGEgaG9zdCBJRCwgc2VxdWVuY2UgbnVtYmVyLCBhbmQgdGhlIGN1cnJlbnQgdGltZS4KKyAgICBJZiAnbm9kZScgaXMgbm90IGdpdmVuLCBnZXRub2RlKCkgaXMgdXNlZCB0byBvYnRhaW4gdGhlIGhhcmR3YXJlCisgICAgYWRkcmVzcy4gIElmICdjbG9ja19zZXEnIGlzIGdpdmVuLCBpdCBpcyB1c2VkIGFzIHRoZSBzZXF1ZW5jZSBudW1iZXI7CisgICAgb3RoZXJ3aXNlIGEgcmFuZG9tIDE0LWJpdCBzZXF1ZW5jZSBudW1iZXIgaXMgY2hvc2VuLiIiIgorCisgICAgIyBXaGVuIHRoZSBzeXN0ZW0gcHJvdmlkZXMgYSB2ZXJzaW9uLTEgVVVJRCBnZW5lcmF0b3IsIHVzZSBpdCAoYnV0IGRvbid0CisgICAgIyB1c2UgVXVpZENyZWF0ZSBoZXJlIGJlY2F1c2UgaXRzIFVVSURzIGRvbid0IGNvbmZvcm0gdG8gUkZDIDQxMjIpLgorICAgIGlmIF91dWlkX2dlbmVyYXRlX3RpbWUgYW5kIG5vZGUgaXMgY2xvY2tfc2VxIGlzIE5vbmU6CisgICAgICAgIF91dWlkX2dlbmVyYXRlX3RpbWUoX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9X2J1ZmZlci5yYXcpCisKKyAgICBpbXBvcnQgdGltZQorICAgIG5hbm9zZWNvbmRzID0gaW50KHRpbWUudGltZSgpICogMWU5KQorICAgICMgMHgwMWIyMWRkMjEzODE0MDAwIGlzIHRoZSBudW1iZXIgb2YgMTAwLW5zIGludGVydmFscyBiZXR3ZWVuIHRoZQorICAgICMgVVVJRCBlcG9jaCAxNTgyLTEwLTE1IDAwOjAwOjAwIGFuZCB0aGUgVW5peCBlcG9jaCAxOTcwLTAxLTAxIDAwOjAwOjAwLgorICAgIHRpbWVzdGFtcCA9IGludChuYW5vc2Vjb25kcy8xMDApICsgMHgwMWIyMWRkMjEzODE0MDAwTAorICAgIGlmIGNsb2NrX3NlcSBpcyBOb25lOgorICAgICAgICBpbXBvcnQgcmFuZG9tCisgICAgICAgIGNsb2NrX3NlcSA9IHJhbmRvbS5yYW5kcmFuZ2UoMTw8MTRMKSAjIGluc3RlYWQgb2Ygc3RhYmxlIHN0b3JhZ2UKKyAgICB0aW1lX2xvdyA9IHRpbWVzdGFtcCAmIDB4ZmZmZmZmZmZMCisgICAgdGltZV9taWQgPSAodGltZXN0YW1wID4+IDMyTCkgJiAweGZmZmZMCisgICAgdGltZV9oaV92ZXJzaW9uID0gKHRpbWVzdGFtcCA+PiA0OEwpICYgMHgwZmZmTAorICAgIGNsb2NrX3NlcV9sb3cgPSBjbG9ja19zZXEgJiAweGZmTAorICAgIGNsb2NrX3NlcV9oaV92YXJpYW50ID0gKGNsb2NrX3NlcSA+PiA4TCkgJiAweDNmTAorICAgIGlmIG5vZGUgaXMgTm9uZToKKyAgICAgICAgbm9kZSA9IGdldG5vZGUoKQorICAgIHJldHVybiBVVUlEKGZpZWxkcz0odGltZV9sb3csIHRpbWVfbWlkLCB0aW1lX2hpX3ZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja19zZXFfaGlfdmFyaWFudCwgY2xvY2tfc2VxX2xvdywgbm9kZSksIHZlcnNpb249MSkKKworZGVmIHV1aWQzKG5hbWVzcGFjZSwgbmFtZSk6CisgICAgIiIiR2VuZXJhdGUgYSBVVUlEIGZyb20gdGhlIE1ENSBoYXNoIG9mIGEgbmFtZXNwYWNlIFVVSUQgYW5kIGEgbmFtZS4iIiIKKyAgICBpbXBvcnQgbWQ1CisgICAgaGFzaCA9IG1kNS5tZDUobmFtZXNwYWNlLmJ5dGVzICsgbmFtZSkuZGlnZXN0KCkKKyAgICByZXR1cm4gVVVJRChieXRlcz1oYXNoWzoxNl0sIHZlcnNpb249MykKKworZGVmIHV1aWQ0KCk6CisgICAgIiIiR2VuZXJhdGUgYSByYW5kb20gVVVJRC4iIiIKKworICAgICMgV2hlbiB0aGUgc3lzdGVtIHByb3ZpZGVzIGEgdmVyc2lvbi00IFVVSUQgZ2VuZXJhdG9yLCB1c2UgaXQuCisgICAgaWYgX3V1aWRfZ2VuZXJhdGVfcmFuZG9tOgorICAgICAgICBfdXVpZF9nZW5lcmF0ZV9yYW5kb20oX2J1ZmZlcikKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9X2J1ZmZlci5yYXcpCisKKyAgICAjIE90aGVyd2lzZSwgZ2V0IHJhbmRvbW5lc3MgZnJvbSB1cmFuZG9tIG9yIHRoZSAncmFuZG9tJyBtb2R1bGUuCisgICAgdHJ5OgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgcmV0dXJuIFVVSUQoYnl0ZXM9b3MudXJhbmRvbSgxNiksIHZlcnNpb249NCkKKyAgICBleGNlcHQ6CisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgYnl0ZXMgPSBbY2hyKHJhbmRvbS5yYW5kcmFuZ2UoMjU2KSkgZm9yIGkgaW4gcmFuZ2UoMTYpXQorICAgICAgICByZXR1cm4gVVVJRChieXRlcz1ieXRlcywgdmVyc2lvbj00KQorCitkZWYgdXVpZDUobmFtZXNwYWNlLCBuYW1lKToKKyAgICAiIiJHZW5lcmF0ZSBhIFVVSUQgZnJvbSB0aGUgU0hBLTEgaGFzaCBvZiBhIG5hbWVzcGFjZSBVVUlEIGFuZCBhIG5hbWUuIiIiCisgICAgaW1wb3J0IHNoYQorICAgIGhhc2ggPSBzaGEuc2hhKG5hbWVzcGFjZS5ieXRlcyArIG5hbWUpLmRpZ2VzdCgpCisgICAgcmV0dXJuIFVVSUQoYnl0ZXM9aGFzaFs6MTZdLCB2ZXJzaW9uPTUpCisKKyMgVGhlIGZvbGxvd2luZyBzdGFuZGFyZCBVVUlEcyBhcmUgZm9yIHVzZSB3aXRoIHV1aWQzKCkgb3IgdXVpZDUoKS4KKworTkFNRVNQQUNFX0ROUyA9IFVVSUQoJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCcpCitOQU1FU1BBQ0VfVVJMID0gVVVJRCgnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JykKK05BTUVTUEFDRV9PSUQgPSBVVUlEKCc2YmE3YjgxMi05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQorTkFNRVNQQUNFX1g1MDAgPSBVVUlEKCc2YmE3YjgxNC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnKQpkaWZmIC0tZ2l0IGEvTGliL3dhcm5pbmdzLnB5IGIvTGliL3dhcm5pbmdzLnB5CmluZGV4IGI1ZDc1ZTQuLmI3ZmFjNjkgMTAwNjQ0Ci0tLSBhL0xpYi93YXJuaW5ncy5weQorKysgYi9MaWIvd2FybmluZ3MucHkKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgICBmaWxlbmFtZSA9IGdsb2JhbHMuZ2V0KCdfX2ZpbGVfXycpCiAgICAgaWYgZmlsZW5hbWU6CiAgICAgICAgIGZubCA9IGZpbGVuYW1lLmxvd2VyKCkKLSAgICAgICAgaWYgZm5sLmVuZHN3aXRoKCIucHljIikgb3IgZm5sLmVuZHN3aXRoKCIucHlvIik6CisgICAgICAgIGlmIGZubC5lbmRzd2l0aCgoIi5weWMiLCAiLnB5byIpKToKICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbOi0xXQogICAgIGVsc2U6CiAgICAgICAgIGlmIG1vZHVsZSA9PSAiX19tYWluX18iOgpAQCAtMjU0LDExICsyNTQsMTEgQEAKICAgICAgICAgICAgIGNhdCA9IGdldGF0dHIobSwga2xhc3MpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKICAgICAgICAgICAgIHJhaXNlIF9PcHRpb25FcnJvcigidW5rbm93biB3YXJuaW5nIGNhdGVnb3J5OiAlciIgJSAoY2F0ZWdvcnksKSkKLSAgICBpZiAobm90IGlzaW5zdGFuY2UoY2F0LCB0eXBlcy5DbGFzc1R5cGUpIG9yCi0gICAgICAgIG5vdCBpc3N1YmNsYXNzKGNhdCwgV2FybmluZykpOgorICAgIGlmIG5vdCBpc3N1YmNsYXNzKGNhdCwgV2FybmluZyk6CiAgICAgICAgIHJhaXNlIF9PcHRpb25FcnJvcigiaW52YWxpZCB3YXJuaW5nIGNhdGVnb3J5OiAlciIgJSAoY2F0ZWdvcnksKSkKICAgICByZXR1cm4gY2F0CiAKICMgTW9kdWxlIGluaXRpYWxpemF0aW9uCiBfcHJvY2Vzc29wdGlvbnMoc3lzLndhcm5vcHRpb25zKQogc2ltcGxlZmlsdGVyKCJpZ25vcmUiLCBjYXRlZ29yeT1QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nLCBhcHBlbmQ9MSkKK3NpbXBsZWZpbHRlcigiaWdub3JlIiwgY2F0ZWdvcnk9SW1wb3J0V2FybmluZywgYXBwZW5kPTEpCmRpZmYgLS1naXQgYS9MaWIvd2ViYnJvd3Nlci5weSBiL0xpYi93ZWJicm93c2VyLnB5CmluZGV4IDQ2OTNmZTcuLjdhMWEzYjQgMTAwNjQ0Ci0tLSBhL0xpYi93ZWJicm93c2VyLnB5CisrKyBiL0xpYi93ZWJicm93c2VyLnB5CkBAIC05OCw4ICs5OCw3IEBACiBpZiBzeXMucGxhdGZvcm1bOjNdID09ICJ3aW4iOgogICAgIGRlZiBfaXNleGVjdXRhYmxlKGNtZCk6CiAgICAgICAgIGNtZCA9IGNtZC5sb3dlcigpCi0gICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKGNtZCkgYW5kIChjbWQuZW5kc3dpdGgoIi5leGUiKSBvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY21kLmVuZHN3aXRoKCIuYmF0IikpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShjbWQpIGFuZCBjbWQuZW5kc3dpdGgoKCIuZXhlIiwgIi5iYXQiKSk6CiAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgICAgICBmb3IgZXh0IGluICIuZXhlIiwgIi5iYXQiOgogICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoY21kICsgZXh0KToKQEAgLTQzNSwxMyArNDM0LDEzIEBACiAgICAgIyBUaGUgZGVmYXVsdCBHbm9tZSBicm93c2VyCiAgICAgaWYgX2lzY29tbWFuZCgiZ2NvbmZ0b29sLTIiKToKICAgICAgICAgIyBnZXQgdGhlIHdlYiBicm93c2VyIHN0cmluZyBmcm9tIGdjb25mdG9vbAotICAgICAgICBnYyA9ICdnY29uZnRvb2wtMiAtZyAvZGVza3RvcC9nbm9tZS91cmwtaGFuZGxlcnMvaHR0cC9jb21tYW5kJworICAgICAgICBnYyA9ICdnY29uZnRvb2wtMiAtZyAvZGVza3RvcC9nbm9tZS91cmwtaGFuZGxlcnMvaHR0cC9jb21tYW5kIDI+L2Rldi9udWxsJwogICAgICAgICBvdXQgPSBvcy5wb3BlbihnYykKICAgICAgICAgY29tbWQgPSBvdXQucmVhZCgpLnN0cmlwKCkKICAgICAgICAgcmV0bmNvZGUgPSBvdXQuY2xvc2UoKQogCiAgICAgICAgICMgaWYgc3VjY2Vzc2Z1bCwgcmVnaXN0ZXIgaXQKLSAgICAgICAgaWYgcmV0bmNvZGUgPT0gTm9uZSBhbmQgbGVuKGNvbW1kKSAhPSAwOgorICAgICAgICBpZiByZXRuY29kZSBpcyBOb25lIGFuZCBjb21tZDoKICAgICAgICAgICAgIHJlZ2lzdGVyKCJnbm9tZSIsIE5vbmUsIEJhY2tncm91bmRCcm93c2VyKGNvbW1kKSkKIAogICAgICMgRmlyc3QsIHRoZSBNb3ppbGxhL05ldHNjYXBlIGJyb3dzZXJzCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi5lZ2ctaW5mbyBiL0xpYi93c2dpcmVmLmVnZy1pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYjc4OTMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi5lZ2ctaW5mbwpAQCAtMCwwICsxLDggQEAKK01ldGFkYXRhLVZlcnNpb246IDEuMAorTmFtZTogd3NnaXJlZgorVmVyc2lvbjogMC4xLjIKK1N1bW1hcnk6IFdTR0kgKFBFUCAzMzMpIFJlZmVyZW5jZSBMaWJyYXJ5CitBdXRob3I6IFBoaWxsaXAgSi4gRWJ5CitBdXRob3ItZW1haWw6IHdlYi1zaWdAcHl0aG9uLm9yZworTGljZW5zZTogUFNGIG9yIFpQTAorUGxhdGZvcm06IFVOS05PV04KZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL19faW5pdF9fLnB5IGIvTGliL3dzZ2lyZWYvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNTc5ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi93c2dpcmVmL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjMgQEAKKyIiIndzZ2lyZWYgLS0gYSBXU0dJIChQRVAgMzMzKSBSZWZlcmVuY2UgTGlicmFyeQorCitDdXJyZW50IENvbnRlbnRzOgorCisqIHV0aWwgLS0gTWlzY2VsbGFuZW91cyB1c2VmdWwgZnVuY3Rpb25zIGFuZCB3cmFwcGVycworCisqIGhlYWRlcnMgLS0gTWFuYWdlIHJlc3BvbnNlIGhlYWRlcnMKKworKiBoYW5kbGVycyAtLSBiYXNlIGNsYXNzZXMgZm9yIHNlcnZlci9nYXRld2F5IGltcGxlbWVudGF0aW9ucworCisqIHNpbXBsZV9zZXJ2ZXIgLS0gYSBzaW1wbGUgQmFzZUhUVFBTZXJ2ZXIgdGhhdCBzdXBwb3J0cyBXU0dJCisKKyogdmFsaWRhdGUgLS0gdmFsaWRhdGlvbiB3cmFwcGVyIHRoYXQgc2l0cyBiZXR3ZWVuIGFuIGFwcCBhbmQgYSBzZXJ2ZXIKKyAgdG8gZGV0ZWN0IGVycm9ycyBpbiBlaXRoZXIKKworVG8tRG86CisKKyogY2dpX2dhdGV3YXkgLS0gUnVuIFdTR0kgYXBwcyB1bmRlciBDR0kgKHBlbmRpbmcgYSBkZXBsb3ltZW50IHN0YW5kYXJkKQorCisqIGNnaV93cmFwcGVyIC0tIFJ1biBDR0kgYXBwcyB1bmRlciBXU0dJCisKKyogcm91dGVyIC0tIGEgc2ltcGxlIG1pZGRsZXdhcmUgY29tcG9uZW50IHRoYXQgaGFuZGxlcyBVUkwgdHJhdmVyc2FsCisiIiIKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL2hhbmRsZXJzLnB5IGIvTGliL3dzZ2lyZWYvaGFuZGxlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5MzcxYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi93c2dpcmVmL2hhbmRsZXJzLnB5CkBAIC0wLDAgKzEsNDkyIEBACisiIiJCYXNlIGNsYXNzZXMgZm9yIHNlcnZlci9nYXRld2F5IGltcGxlbWVudGF0aW9ucyIiIgorCitmcm9tIHR5cGVzIGltcG9ydCBTdHJpbmdUeXBlCitmcm9tIHV0aWwgaW1wb3J0IEZpbGVXcmFwcGVyLCBndWVzc19zY2hlbWUsIGlzX2hvcF9ieV9ob3AKK2Zyb20gaGVhZGVycyBpbXBvcnQgSGVhZGVycworCitpbXBvcnQgc3lzLCBvcywgdGltZQorCitfX2FsbF9fID0gWydCYXNlSGFuZGxlcicsICdTaW1wbGVIYW5kbGVyJywgJ0Jhc2VDR0lIYW5kbGVyJywgJ0NHSUhhbmRsZXInXQorCit0cnk6CisgICAgZGljdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBkZWYgZGljdChpdGVtcyk6CisgICAgICAgIGQgPSB7fQorICAgICAgICBmb3Igayx2IGluIGl0ZW1zOgorICAgICAgICAgICAgZFtrXSA9IHYKKyAgICAgICAgcmV0dXJuIGQKKwordHJ5OgorICAgIFRydWUKKyAgICBGYWxzZQorZXhjZXB0IE5hbWVFcnJvcjoKKyAgICBUcnVlID0gbm90IE5vbmUKKyAgICBGYWxzZSA9IG5vdCBUcnVlCisKKworIyBXZWVrZGF5IGFuZCBtb250aCBuYW1lcyBmb3IgSFRUUCBkYXRlL3RpbWUgZm9ybWF0dGluZzsgYWx3YXlzIEVuZ2xpc2ghCitfd2Vla2RheW5hbWUgPSBbIk1vbiIsICJUdWUiLCAiV2VkIiwgIlRodSIsICJGcmkiLCAiU2F0IiwgIlN1biJdCitfbW9udGhuYW1lID0gW05vbmUsICMgRHVtbXkgc28gd2UgY2FuIHVzZSAxLWJhc2VkIG1vbnRoIG51bWJlcnMKKyAgICAgICAgICAgICAgIkphbiIsICJGZWIiLCAiTWFyIiwgIkFwciIsICJNYXkiLCAiSnVuIiwKKyAgICAgICAgICAgICAgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsICJOb3YiLCAiRGVjIl0KKworZGVmIGZvcm1hdF9kYXRlX3RpbWUodGltZXN0YW1wKToKKyAgICB5ZWFyLCBtb250aCwgZGF5LCBoaCwgbW0sIHNzLCB3ZCwgeSwgeiA9IHRpbWUuZ210aW1lKHRpbWVzdGFtcCkKKyAgICByZXR1cm4gIiVzLCAlMDJkICUzcyAlNGQgJTAyZDolMDJkOiUwMmQgR01UIiAlICgKKyAgICAgICAgX3dlZWtkYXluYW1lW3dkXSwgZGF5LCBfbW9udGhuYW1lW21vbnRoXSwgeWVhciwgaGgsIG1tLCBzcworICAgICkKKworCisKK2NsYXNzIEJhc2VIYW5kbGVyOgorICAgICIiIk1hbmFnZSB0aGUgaW52b2NhdGlvbiBvZiBhIFdTR0kgYXBwbGljYXRpb24iIiIKKworICAgICMgQ29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOyBjYW4gb3ZlcnJpZGUgcGVyLXN1YmNsYXNzIG9yIHBlci1pbnN0YW5jZQorICAgIHdzZ2lfdmVyc2lvbiA9ICgxLDApCisgICAgd3NnaV9tdWx0aXRocmVhZCA9IFRydWUKKyAgICB3c2dpX211bHRpcHJvY2VzcyA9IFRydWUKKyAgICB3c2dpX3J1bl9vbmNlID0gRmFsc2UKKworICAgIG9yaWdpbl9zZXJ2ZXIgPSBUcnVlICAgICMgV2UgYXJlIHRyYW5zbWl0dGluZyBkaXJlY3QgdG8gY2xpZW50CisgICAgaHR0cF92ZXJzaW9uICA9ICIxLjAiICAgIyBWZXJzaW9uIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHJlc3BvbnNlCisgICAgc2VydmVyX3NvZnR3YXJlID0gTm9uZSAgIyBTdHJpbmcgbmFtZSBvZiBzZXJ2ZXIgc29mdHdhcmUsIGlmIGFueQorCisgICAgIyBvc19lbnZpcm9uIGlzIHVzZWQgdG8gc3VwcGx5IGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgT1MgZW52aXJvbm1lbnQ6CisgICAgIyBieSBkZWZhdWx0IGl0J3MgYSBjb3B5IG9mICdvcy5lbnZpcm9uJyBhcyBvZiBpbXBvcnQgdGltZSwgYnV0IHlvdSBjYW4KKyAgICAjIG92ZXJyaWRlIHRoaXMgaW4gZS5nLiB5b3VyIF9faW5pdF9fIG1ldGhvZC4KKyAgICBvc19lbnZpcm9uID0gZGljdChvcy5lbnZpcm9uLml0ZW1zKCkpCisKKyAgICAjIENvbGxhYm9yYXRvciBjbGFzc2VzCisgICAgd3NnaV9maWxlX3dyYXBwZXIgPSBGaWxlV3JhcHBlciAgICAgIyBzZXQgdG8gTm9uZSB0byBkaXNhYmxlCisgICAgaGVhZGVyc19jbGFzcyA9IEhlYWRlcnMgICAgICAgICAgICAgIyBtdXN0IGJlIGEgSGVhZGVycy1saWtlIGNsYXNzCisKKyAgICAjIEVycm9yIGhhbmRsaW5nIChhbHNvIHBlci1zdWJjbGFzcyBvciBwZXItaW5zdGFuY2UpCisgICAgdHJhY2ViYWNrX2xpbWl0ID0gTm9uZSAgIyBQcmludCBlbnRpcmUgdHJhY2ViYWNrIHRvIHNlbGYuZ2V0X3N0ZGVycigpCisgICAgZXJyb3Jfc3RhdHVzID0gIjUwMCBEdWRlLCB0aGlzIGlzIHdoYWNrISIKKyAgICBlcnJvcl9oZWFkZXJzID0gWygnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpXQorICAgIGVycm9yX2JvZHkgPSAiQSBzZXJ2ZXIgZXJyb3Igb2NjdXJyZWQuICBQbGVhc2UgY29udGFjdCB0aGUgYWRtaW5pc3RyYXRvci4iCisKKyAgICAjIFN0YXRlIHZhcmlhYmxlcyAoZG9uJ3QgbWVzcyB3aXRoIHRoZXNlKQorICAgIHN0YXR1cyA9IHJlc3VsdCA9IE5vbmUKKyAgICBoZWFkZXJzX3NlbnQgPSBGYWxzZQorICAgIGhlYWRlcnMgPSBOb25lCisgICAgYnl0ZXNfc2VudCA9IDAKKworCisKKworCisKKworCisgICAgZGVmIHJ1bihzZWxmLCBhcHBsaWNhdGlvbik6CisgICAgICAgICIiIkludm9rZSB0aGUgYXBwbGljYXRpb24iIiIKKyAgICAgICAgIyBOb3RlIHRvIHNlbGY6IGRvbid0IG1vdmUgdGhlIGNsb3NlKCkhICBBc3luY2hyb25vdXMgc2VydmVycyBzaG91bGRuJ3QKKyAgICAgICAgIyBjYWxsIGNsb3NlKCkgZnJvbSBmaW5pc2hfcmVzcG9uc2UoKSwgc28gaWYgeW91IGNsb3NlKCkgYW55d2hlcmUgYnV0CisgICAgICAgICMgdGhlIGRvdWJsZS1lcnJvciBicmFuY2ggaGVyZSwgeW91J2xsIGJyZWFrIGFzeW5jaHJvbm91cyBzZXJ2ZXJzIGJ5CisgICAgICAgICMgcHJlbWF0dXJlbHkgY2xvc2luZy4gIEFzeW5jIHNlcnZlcnMgbXVzdCByZXR1cm4gZnJvbSAncnVuKCknIHdpdGhvdXQKKyAgICAgICAgIyBjbG9zaW5nIGlmIHRoZXJlIG1pZ2h0IHN0aWxsIGJlIG91dHB1dCB0byBpdGVyYXRlIG92ZXIuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisgICAgICAgICAgICBzZWxmLnJlc3VsdCA9IGFwcGxpY2F0aW9uKHNlbGYuZW52aXJvbiwgc2VsZi5zdGFydF9yZXNwb25zZSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX3Jlc3BvbnNlKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYuaGFuZGxlX2Vycm9yKCkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAjIElmIHdlIGdldCBhbiBlcnJvciBoYW5kbGluZyBhbiBlcnJvciwganVzdCBnaXZlIHVwIGFscmVhZHkhCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgcmFpc2UgICAjIC4uLmFuZCBsZXQgdGhlIGFjdHVhbCBzZXJ2ZXIgZmlndXJlIGl0IG91dC4KKworCisgICAgZGVmIHNldHVwX2Vudmlyb24oc2VsZik6CisgICAgICAgICIiIlNldCB1cCB0aGUgZW52aXJvbm1lbnQgZm9yIG9uZSByZXF1ZXN0IiIiCisKKyAgICAgICAgZW52ID0gc2VsZi5lbnZpcm9uID0gc2VsZi5vc19lbnZpcm9uLmNvcHkoKQorICAgICAgICBzZWxmLmFkZF9jZ2lfdmFycygpCisKKyAgICAgICAgZW52Wyd3c2dpLmlucHV0J10gICAgICAgID0gc2VsZi5nZXRfc3RkaW4oKQorICAgICAgICBlbnZbJ3dzZ2kuZXJyb3JzJ10gICAgICAgPSBzZWxmLmdldF9zdGRlcnIoKQorICAgICAgICBlbnZbJ3dzZ2kudmVyc2lvbiddICAgICAgPSBzZWxmLndzZ2lfdmVyc2lvbgorICAgICAgICBlbnZbJ3dzZ2kucnVuX29uY2UnXSAgICAgPSBzZWxmLndzZ2lfcnVuX29uY2UKKyAgICAgICAgZW52Wyd3c2dpLnVybF9zY2hlbWUnXSAgID0gc2VsZi5nZXRfc2NoZW1lKCkKKyAgICAgICAgZW52Wyd3c2dpLm11bHRpdGhyZWFkJ10gID0gc2VsZi53c2dpX211bHRpdGhyZWFkCisgICAgICAgIGVudlsnd3NnaS5tdWx0aXByb2Nlc3MnXSA9IHNlbGYud3NnaV9tdWx0aXByb2Nlc3MKKworICAgICAgICBpZiBzZWxmLndzZ2lfZmlsZV93cmFwcGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZW52Wyd3c2dpLmZpbGVfd3JhcHBlciddID0gc2VsZi53c2dpX2ZpbGVfd3JhcHBlcgorCisgICAgICAgIGlmIHNlbGYub3JpZ2luX3NlcnZlciBhbmQgc2VsZi5zZXJ2ZXJfc29mdHdhcmU6CisgICAgICAgICAgICBlbnYuc2V0ZGVmYXVsdCgnU0VSVkVSX1NPRlRXQVJFJyxzZWxmLnNlcnZlcl9zb2Z0d2FyZSkKKworCisgICAgZGVmIGZpbmlzaF9yZXNwb25zZShzZWxmKToKKyAgICAgICAgIiIiU2VuZCBhbnkgaXRlcmFibGUgZGF0YSwgdGhlbiBjbG9zZSBzZWxmIGFuZCB0aGUgaXRlcmFibGUKKworICAgICAgICBTdWJjbGFzc2VzIGludGVuZGVkIGZvciB1c2UgaW4gYXN5bmNocm9ub3VzIHNlcnZlcnMgd2lsbAorICAgICAgICB3YW50IHRvIHJlZGVmaW5lIHRoaXMgbWV0aG9kLCBzdWNoIHRoYXQgaXQgc2V0cyB1cCBjYWxsYmFja3MKKyAgICAgICAgaW4gdGhlIGV2ZW50IGxvb3AgdG8gaXRlcmF0ZSBvdmVyIHRoZSBkYXRhLCBhbmQgdG8gY2FsbAorICAgICAgICAnc2VsZi5jbG9zZSgpJyBvbmNlIHRoZSByZXNwb25zZSBpcyBmaW5pc2hlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBzZWxmLnJlc3VsdF9pc19maWxlKCkgb3Igbm90IHNlbGYuc2VuZGZpbGUoKToKKyAgICAgICAgICAgIGZvciBkYXRhIGluIHNlbGYucmVzdWx0OgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIHNlbGYuZmluaXNoX2NvbnRlbnQoKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworCisgICAgZGVmIGdldF9zY2hlbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgVVJMIHNjaGVtZSBiZWluZyB1c2VkIiIiCisgICAgICAgIHJldHVybiBndWVzc19zY2hlbWUoc2VsZi5lbnZpcm9uKQorCisKKyAgICBkZWYgc2V0X2NvbnRlbnRfbGVuZ3RoKHNlbGYpOgorICAgICAgICAiIiJDb21wdXRlIENvbnRlbnQtTGVuZ3RoIG9yIHN3aXRjaCB0byBjaHVua2VkIGVuY29kaW5nIGlmIHBvc3NpYmxlIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGJsb2NrcyA9IGxlbihzZWxmLnJlc3VsdCkKKyAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsQXR0cmlidXRlRXJyb3IsTm90SW1wbGVtZW50ZWRFcnJvcik6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBibG9ja3M9PTE6CisgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gc3RyKHNlbGYuYnl0ZXNfc2VudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgIyBYWFggVHJ5IGZvciBjaHVua2VkIGVuY29kaW5nIGlmIG9yaWdpbiBzZXJ2ZXIgYW5kIGNsaWVudCBpcyAxLjEKKworCisgICAgZGVmIGNsZWFudXBfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiTWFrZSBhbnkgbmVjZXNzYXJ5IGhlYWRlciBjaGFuZ2VzIG9yIGRlZmF1bHRzCisKKyAgICAgICAgU3ViY2xhc3NlcyBjYW4gZXh0ZW5kIHRoaXMgdG8gYWRkIG90aGVyIGRlZmF1bHRzLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuaGVhZGVycy5oYXNfa2V5KCdDb250ZW50LUxlbmd0aCcpOgorICAgICAgICAgICAgc2VsZi5zZXRfY29udGVudF9sZW5ndGgoKQorCisgICAgZGVmIHN0YXJ0X3Jlc3BvbnNlKHNlbGYsIHN0YXR1cywgaGVhZGVycyxleGNfaW5mbz1Ob25lKToKKyAgICAgICAgIiIiJ3N0YXJ0X3Jlc3BvbnNlKCknIGNhbGxhYmxlIGFzIHNwZWNpZmllZCBieSBQRVAgMzMzIiIiCisKKyAgICAgICAgaWYgZXhjX2luZm86CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICAgICAgICAgICMgUmUtcmFpc2Ugb3JpZ2luYWwgZXhjZXB0aW9uIGlmIGhlYWRlcnMgc2VudAorICAgICAgICAgICAgICAgICAgICByYWlzZSBleGNfaW5mb1swXSwgZXhjX2luZm9bMV0sIGV4Y19pbmZvWzJdCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZSAgICAgICAgIyBhdm9pZCBkYW5nbGluZyBjaXJjdWxhciByZWYKKyAgICAgICAgZWxpZiBzZWxmLmhlYWRlcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiSGVhZGVycyBhbHJlYWR5IHNldCEiKQorCisgICAgICAgIGFzc2VydCB0eXBlKHN0YXR1cykgaXMgU3RyaW5nVHlwZSwiU3RhdHVzIG11c3QgYmUgYSBzdHJpbmciCisgICAgICAgIGFzc2VydCBsZW4oc3RhdHVzKT49NCwiU3RhdHVzIG11c3QgYmUgYXQgbGVhc3QgNCBjaGFyYWN0ZXJzIgorICAgICAgICBhc3NlcnQgaW50KHN0YXR1c1s6M10pLCJTdGF0dXMgbWVzc2FnZSBtdXN0IGJlZ2luIHcvMy1kaWdpdCBjb2RlIgorICAgICAgICBhc3NlcnQgc3RhdHVzWzNdPT0iICIsICJTdGF0dXMgbWVzc2FnZSBtdXN0IGhhdmUgYSBzcGFjZSBhZnRlciBjb2RlIgorICAgICAgICBpZiBfX2RlYnVnX186CisgICAgICAgICAgICBmb3IgbmFtZSx2YWwgaW4gaGVhZGVyczoKKyAgICAgICAgICAgICAgICBhc3NlcnQgdHlwZShuYW1lKSBpcyBTdHJpbmdUeXBlLCJIZWFkZXIgbmFtZXMgbXVzdCBiZSBzdHJpbmdzIgorICAgICAgICAgICAgICAgIGFzc2VydCB0eXBlKHZhbCkgaXMgU3RyaW5nVHlwZSwiSGVhZGVyIHZhbHVlcyBtdXN0IGJlIHN0cmluZ3MiCisgICAgICAgICAgICAgICAgYXNzZXJ0IG5vdCBpc19ob3BfYnlfaG9wKG5hbWUpLCJIb3AtYnktaG9wIGhlYWRlcnMgbm90IGFsbG93ZWQiCisgICAgICAgIHNlbGYuc3RhdHVzID0gc3RhdHVzCisgICAgICAgIHNlbGYuaGVhZGVycyA9IHNlbGYuaGVhZGVyc19jbGFzcyhoZWFkZXJzKQorICAgICAgICByZXR1cm4gc2VsZi53cml0ZQorCisKKyAgICBkZWYgc2VuZF9wcmVhbWJsZShzZWxmKToKKyAgICAgICAgIiIiVHJhbnNtaXQgdmVyc2lvbi9zdGF0dXMvZGF0ZS9zZXJ2ZXIsIHZpYSBzZWxmLl93cml0ZSgpIiIiCisgICAgICAgIGlmIHNlbGYub3JpZ2luX3NlcnZlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuY2xpZW50X2lzX21vZGVybigpOgorICAgICAgICAgICAgICAgIHNlbGYuX3dyaXRlKCdIVFRQLyVzICVzXHJcbicgJSAoc2VsZi5odHRwX3ZlcnNpb24sc2VsZi5zdGF0dXMpKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcnMuaGFzX2tleSgnRGF0ZScpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICdEYXRlOiAlc1xyXG4nICUgZm9ybWF0X2RhdGVfdGltZSh0aW1lLnRpbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuc2VydmVyX3NvZnR3YXJlIGFuZCBub3Qgc2VsZi5oZWFkZXJzLmhhc19rZXkoJ1NlcnZlcicpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZSgnU2VydmVyOiAlc1xyXG4nICUgc2VsZi5zZXJ2ZXJfc29mdHdhcmUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl93cml0ZSgnU3RhdHVzOiAlc1xyXG4nICUgc2VsZi5zdGF0dXMpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgZGF0YSk6CisgICAgICAgICIiIid3cml0ZSgpJyBjYWxsYWJsZSBhcyBzcGVjaWZpZWQgYnkgUEVQIDMzMyIiIgorCisgICAgICAgIGFzc2VydCB0eXBlKGRhdGEpIGlzIFN0cmluZ1R5cGUsIndyaXRlKCkgYXJndW1lbnQgbXVzdCBiZSBzdHJpbmciCisKKyAgICAgICAgaWYgbm90IHNlbGYuc3RhdHVzOgorICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoIndyaXRlKCkgYmVmb3JlIHN0YXJ0X3Jlc3BvbnNlKCkiKQorCisgICAgICAgIGVsaWYgbm90IHNlbGYuaGVhZGVyc19zZW50OgorICAgICAgICAgICAgIyBCZWZvcmUgdGhlIGZpcnN0IG91dHB1dCwgc2VuZCB0aGUgc3RvcmVkIGhlYWRlcnMKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfc2VudCA9IGxlbihkYXRhKSAgICAjIG1ha2Ugc3VyZSB3ZSBrbm93IGNvbnRlbnQtbGVuZ3RoCisgICAgICAgICAgICBzZWxmLnNlbmRfaGVhZGVycygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJ5dGVzX3NlbnQgKz0gbGVuKGRhdGEpCisKKyAgICAgICAgIyBYWFggY2hlY2sgQ29udGVudC1MZW5ndGggYW5kIHRydW5jYXRlIGlmIHRvbyBtYW55IGJ5dGVzIHdyaXR0ZW4/CisgICAgICAgIHNlbGYuX3dyaXRlKGRhdGEpCisgICAgICAgIHNlbGYuX2ZsdXNoKCkKKworCisgICAgZGVmIHNlbmRmaWxlKHNlbGYpOgorICAgICAgICAiIiJQbGF0Zm9ybS1zcGVjaWZpYyBmaWxlIHRyYW5zbWlzc2lvbgorCisgICAgICAgIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGluIHN1YmNsYXNzZXMgdG8gc3VwcG9ydCBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgICBmaWxlIHRyYW5zbWlzc2lvbi4gIEl0IGlzIG9ubHkgY2FsbGVkIGlmIHRoZSBhcHBsaWNhdGlvbidzCisgICAgICAgIHJldHVybiBpdGVyYWJsZSAoJ3NlbGYucmVzdWx0JykgaXMgYW4gaW5zdGFuY2Ugb2YKKyAgICAgICAgJ3NlbGYud3NnaV9maWxlX3dyYXBwZXInLgorCisgICAgICAgIFRoaXMgbWV0aG9kIHNob3VsZCByZXR1cm4gYSB0cnVlIHZhbHVlIGlmIGl0IHdhcyBhYmxlIHRvIGFjdHVhbGx5CisgICAgICAgIHRyYW5zbWl0IHRoZSB3cmFwcGVkIGZpbGUtbGlrZSBvYmplY3QgdXNpbmcgYSBwbGF0Zm9ybS1zcGVjaWZpYworICAgICAgICBhcHByb2FjaC4gIEl0IHNob3VsZCByZXR1cm4gYSBmYWxzZSB2YWx1ZSBpZiBub3JtYWwgaXRlcmF0aW9uCisgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuICBBbiBleGNlcHRpb24gY2FuIGJlIHJhaXNlZCB0byBpbmRpY2F0ZQorICAgICAgICB0aGF0IHRyYW5zbWlzc2lvbiB3YXMgYXR0ZW1wdGVkLCBidXQgZmFpbGVkLgorCisgICAgICAgIE5PVEU6IHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsICdzZWxmLnNlbmRfaGVhZGVycygpJyBpZgorICAgICAgICAnc2VsZi5oZWFkZXJzX3NlbnQnIGlzIGZhbHNlIGFuZCBpdCBpcyBnb2luZyB0byBhdHRlbXB0IGRpcmVjdAorICAgICAgICB0cmFuc21pc3Npb24gb2YgdGhlIGZpbGUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gRmFsc2UgICAjIE5vIHBsYXRmb3JtLXNwZWNpZmljIHRyYW5zbWlzc2lvbiBieSBkZWZhdWx0CisKKworICAgIGRlZiBmaW5pc2hfY29udGVudChzZWxmKToKKyAgICAgICAgIiIiRW5zdXJlIGhlYWRlcnMgYW5kIGNvbnRlbnQgaGF2ZSBib3RoIGJlZW4gc2VudCIiIgorICAgICAgICBpZiBub3Qgc2VsZi5oZWFkZXJzX3NlbnQ6CisgICAgICAgICAgICBzZWxmLmhlYWRlcnNbJ0NvbnRlbnQtTGVuZ3RoJ10gPSAiMCIKKyAgICAgICAgICAgIHNlbGYuc2VuZF9oZWFkZXJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MgIyBYWFggY2hlY2sgaWYgY29udGVudC1sZW5ndGggd2FzIHRvbyBzaG9ydD8KKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgIiIiQ2xvc2UgdGhlIGl0ZXJhYmxlIChpZiBuZWVkZWQpIGFuZCByZXNldCBhbGwgaW5zdGFuY2UgdmFycworCisgICAgICAgIFN1YmNsYXNzZXMgbWF5IHdhbnQgdG8gYWxzbyBkcm9wIHRoZSBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5yZXN1bHQsJ2Nsb3NlJyk6CisgICAgICAgICAgICAgICAgc2VsZi5yZXN1bHQuY2xvc2UoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5yZXN1bHQgPSBzZWxmLmhlYWRlcnMgPSBzZWxmLnN0YXR1cyA9IHNlbGYuZW52aXJvbiA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuYnl0ZXNfc2VudCA9IDA7IHNlbGYuaGVhZGVyc19zZW50ID0gRmFsc2UKKworCisgICAgZGVmIHNlbmRfaGVhZGVycyhzZWxmKToKKyAgICAgICAgIiIiVHJhbnNtaXQgaGVhZGVycyB0byB0aGUgY2xpZW50LCB2aWEgc2VsZi5fd3JpdGUoKSIiIgorICAgICAgICBzZWxmLmNsZWFudXBfaGVhZGVycygpCisgICAgICAgIHNlbGYuaGVhZGVyc19zZW50ID0gVHJ1ZQorICAgICAgICBpZiBub3Qgc2VsZi5vcmlnaW5fc2VydmVyIG9yIHNlbGYuY2xpZW50X2lzX21vZGVybigpOgorICAgICAgICAgICAgc2VsZi5zZW5kX3ByZWFtYmxlKCkKKyAgICAgICAgICAgIHNlbGYuX3dyaXRlKHN0cihzZWxmLmhlYWRlcnMpKQorCisKKyAgICBkZWYgcmVzdWx0X2lzX2ZpbGUoc2VsZik6CisgICAgICAgICIiIlRydWUgaWYgJ3NlbGYucmVzdWx0JyBpcyBhbiBpbnN0YW5jZSBvZiAnc2VsZi53c2dpX2ZpbGVfd3JhcHBlciciIiIKKyAgICAgICAgd3JhcHBlciA9IHNlbGYud3NnaV9maWxlX3dyYXBwZXIKKyAgICAgICAgcmV0dXJuIHdyYXBwZXIgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uoc2VsZi5yZXN1bHQsd3JhcHBlcikKKworCisgICAgZGVmIGNsaWVudF9pc19tb2Rlcm4oc2VsZik6CisgICAgICAgICIiIlRydWUgaWYgY2xpZW50IGNhbiBhY2NlcHQgc3RhdHVzIGFuZCBoZWFkZXJzIiIiCisgICAgICAgIHJldHVybiBzZWxmLmVudmlyb25bJ1NFUlZFUl9QUk9UT0NPTCddLnVwcGVyKCkgIT0gJ0hUVFAvMC45JworCisKKyAgICBkZWYgbG9nX2V4Y2VwdGlvbihzZWxmLGV4Y19pbmZvKToKKyAgICAgICAgIiIiTG9nIHRoZSAnZXhjX2luZm8nIHR1cGxlIGluIHRoZSBzZXJ2ZXIgbG9nCisKKyAgICAgICAgU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdG8gcmV0YXJnZXQgdGhlIG91dHB1dCBvciBjaGFuZ2UgaXRzIGZvcm1hdC4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZyb20gdHJhY2ViYWNrIGltcG9ydCBwcmludF9leGNlcHRpb24KKyAgICAgICAgICAgIHN0ZGVyciA9IHNlbGYuZ2V0X3N0ZGVycigpCisgICAgICAgICAgICBwcmludF9leGNlcHRpb24oCisgICAgICAgICAgICAgICAgZXhjX2luZm9bMF0sIGV4Y19pbmZvWzFdLCBleGNfaW5mb1syXSwKKyAgICAgICAgICAgICAgICBzZWxmLnRyYWNlYmFja19saW1pdCwgc3RkZXJyCisgICAgICAgICAgICApCisgICAgICAgICAgICBzdGRlcnIuZmx1c2goKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZXhjX2luZm8gPSBOb25lCisKKyAgICBkZWYgaGFuZGxlX2Vycm9yKHNlbGYpOgorICAgICAgICAiIiJMb2cgY3VycmVudCBlcnJvciwgYW5kIHNlbmQgZXJyb3Igb3V0cHV0IHRvIGNsaWVudCBpZiBwb3NzaWJsZSIiIgorICAgICAgICBzZWxmLmxvZ19leGNlcHRpb24oc3lzLmV4Y19pbmZvKCkpCisgICAgICAgIGlmIG5vdCBzZWxmLmhlYWRlcnNfc2VudDoKKyAgICAgICAgICAgIHNlbGYucmVzdWx0ID0gc2VsZi5lcnJvcl9vdXRwdXQoc2VsZi5lbnZpcm9uLCBzZWxmLnN0YXJ0X3Jlc3BvbnNlKQorICAgICAgICAgICAgc2VsZi5maW5pc2hfcmVzcG9uc2UoKQorICAgICAgICAjIFhYWCBlbHNlOiBhdHRlbXB0IGFkdmFuY2VkIHJlY292ZXJ5IHRlY2huaXF1ZXMgZm9yIEhUTUwgb3IgdGV4dD8KKworICAgIGRlZiBlcnJvcl9vdXRwdXQoc2VsZiwgZW52aXJvbiwgc3RhcnRfcmVzcG9uc2UpOgorICAgICAgICAiIiJXU0dJIG1pbmktYXBwIHRvIGNyZWF0ZSBlcnJvciBvdXRwdXQKKworICAgICAgICBCeSBkZWZhdWx0LCB0aGlzIGp1c3QgdXNlcyB0aGUgJ2Vycm9yX3N0YXR1cycsICdlcnJvcl9oZWFkZXJzJywKKyAgICAgICAgYW5kICdlcnJvcl9ib2R5JyBhdHRyaWJ1dGVzIHRvIGdlbmVyYXRlIGFuIG91dHB1dCBwYWdlLiAgSXQgY2FuCisgICAgICAgIGJlIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcyB0byBkeW5hbWljYWxseSBnZW5lcmF0ZSBkaWFnbm9zdGljcywKKyAgICAgICAgY2hvb3NlIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgZm9yIHRoZSB1c2VyJ3MgcHJlZmVycmVkIGxhbmd1YWdlLCBldGMuCisKKyAgICAgICAgTm90ZSwgaG93ZXZlciwgdGhhdCBpdCdzIG5vdCByZWNvbW1lbmRlZCBmcm9tIGEgc2VjdXJpdHkgcGVyc3BlY3RpdmUgdG8KKyAgICAgICAgc3BpdCBvdXQgZGlhZ25vc3RpY3MgdG8gYW55IG9sZCB1c2VyOyBpZGVhbGx5LCB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8KKyAgICAgICAgc29tZXRoaW5nIHNwZWNpYWwgdG8gZW5hYmxlIGRpYWdub3N0aWMgb3V0cHV0LCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QKKyAgICAgICAgaW5jbHVkZSBhbnkgaGVyZSEKKyAgICAgICAgIiIiCisgICAgICAgIHN0YXJ0X3Jlc3BvbnNlKHNlbGYuZXJyb3Jfc3RhdHVzLHNlbGYuZXJyb3JfaGVhZGVyc1s6XSxzeXMuZXhjX2luZm8oKSkKKyAgICAgICAgcmV0dXJuIFtzZWxmLmVycm9yX2JvZHldCisKKworICAgICMgUHVyZSBhYnN0cmFjdCBtZXRob2RzOyAqbXVzdCogYmUgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzCisKKyAgICBkZWYgX3dyaXRlKHNlbGYsZGF0YSk6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGJ1ZmZlciBkYXRhIGZvciBzZW5kIHRvIGNsaWVudAorCisgICAgICAgIEl0J3Mgb2theSBpZiB0aGlzIG1ldGhvZCBhY3R1YWxseSB0cmFuc21pdHMgdGhlIGRhdGE7IEJhc2VIYW5kbGVyCisgICAgICAgIGp1c3Qgc2VwYXJhdGVzIHdyaXRlIGFuZCBmbHVzaCBvcGVyYXRpb25zIGZvciBncmVhdGVyIGVmZmljaWVuY3kKKyAgICAgICAgd2hlbiB0aGUgdW5kZXJseWluZyBzeXN0ZW0gYWN0dWFsbHkgaGFzIHN1Y2ggYSBkaXN0aW5jdGlvbi4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBfZmx1c2goc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGZvcmNlIHNlbmRpbmcgb2YgcmVjZW50ICdfd3JpdGUoKScgY2FsbHMKKworICAgICAgICBJdCdzIG9rYXkgaWYgdGhpcyBtZXRob2QgaXMgYSBuby1vcCAoaS5lLiwgaWYgJ193cml0ZSgpJyBhY3R1YWxseQorICAgICAgICBzZW5kcyB0aGUgZGF0YS4KKyAgICAgICAgIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBnZXRfc3RkaW4oc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHJldHVybiBzdWl0YWJsZSAnd3NnaS5pbnB1dCciIiIKKyAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIHJldHVybiBzdWl0YWJsZSAnd3NnaS5lcnJvcnMnIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworICAgIGRlZiBhZGRfY2dpX3ZhcnMoc2VsZik6CisgICAgICAgICIiIk92ZXJyaWRlIGluIHN1YmNsYXNzIHRvIGluc2VydCBDR0kgdmFyaWFibGVzIGluICdzZWxmLmVudmlyb24nIiIiCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKKworCisKKworCisKKworCisKKworCitjbGFzcyBTaW1wbGVIYW5kbGVyKEJhc2VIYW5kbGVyKToKKyAgICAiIiJIYW5kbGVyIHRoYXQncyBqdXN0IGluaXRpYWxpemVkIHdpdGggc3RyZWFtcywgZW52aXJvbm1lbnQsIGV0Yy4KKworICAgIFRoaXMgaGFuZGxlciBzdWJjbGFzcyBpcyBpbnRlbmRlZCBmb3Igc3luY2hyb25vdXMgSFRUUC8xLjAgb3JpZ2luIHNlcnZlcnMsCisgICAgYW5kIGhhbmRsZXMgc2VuZGluZyB0aGUgZW50aXJlIHJlc3BvbnNlIG91dHB1dCwgZ2l2ZW4gdGhlIGNvcnJlY3QgaW5wdXRzLgorCisgICAgVXNhZ2U6OgorCisgICAgICAgIGhhbmRsZXIgPSBTaW1wbGVIYW5kbGVyKAorICAgICAgICAgICAgaW5wLG91dCxlcnIsZW52LCBtdWx0aXRocmVhZD1GYWxzZSwgbXVsdGlwcm9jZXNzPVRydWUKKyAgICAgICAgKQorICAgICAgICBoYW5kbGVyLnJ1bihhcHApIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixzdGRpbixzdGRvdXQsc3RkZXJyLGVudmlyb24sCisgICAgICAgIG11bHRpdGhyZWFkPVRydWUsIG11bHRpcHJvY2Vzcz1GYWxzZQorICAgICk6CisgICAgICAgIHNlbGYuc3RkaW4gPSBzdGRpbgorICAgICAgICBzZWxmLnN0ZG91dCA9IHN0ZG91dAorICAgICAgICBzZWxmLnN0ZGVyciA9IHN0ZGVycgorICAgICAgICBzZWxmLmJhc2VfZW52ID0gZW52aXJvbgorICAgICAgICBzZWxmLndzZ2lfbXVsdGl0aHJlYWQgPSBtdWx0aXRocmVhZAorICAgICAgICBzZWxmLndzZ2lfbXVsdGlwcm9jZXNzID0gbXVsdGlwcm9jZXNzCisKKyAgICBkZWYgZ2V0X3N0ZGluKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5zdGRpbgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnN0ZGVycgorCisgICAgZGVmIGFkZF9jZ2lfdmFycyhzZWxmKToKKyAgICAgICAgc2VsZi5lbnZpcm9uLnVwZGF0ZShzZWxmLmJhc2VfZW52KQorCisgICAgZGVmIF93cml0ZShzZWxmLGRhdGEpOgorICAgICAgICBzZWxmLnN0ZG91dC53cml0ZShkYXRhKQorICAgICAgICBzZWxmLl93cml0ZSA9IHNlbGYuc3Rkb3V0LndyaXRlCisKKyAgICBkZWYgX2ZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHNlbGYuX2ZsdXNoID0gc2VsZi5zdGRvdXQuZmx1c2gKKworCitjbGFzcyBCYXNlQ0dJSGFuZGxlcihTaW1wbGVIYW5kbGVyKToKKworICAgICIiIkNHSS1saWtlIHN5c3RlbXMgdXNpbmcgaW5wdXQvb3V0cHV0L2Vycm9yIHN0cmVhbXMgYW5kIGVudmlyb24gbWFwcGluZworCisgICAgVXNhZ2U6OgorCisgICAgICAgIGhhbmRsZXIgPSBCYXNlQ0dJSGFuZGxlcihpbnAsb3V0LGVycixlbnYpCisgICAgICAgIGhhbmRsZXIucnVuKGFwcCkKKworICAgIFRoaXMgaGFuZGxlciBjbGFzcyBpcyB1c2VmdWwgZm9yIGdhdGV3YXkgcHJvdG9jb2xzIGxpa2UgUmVhZHlFeGVjIGFuZAorICAgIEZhc3RDR0ksIHRoYXQgaGF2ZSB1c2FibGUgaW5wdXQvb3V0cHV0L2Vycm9yIHN0cmVhbXMgYW5kIGFuIGVudmlyb25tZW50CisgICAgbWFwcGluZy4gIEl0J3MgYWxzbyB0aGUgYmFzZSBjbGFzcyBmb3IgQ0dJSGFuZGxlciwgd2hpY2gganVzdCB1c2VzCisgICAgc3lzLnN0ZGluLCBvcy5lbnZpcm9uLCBhbmQgc28gb24uCisKKyAgICBUaGUgY29uc3RydWN0b3IgYWxzbyB0YWtlcyBrZXl3b3JkIGFyZ3VtZW50cyAnbXVsdGl0aHJlYWQnIGFuZAorICAgICdtdWx0aXByb2Nlc3MnIChkZWZhdWx0aW5nIHRvICdUcnVlJyBhbmQgJ0ZhbHNlJyByZXNwZWN0aXZlbHkpIHRvIGNvbnRyb2wKKyAgICB0aGUgY29uZmlndXJhdGlvbiBzZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4gIEl0IHNldHMgJ29yaWdpbl9zZXJ2ZXInIHRvCisgICAgRmFsc2UgKHRvIGVuYWJsZSBDR0ktbGlrZSBvdXRwdXQpLCBhbmQgYXNzdW1lcyB0aGF0ICd3c2dpLnJ1bl9vbmNlJyBpcworICAgIEZhbHNlLgorICAgICIiIgorCisgICAgb3JpZ2luX3NlcnZlciA9IEZhbHNlCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIENHSUhhbmRsZXIoQmFzZUNHSUhhbmRsZXIpOgorCisgICAgIiIiQ0dJLWJhc2VkIGludm9jYXRpb24gdmlhIHN5cy5zdGRpbi9zdGRvdXQvc3RkZXJyIGFuZCBvcy5lbnZpcm9uCisKKyAgICBVc2FnZTo6CisKKyAgICAgICAgQ0dJSGFuZGxlcigpLnJ1bihhcHApCisKKyAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgY2xhc3MgYW5kIEJhc2VDR0lIYW5kbGVyIGlzIHRoYXQgaXQgYWx3YXlzCisgICAgdXNlcyAnd3NnaS5ydW5fb25jZScgb2YgJ1RydWUnLCAnd3NnaS5tdWx0aXRocmVhZCcgb2YgJ0ZhbHNlJywgYW5kCisgICAgJ3dzZ2kubXVsdGlwcm9jZXNzJyBvZiAnVHJ1ZScuICBJdCBkb2VzIG5vdCB0YWtlIGFueSBpbml0aWFsaXphdGlvbgorICAgIHBhcmFtZXRlcnMsIGJ1dCBhbHdheXMgdXNlcyAnc3lzLnN0ZGluJywgJ29zLmVudmlyb24nLCBhbmQgZnJpZW5kcy4KKworICAgIElmIHlvdSBuZWVkIHRvIG92ZXJyaWRlIGFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzLCB1c2UgQmFzZUNHSUhhbmRsZXIKKyAgICBpbnN0ZWFkLgorICAgICIiIgorCisgICAgd3NnaV9ydW5fb25jZSA9IFRydWUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQmFzZUNHSUhhbmRsZXIuX19pbml0X18oCisgICAgICAgICAgICBzZWxmLCBzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIsIGRpY3Qob3MuZW52aXJvbi5pdGVtcygpKSwKKyAgICAgICAgICAgIG11bHRpdGhyZWFkPUZhbHNlLCBtdWx0aXByb2Nlc3M9VHJ1ZQorICAgICAgICApCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyMKZGlmZiAtLWdpdCBhL0xpYi93c2dpcmVmL2hlYWRlcnMucHkgYi9MaWIvd3NnaXJlZi9oZWFkZXJzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmViODYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi9oZWFkZXJzLnB5CkBAIC0wLDAgKzEsMjA1IEBACisiIiJNYW5hZ2UgSFRUUCBSZXNwb25zZSBIZWFkZXJzCisKK011Y2ggb2YgdGhpcyBtb2R1bGUgaXMgcmVkLWhhbmRlZGx5IHBpbGZlcmVkIGZyb20gZW1haWwuTWVzc2FnZSBpbiB0aGUgc3RkbGliLAorc28gcG9ydGlvbnMgYXJlIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBhbmQgd2VyZQord3JpdHRlbiBieSBCYXJyeSBXYXJzYXcuCisiIiIKKworZnJvbSB0eXBlcyBpbXBvcnQgTGlzdFR5cGUsIFR1cGxlVHlwZQorCisjIFJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgYHNwZWNpYWwnIGNoYXJhY3RlcnMgaW4gcGFyYW1ldGVycywgdGhlCisjIGV4aXN0YW5jZSBvZiB3aGljaCBmb3JjZSBxdW90aW5nIG9mIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCitpbXBvcnQgcmUKK3RzcGVjaWFscyA9IHJlLmNvbXBpbGUocidbIFwoXCk8PkAsOzpcXCIvXFtcXVw/PV0nKQorCitkZWYgX2Zvcm1hdHBhcmFtKHBhcmFtLCB2YWx1ZT1Ob25lLCBxdW90ZT0xKToKKyAgICAiIiJDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBmb3JtYXQgYW5kIHJldHVybiBhIGtleT12YWx1ZSBwYWlyLgorCisgICAgVGhpcyB3aWxsIHF1b3RlIHRoZSB2YWx1ZSBpZiBuZWVkZWQgb3IgaWYgcXVvdGUgaXMgdHJ1ZS4KKyAgICAiIiIKKyAgICBpZiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgbGVuKHZhbHVlKSA+IDA6CisgICAgICAgIGlmIHF1b3RlIG9yIHRzcGVjaWFscy5zZWFyY2godmFsdWUpOgorICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5yZXBsYWNlKCdcXCcsICdcXFxcJykucmVwbGFjZSgnIicsIHInXCInKQorICAgICAgICAgICAgcmV0dXJuICclcz0iJXMiJyAlIChwYXJhbSwgdmFsdWUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gJyVzPSVzJyAlIChwYXJhbSwgdmFsdWUpCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIHBhcmFtCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgSGVhZGVyczoKKworICAgICIiIk1hbmFnZSBhIGNvbGxlY3Rpb24gb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixoZWFkZXJzKToKKyAgICAgICAgaWYgdHlwZShoZWFkZXJzKSBpcyBub3QgTGlzdFR5cGU6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkhlYWRlcnMgbXVzdCBiZSBhIGxpc3Qgb2YgbmFtZS92YWx1ZSB0dXBsZXMiKQorICAgICAgICBzZWxmLl9oZWFkZXJzID0gaGVhZGVycworCisgICAgZGVmIF9fbGVuX18oc2VsZik6CisgICAgICAgICIiIlJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGhlYWRlcnMsIGluY2x1ZGluZyBkdXBsaWNhdGVzLiIiIgorICAgICAgICByZXR1cm4gbGVuKHNlbGYuX2hlYWRlcnMpCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgbmFtZSwgdmFsKToKKyAgICAgICAgIiIiU2V0IHRoZSB2YWx1ZSBvZiBhIGhlYWRlci4iIiIKKyAgICAgICAgZGVsIHNlbGZbbmFtZV0KKyAgICAgICAgc2VsZi5faGVhZGVycy5hcHBlbmQoKG5hbWUsIHZhbCkpCisKKyAgICBkZWYgX19kZWxpdGVtX18oc2VsZixuYW1lKToKKyAgICAgICAgIiIiRGVsZXRlIGFsbCBvY2N1cnJlbmNlcyBvZiBhIGhlYWRlciwgaWYgcHJlc2VudC4KKworICAgICAgICBEb2VzICpub3QqIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUgaGVhZGVyIGlzIG1pc3NpbmcuCisgICAgICAgICIiIgorICAgICAgICBuYW1lID0gbmFtZS5sb3dlcigpCisgICAgICAgIHNlbGYuX2hlYWRlcnNbOl0gPSBba3YgZm9yIGt2IGluIHNlbGYuX2hlYWRlcnMgaWYga3ZbMF0ubG93ZXIoKTw+bmFtZV0KKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLG5hbWUpOgorICAgICAgICAiIiJHZXQgdGhlIGZpcnN0IGhlYWRlciB2YWx1ZSBmb3IgJ25hbWUnCisKKyAgICAgICAgUmV0dXJuIE5vbmUgaWYgdGhlIGhlYWRlciBpcyBtaXNzaW5nIGluc3RlYWQgb2YgcmFpc2luZyBhbiBleGNlcHRpb24uCisKKyAgICAgICAgTm90ZSB0aGF0IGlmIHRoZSBoZWFkZXIgYXBwZWFyZWQgbXVsdGlwbGUgdGltZXMsIHRoZSBmaXJzdCBleGFjdGx5IHdoaWNoCisgICAgICAgIG9jY3VycmFuY2UgZ2V0cyByZXR1cm5lZCBpcyB1bmRlZmluZWQuICBVc2UgZ2V0YWxsKCkgdG8gZ2V0IGFsbAorICAgICAgICB0aGUgdmFsdWVzIG1hdGNoaW5nIGEgaGVhZGVyIGZpZWxkIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi5nZXQobmFtZSkKKworCisKKworCisgICAgZGVmIGhhc19rZXkoc2VsZiwgbmFtZSk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIHRoZSBoZWFkZXIuIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldChuYW1lKSBpcyBub3QgTm9uZQorCisgICAgX19jb250YWluc19fID0gaGFzX2tleQorCisKKyAgICBkZWYgZ2V0X2FsbChzZWxmLCBuYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIG5hbWVkIGZpZWxkLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLiAgQW55CisgICAgICAgIGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIgbGlzdC4KKyAgICAgICAgSWYgbm8gZmllbGRzIGV4aXN0IHdpdGggdGhlIGdpdmVuIG5hbWUsIHJldHVybnMgYW4gZW1wdHkgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgcmV0dXJuIFtrdlsxXSBmb3Iga3YgaW4gc2VsZi5faGVhZGVycyBpZiBrdlswXS5sb3dlcigpPT1uYW1lXQorCisKKyAgICBkZWYgZ2V0KHNlbGYsbmFtZSxkZWZhdWx0PU5vbmUpOgorICAgICAgICAiIiJHZXQgdGhlIGZpcnN0IGhlYWRlciB2YWx1ZSBmb3IgJ25hbWUnLCBvciByZXR1cm4gJ2RlZmF1bHQnIiIiCisgICAgICAgIG5hbWUgPSBuYW1lLmxvd2VyKCkKKyAgICAgICAgZm9yIGssdiBpbiBzZWxmLl9oZWFkZXJzOgorICAgICAgICAgICAgaWYgay5sb3dlcigpPT1uYW1lOgorICAgICAgICAgICAgICAgIHJldHVybiB2CisgICAgICAgIHJldHVybiBkZWZhdWx0CisKKworICAgIGRlZiBrZXlzKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIGFsbCB0aGUgaGVhZGVyIGZpZWxkIG5hbWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IGFwcGVhcmVkIGluIHRoZSBvcmlnaW5hbCBoZWFkZXIKKyAgICAgICAgbGlzdCwgb3Igd2VyZSBhZGRlZCB0byB0aGlzIGluc3RhbmNlLCBhbmQgbWF5IGNvbnRhaW4gZHVwbGljYXRlcy4KKyAgICAgICAgQW55IGZpZWxkcyBkZWxldGVkIGFuZCByZS1pbnNlcnRlZCBhcmUgYWx3YXlzIGFwcGVuZGVkIHRvIHRoZSBoZWFkZXIKKyAgICAgICAgbGlzdC4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBbayBmb3IgaywgdiBpbiBzZWxmLl9oZWFkZXJzXQorCisKKworCisgICAgZGVmIHZhbHVlcyhzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBhbGwgaGVhZGVyIHZhbHVlcy4KKworICAgICAgICBUaGVzZSB3aWxsIGJlIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXJlZCBpbiB0aGUgb3JpZ2luYWwgaGVhZGVyCisgICAgICAgIGxpc3QsIG9yIHdlcmUgYWRkZWQgdG8gdGhpcyBpbnN0YW5jZSwgYW5kIG1heSBjb250YWluIGR1cGxpY2F0ZXMuCisgICAgICAgIEFueSBmaWVsZHMgZGVsZXRlZCBhbmQgcmUtaW5zZXJ0ZWQgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byB0aGUgaGVhZGVyCisgICAgICAgIGxpc3QuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gW3YgZm9yIGssIHYgaW4gc2VsZi5faGVhZGVyc10KKworICAgIGRlZiBpdGVtcyhzZWxmKToKKyAgICAgICAgIiIiR2V0IGFsbCB0aGUgaGVhZGVyIGZpZWxkcyBhbmQgdmFsdWVzLgorCisgICAgICAgIFRoZXNlIHdpbGwgYmUgc29ydGVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgaW4gdGhlIG9yaWdpbmFsIGhlYWRlcgorICAgICAgICBsaXN0LCBvciB3ZXJlIGFkZGVkIHRvIHRoaXMgaW5zdGFuY2UsIGFuZCBtYXkgY29udGFpbiBkdXBsaWNhdGVzLgorICAgICAgICBBbnkgZmllbGRzIGRlbGV0ZWQgYW5kIHJlLWluc2VydGVkIGFyZSBhbHdheXMgYXBwZW5kZWQgdG8gdGhlIGhlYWRlcgorICAgICAgICBsaXN0LgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX2hlYWRlcnNbOl0KKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICJIZWFkZXJzKCVzKSIgJSBgc2VsZi5faGVhZGVyc2AKKworICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICAiIiJzdHIoKSByZXR1cm5zIHRoZSBmb3JtYXR0ZWQgaGVhZGVycywgY29tcGxldGUgd2l0aCBlbmQgbGluZSwKKyAgICAgICAgc3VpdGFibGUgZm9yIGRpcmVjdCBIVFRQIHRyYW5zbWlzc2lvbi4iIiIKKyAgICAgICAgcmV0dXJuICdcclxuJy5qb2luKFsiJXM6ICVzIiAlIGt2IGZvciBrdiBpbiBzZWxmLl9oZWFkZXJzXStbJycsJyddKQorCisgICAgZGVmIHNldGRlZmF1bHQoc2VsZixuYW1lLHZhbHVlKToKKyAgICAgICAgIiIiUmV0dXJuIGZpcnN0IG1hdGNoaW5nIGhlYWRlciB2YWx1ZSBmb3IgJ25hbWUnLCBvciAndmFsdWUnCisKKyAgICAgICAgSWYgdGhlcmUgaXMgbm8gaGVhZGVyIG5hbWVkICduYW1lJywgYWRkIGEgbmV3IGhlYWRlciB3aXRoIG5hbWUgJ25hbWUnCisgICAgICAgIGFuZCB2YWx1ZSAndmFsdWUnLiIiIgorICAgICAgICByZXN1bHQgPSBzZWxmLmdldChuYW1lKQorICAgICAgICBpZiByZXN1bHQgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuX2hlYWRlcnMuYXBwZW5kKChuYW1lLHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdAorCisKKyAgICBkZWYgYWRkX2hlYWRlcihzZWxmLCBfbmFtZSwgX3ZhbHVlLCAqKl9wYXJhbXMpOgorICAgICAgICAiIiJFeHRlbmRlZCBoZWFkZXIgc2V0dGluZy4KKworICAgICAgICBfbmFtZSBpcyB0aGUgaGVhZGVyIGZpZWxkIHRvIGFkZC4gIGtleXdvcmQgYXJndW1lbnRzIGNhbiBiZSB1c2VkIHRvIHNldAorICAgICAgICBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoZSBoZWFkZXIgZmllbGQsIHdpdGggdW5kZXJzY29yZXMgY29udmVydGVkCisgICAgICAgIHRvIGRhc2hlcy4gIE5vcm1hbGx5IHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSBhZGRlZCBhcyBrZXk9InZhbHVlIiB1bmxlc3MKKyAgICAgICAgdmFsdWUgaXMgTm9uZSwgaW4gd2hpY2ggY2FzZSBvbmx5IHRoZSBrZXkgd2lsbCBiZSBhZGRlZC4KKworICAgICAgICBFeGFtcGxlOgorCisgICAgICAgIGguYWRkX2hlYWRlcignY29udGVudC1kaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywgZmlsZW5hbWU9J2J1ZC5naWYnKQorCisgICAgICAgIE5vdGUgdGhhdCB1bmxpa2UgdGhlIGNvcnJlc3BvbmRpbmcgJ2VtYWlsLk1lc3NhZ2UnIG1ldGhvZCwgdGhpcyBkb2VzCisgICAgICAgICpub3QqIGhhbmRsZSAnKGNoYXJzZXQsIGxhbmd1YWdlLCB2YWx1ZSknIHR1cGxlczogYWxsIHZhbHVlcyBtdXN0IGJlCisgICAgICAgIHN0cmluZ3Mgb3IgTm9uZS4KKyAgICAgICAgIiIiCisgICAgICAgIHBhcnRzID0gW10KKyAgICAgICAgaWYgX3ZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcGFydHMuYXBwZW5kKF92YWx1ZSkKKyAgICAgICAgZm9yIGssIHYgaW4gX3BhcmFtcy5pdGVtcygpOgorICAgICAgICAgICAgaWYgdiBpcyBOb25lOgorICAgICAgICAgICAgICAgIHBhcnRzLmFwcGVuZChrLnJlcGxhY2UoJ18nLCAnLScpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwYXJ0cy5hcHBlbmQoX2Zvcm1hdHBhcmFtKGsucmVwbGFjZSgnXycsICctJyksIHYpKQorICAgICAgICBzZWxmLl9oZWFkZXJzLmFwcGVuZCgoX25hbWUsICI7ICIuam9pbihwYXJ0cykpKQorCisKKworCisKKworCisKKworCisKKworCisKKworIwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvc2ltcGxlX3NlcnZlci5weSBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5OTZjYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi93c2dpcmVmL3NpbXBsZV9zZXJ2ZXIucHkKQEAgLTAsMCArMSwyMDUgQEAKKyIiIkJhc2VIVFRQU2VydmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgUHl0aG9uIFdTR0kgcHJvdG9jb2wgKFBFUCAzMzMsIHJldiAxLjIxKQorCitUaGlzIGlzIGJvdGggYW4gZXhhbXBsZSBvZiBob3cgV1NHSSBjYW4gYmUgaW1wbGVtZW50ZWQsIGFuZCBhIGJhc2lzIGZvciBydW5uaW5nCitzaW1wbGUgd2ViIGFwcGxpY2F0aW9ucyBvbiBhIGxvY2FsIG1hY2hpbmUsIHN1Y2ggYXMgbWlnaHQgYmUgZG9uZSB3aGVuIHRlc3RpbmcKK29yIGRlYnVnZ2luZyBhbiBhcHBsaWNhdGlvbi4gIEl0IGhhcyBub3QgYmVlbiByZXZpZXdlZCBmb3Igc2VjdXJpdHkgaXNzdWVzLAoraG93ZXZlciwgYW5kIHdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYSAicmVhbCIgd2ViIHNlcnZlciBmb3IKK3Byb2R1Y3Rpb24gdXNlLgorCitGb3IgZXhhbXBsZSB1c2FnZSwgc2VlIHRoZSAnaWYgX19uYW1lX189PSJfX21haW5fXyInIGJsb2NrIGF0IHRoZSBlbmQgb2YgdGhlCittb2R1bGUuICBTZWUgYWxzbyB0aGUgQmFzZUhUVFBTZXJ2ZXIgbW9kdWxlIGRvY3MgZm9yIG90aGVyIEFQSSBpbmZvcm1hdGlvbi4KKyIiIgorCitmcm9tIEJhc2VIVFRQU2VydmVyIGltcG9ydCBCYXNlSFRUUFJlcXVlc3RIYW5kbGVyLCBIVFRQU2VydmVyCitpbXBvcnQgdXJsbGliLCBzeXMKK2Zyb20gd3NnaXJlZi5oYW5kbGVycyBpbXBvcnQgU2ltcGxlSGFuZGxlcgorCitfX3ZlcnNpb25fXyA9ICIwLjEiCitfX2FsbF9fID0gWydXU0dJU2VydmVyJywgJ1dTR0lSZXF1ZXN0SGFuZGxlcicsICdkZW1vX2FwcCcsICdtYWtlX3NlcnZlciddCisKKworc2VydmVyX3ZlcnNpb24gPSAiV1NHSVNlcnZlci8iICsgX192ZXJzaW9uX18KK3N5c192ZXJzaW9uID0gIlB5dGhvbi8iICsgc3lzLnZlcnNpb24uc3BsaXQoKVswXQorc29mdHdhcmVfdmVyc2lvbiA9IHNlcnZlcl92ZXJzaW9uICsgJyAnICsgc3lzX3ZlcnNpb24KKworCitjbGFzcyBTZXJ2ZXJIYW5kbGVyKFNpbXBsZUhhbmRsZXIpOgorCisgICAgc2VydmVyX3NvZnR3YXJlID0gc29mdHdhcmVfdmVyc2lvbgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnJlcXVlc3RfaGFuZGxlci5sb2dfcmVxdWVzdCgKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXR1cy5zcGxpdCgnICcsMSlbMF0sIHNlbGYuYnl0ZXNfc2VudAorICAgICAgICAgICAgKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgU2ltcGxlSGFuZGxlci5jbG9zZShzZWxmKQorCisKKworCisKK2NsYXNzIFdTR0lTZXJ2ZXIoSFRUUFNlcnZlcik6CisKKyAgICAiIiJCYXNlSFRUUFNlcnZlciB0aGF0IGltcGxlbWVudHMgdGhlIFB5dGhvbiBXU0dJIHByb3RvY29sIiIiCisKKyAgICBhcHBsaWNhdGlvbiA9IE5vbmUKKworICAgIGRlZiBzZXJ2ZXJfYmluZChzZWxmKToKKyAgICAgICAgIiIiT3ZlcnJpZGUgc2VydmVyX2JpbmQgdG8gc3RvcmUgdGhlIHNlcnZlciBuYW1lLiIiIgorICAgICAgICBIVFRQU2VydmVyLnNlcnZlcl9iaW5kKHNlbGYpCisgICAgICAgIHNlbGYuc2V0dXBfZW52aXJvbigpCisKKyAgICBkZWYgc2V0dXBfZW52aXJvbihzZWxmKToKKyAgICAgICAgIyBTZXQgdXAgYmFzZSBlbnZpcm9ubWVudAorICAgICAgICBlbnYgPSBzZWxmLmJhc2VfZW52aXJvbiA9IHt9CisgICAgICAgIGVudlsnU0VSVkVSX05BTUUnXSA9IHNlbGYuc2VydmVyX25hbWUKKyAgICAgICAgZW52WydHQVRFV0FZX0lOVEVSRkFDRSddID0gJ0NHSS8xLjEnCisgICAgICAgIGVudlsnU0VSVkVSX1BPUlQnXSA9IHN0cihzZWxmLnNlcnZlcl9wb3J0KQorICAgICAgICBlbnZbJ1JFTU9URV9IT1NUJ109JycKKyAgICAgICAgZW52WydDT05URU5UX0xFTkdUSCddPScnCisgICAgICAgIGVudlsnU0NSSVBUX05BTUUnXSA9ICcnCisKKyAgICBkZWYgZ2V0X2FwcChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXBwbGljYXRpb24KKworICAgIGRlZiBzZXRfYXBwKHNlbGYsYXBwbGljYXRpb24pOgorICAgICAgICBzZWxmLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb24KKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFdTR0lSZXF1ZXN0SGFuZGxlcihCYXNlSFRUUFJlcXVlc3RIYW5kbGVyKToKKworICAgIHNlcnZlcl92ZXJzaW9uID0gIldTR0lTZXJ2ZXIvIiArIF9fdmVyc2lvbl9fCisKKyAgICBkZWYgZ2V0X2Vudmlyb24oc2VsZik6CisgICAgICAgIGVudiA9IHNlbGYuc2VydmVyLmJhc2VfZW52aXJvbi5jb3B5KCkKKyAgICAgICAgZW52WydTRVJWRVJfUFJPVE9DT0wnXSA9IHNlbGYucmVxdWVzdF92ZXJzaW9uCisgICAgICAgIGVudlsnUkVRVUVTVF9NRVRIT0QnXSA9IHNlbGYuY29tbWFuZAorICAgICAgICBpZiAnPycgaW4gc2VsZi5wYXRoOgorICAgICAgICAgICAgcGF0aCxxdWVyeSA9IHNlbGYucGF0aC5zcGxpdCgnPycsMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGgscXVlcnkgPSBzZWxmLnBhdGgsJycKKworICAgICAgICBlbnZbJ1BBVEhfSU5GTyddID0gdXJsbGliLnVucXVvdGUocGF0aCkKKyAgICAgICAgZW52WydRVUVSWV9TVFJJTkcnXSA9IHF1ZXJ5CisKKyAgICAgICAgaG9zdCA9IHNlbGYuYWRkcmVzc19zdHJpbmcoKQorICAgICAgICBpZiBob3N0ICE9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF06CisgICAgICAgICAgICBlbnZbJ1JFTU9URV9IT1NUJ10gPSBob3N0CisgICAgICAgIGVudlsnUkVNT1RFX0FERFInXSA9IHNlbGYuY2xpZW50X2FkZHJlc3NbMF0KKworICAgICAgICBpZiBzZWxmLmhlYWRlcnMudHlwZWhlYWRlciBpcyBOb25lOgorICAgICAgICAgICAgZW52WydDT05URU5UX1RZUEUnXSA9IHNlbGYuaGVhZGVycy50eXBlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnZbJ0NPTlRFTlRfVFlQRSddID0gc2VsZi5oZWFkZXJzLnR5cGVoZWFkZXIKKworICAgICAgICBsZW5ndGggPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCdjb250ZW50LWxlbmd0aCcpCisgICAgICAgIGlmIGxlbmd0aDoKKyAgICAgICAgICAgIGVudlsnQ09OVEVOVF9MRU5HVEgnXSA9IGxlbmd0aAorCisgICAgICAgIGZvciBoIGluIHNlbGYuaGVhZGVycy5oZWFkZXJzOgorICAgICAgICAgICAgayx2ID0gaC5zcGxpdCgnOicsMSkKKyAgICAgICAgICAgIGs9ay5yZXBsYWNlKCctJywnXycpLnVwcGVyKCk7IHY9di5zdHJpcCgpCisgICAgICAgICAgICBpZiBrIGluIGVudjoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAgICAgICAgICAgICAgICAgIyBza2lwIGNvbnRlbnQgbGVuZ3RoLCB0eXBlLGV0Yy4KKyAgICAgICAgICAgIGlmICdIVFRQXycrayBpbiBlbnY6CisgICAgICAgICAgICAgICAgZW52WydIVFRQXycra10gKz0gJywnK3YgICAgICMgY29tbWEtc2VwYXJhdGUgbXVsdGlwbGUgaGVhZGVycworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBlbnZbJ0hUVFBfJytrXSA9IHYKKyAgICAgICAgcmV0dXJuIGVudgorCisgICAgZGVmIGdldF9zdGRlcnIoc2VsZik6CisgICAgICAgIHJldHVybiBzeXMuc3RkZXJyCisKKyAgICBkZWYgaGFuZGxlKHNlbGYpOgorICAgICAgICAiIiJIYW5kbGUgYSBzaW5nbGUgSFRUUCByZXF1ZXN0IiIiCisKKyAgICAgICAgc2VsZi5yYXdfcmVxdWVzdGxpbmUgPSBzZWxmLnJmaWxlLnJlYWRsaW5lKCkKKyAgICAgICAgaWYgbm90IHNlbGYucGFyc2VfcmVxdWVzdCgpOiAjIEFuIGVycm9yIGNvZGUgaGFzIGJlZW4gc2VudCwganVzdCBleGl0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBoYW5kbGVyID0gU2VydmVySGFuZGxlcigKKyAgICAgICAgICAgIHNlbGYucmZpbGUsIHNlbGYud2ZpbGUsIHNlbGYuZ2V0X3N0ZGVycigpLCBzZWxmLmdldF9lbnZpcm9uKCkKKyAgICAgICAgKQorICAgICAgICBoYW5kbGVyLnJlcXVlc3RfaGFuZGxlciA9IHNlbGYgICAgICAjIGJhY2twb2ludGVyIGZvciBsb2dnaW5nCisgICAgICAgIGhhbmRsZXIucnVuKHNlbGYuc2VydmVyLmdldF9hcHAoKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgZGVtb19hcHAoZW52aXJvbixzdGFydF9yZXNwb25zZSk6CisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBzdGRvdXQgPSBTdHJpbmdJTygpCisgICAgcHJpbnQgPj5zdGRvdXQsICJIZWxsbyB3b3JsZCEiCisgICAgcHJpbnQgPj5zdGRvdXQKKyAgICBoID0gZW52aXJvbi5pdGVtcygpOyBoLnNvcnQoKQorICAgIGZvciBrLHYgaW4gaDoKKyAgICAgICAgcHJpbnQgPj5zdGRvdXQsIGssJz0nLGB2YAorICAgIHN0YXJ0X3Jlc3BvbnNlKCIyMDAgT0siLCBbKCdDb250ZW50LVR5cGUnLCd0ZXh0L3BsYWluJyldKQorICAgIHJldHVybiBbc3Rkb3V0LmdldHZhbHVlKCldCisKKworZGVmIG1ha2Vfc2VydmVyKAorICAgIGhvc3QsIHBvcnQsIGFwcCwgc2VydmVyX2NsYXNzPVdTR0lTZXJ2ZXIsIGhhbmRsZXJfY2xhc3M9V1NHSVJlcXVlc3RIYW5kbGVyCispOgorICAgICIiIkNyZWF0ZSBhIG5ldyBXU0dJIHNlcnZlciBsaXN0ZW5pbmcgb24gYGhvc3RgIGFuZCBgcG9ydGAgZm9yIGBhcHBgIiIiCisgICAgc2VydmVyID0gc2VydmVyX2NsYXNzKChob3N0LCBwb3J0KSwgaGFuZGxlcl9jbGFzcykKKyAgICBzZXJ2ZXIuc2V0X2FwcChhcHApCisgICAgcmV0dXJuIHNlcnZlcgorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgaHR0cGQgPSBtYWtlX3NlcnZlcignJywgODAwMCwgZGVtb19hcHApCisgICAgc2EgPSBodHRwZC5zb2NrZXQuZ2V0c29ja25hbWUoKQorICAgIHByaW50ICJTZXJ2aW5nIEhUVFAgb24iLCBzYVswXSwgInBvcnQiLCBzYVsxXSwgIi4uLiIKKyAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgIHdlYmJyb3dzZXIub3BlbignaHR0cDovL2xvY2FsaG9zdDo4MDAwL3h5ej9hYmMnKQorICAgIGh0dHBkLmhhbmRsZV9yZXF1ZXN0KCkgICMgc2VydmUgb25lIHJlcXVlc3QsIHRoZW4gZXhpdAorCisKKworCisKKworCisKKworCisKKworIwpkaWZmIC0tZ2l0IGEvTGliL3dzZ2lyZWYvdXRpbC5weSBiL0xpYi93c2dpcmVmL3V0aWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAwOWI4NwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi93c2dpcmVmL3V0aWwucHkKQEAgLTAsMCArMSwyMDUgQEAKKyIiIk1pc2NlbGxhbmVvdXMgV1NHSS1yZWxhdGVkIFV0aWxpdGllcyIiIgorCitpbXBvcnQgcG9zaXhwYXRoCisKK19fYWxsX18gPSBbCisgICAgJ0ZpbGVXcmFwcGVyJywgJ2d1ZXNzX3NjaGVtZScsICdhcHBsaWNhdGlvbl91cmknLCAncmVxdWVzdF91cmknLAorICAgICdzaGlmdF9wYXRoX2luZm8nLCAnc2V0dXBfdGVzdGluZ19kZWZhdWx0cycsCitdCisKKworY2xhc3MgRmlsZVdyYXBwZXI6CisgICAgIiIiV3JhcHBlciB0byBjb252ZXJ0IGZpbGUtbGlrZSBvYmplY3RzIHRvIGl0ZXJhYmxlcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGVsaWtlLCBibGtzaXplPTgxOTIpOgorICAgICAgICBzZWxmLmZpbGVsaWtlID0gZmlsZWxpa2UKKyAgICAgICAgc2VsZi5ibGtzaXplID0gYmxrc2l6ZQorICAgICAgICBpZiBoYXNhdHRyKGZpbGVsaWtlLCdjbG9zZScpOgorICAgICAgICAgICAgc2VsZi5jbG9zZSA9IGZpbGVsaWtlLmNsb3NlCisKKyAgICBkZWYgX19nZXRpdGVtX18oc2VsZixrZXkpOgorICAgICAgICBkYXRhID0gc2VsZi5maWxlbGlrZS5yZWFkKHNlbGYuYmxrc2l6ZSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBuZXh0KHNlbGYpOgorICAgICAgICBkYXRhID0gc2VsZi5maWxlbGlrZS5yZWFkKHNlbGYuYmxrc2l6ZSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIHJldHVybiBkYXRhCisgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24KKworCisKKworCisKKworCitkZWYgZ3Vlc3Nfc2NoZW1lKGVudmlyb24pOgorICAgICIiIlJldHVybiBhIGd1ZXNzIGZvciB3aGV0aGVyICd3c2dpLnVybF9zY2hlbWUnIHNob3VsZCBiZSAnaHR0cCcgb3IgJ2h0dHBzJworICAgICIiIgorICAgIGlmIGVudmlyb24uZ2V0KCJIVFRQUyIpIGluICgneWVzJywnb24nLCcxJyk6CisgICAgICAgIHJldHVybiAnaHR0cHMnCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuICdodHRwJworCitkZWYgYXBwbGljYXRpb25fdXJpKGVudmlyb24pOgorICAgICIiIlJldHVybiB0aGUgYXBwbGljYXRpb24ncyBiYXNlIFVSSSAobm8gUEFUSF9JTkZPIG9yIFFVRVJZX1NUUklORykiIiIKKyAgICB1cmwgPSBlbnZpcm9uWyd3c2dpLnVybF9zY2hlbWUnXSsnOi8vJworICAgIGZyb20gdXJsbGliIGltcG9ydCBxdW90ZQorCisgICAgaWYgZW52aXJvbi5nZXQoJ0hUVFBfSE9TVCcpOgorICAgICAgICB1cmwgKz0gZW52aXJvblsnSFRUUF9IT1NUJ10KKyAgICBlbHNlOgorICAgICAgICB1cmwgKz0gZW52aXJvblsnU0VSVkVSX05BTUUnXQorCisgICAgICAgIGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddID09ICdodHRwcyc6CisgICAgICAgICAgICBpZiBlbnZpcm9uWydTRVJWRVJfUE9SVCddICE9ICc0NDMnOgorICAgICAgICAgICAgICAgIHVybCArPSAnOicgKyBlbnZpcm9uWydTRVJWRVJfUE9SVCddCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBlbnZpcm9uWydTRVJWRVJfUE9SVCddICE9ICc4MCc6CisgICAgICAgICAgICAgICAgdXJsICs9ICc6JyArIGVudmlyb25bJ1NFUlZFUl9QT1JUJ10KKworICAgIHVybCArPSBxdW90ZShlbnZpcm9uLmdldCgnU0NSSVBUX05BTUUnKSBvciAnLycpCisgICAgcmV0dXJuIHVybAorCitkZWYgcmVxdWVzdF91cmkoZW52aXJvbiwgaW5jbHVkZV9xdWVyeT0xKToKKyAgICAiIiJSZXR1cm4gdGhlIGZ1bGwgcmVxdWVzdCBVUkksIG9wdGlvbmFsbHkgaW5jbHVkaW5nIHRoZSBxdWVyeSBzdHJpbmciIiIKKyAgICB1cmwgPSBhcHBsaWNhdGlvbl91cmkoZW52aXJvbikKKyAgICBmcm9tIHVybGxpYiBpbXBvcnQgcXVvdGUKKyAgICBwYXRoX2luZm8gPSBxdW90ZShlbnZpcm9uLmdldCgnUEFUSF9JTkZPJywnJykpCisgICAgaWYgbm90IGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpOgorICAgICAgICB1cmwgKz0gcGF0aF9pbmZvWzE6XQorICAgIGVsc2U6CisgICAgICAgIHVybCArPSBwYXRoX2luZm8KKyAgICBpZiBpbmNsdWRlX3F1ZXJ5IGFuZCBlbnZpcm9uLmdldCgnUVVFUllfU1RSSU5HJyk6CisgICAgICAgIHVybCArPSAnPycgKyBlbnZpcm9uWydRVUVSWV9TVFJJTkcnXQorICAgIHJldHVybiB1cmwKKworZGVmIHNoaWZ0X3BhdGhfaW5mbyhlbnZpcm9uKToKKyAgICAiIiJTaGlmdCBhIG5hbWUgZnJvbSBQQVRIX0lORk8gdG8gU0NSSVBUX05BTUUsIHJldHVybmluZyBpdAorCisgICAgSWYgdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBwYXRoIHNlZ21lbnRzIGluIFBBVEhfSU5GTywgcmV0dXJuIE5vbmUuCisgICAgTm90ZTogJ2Vudmlyb24nIGlzIG1vZGlmaWVkIGluLXBsYWNlOyB1c2UgYSBjb3B5IGlmIHlvdSBuZWVkIHRvIGtlZXAKKyAgICB0aGUgb3JpZ2luYWwgUEFUSF9JTkZPIG9yIFNDUklQVF9OQU1FLgorCisgICAgTm90ZTogd2hlbiBQQVRIX0lORk8gaXMganVzdCBhICcvJywgdGhpcyByZXR1cm5zICcnIGFuZCBhcHBlbmRzIGEgdHJhaWxpbmcKKyAgICAnLycgdG8gU0NSSVBUX05BTUUsIGV2ZW4gdGhvdWdoIGVtcHR5IHBhdGggc2VnbWVudHMgYXJlIG5vcm1hbGx5IGlnbm9yZWQsCisgICAgYW5kIFNDUklQVF9OQU1FIGRvZXNuJ3Qgbm9ybWFsbHkgZW5kIGluIGEgJy8nLiAgVGhpcyBpcyBpbnRlbnRpb25hbAorICAgIGJlaGF2aW9yLCB0byBlbnN1cmUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gdGVsbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuCisgICAgJy94JyBhbmQgJy94Lycgd2hlbiB0cmF2ZXJzaW5nIHRvIG9iamVjdHMuCisgICAgIiIiCisgICAgcGF0aF9pbmZvID0gZW52aXJvbi5nZXQoJ1BBVEhfSU5GTycsJycpCisgICAgaWYgbm90IHBhdGhfaW5mbzoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHBhdGhfcGFydHMgPSBwYXRoX2luZm8uc3BsaXQoJy8nKQorICAgIHBhdGhfcGFydHNbMTotMV0gPSBbcCBmb3IgcCBpbiBwYXRoX3BhcnRzWzE6LTFdIGlmIHAgYW5kIHA8PicuJ10KKyAgICBuYW1lID0gcGF0aF9wYXJ0c1sxXQorICAgIGRlbCBwYXRoX3BhcnRzWzFdCisKKyAgICBzY3JpcHRfbmFtZSA9IGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScsJycpCisgICAgc2NyaXB0X25hbWUgPSBwb3NpeHBhdGgubm9ybXBhdGgoc2NyaXB0X25hbWUrJy8nK25hbWUpCisgICAgaWYgc2NyaXB0X25hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgc2NyaXB0X25hbWUgPSBzY3JpcHRfbmFtZVs6LTFdCisgICAgaWYgbm90IG5hbWUgYW5kIG5vdCBzY3JpcHRfbmFtZS5lbmRzd2l0aCgnLycpOgorICAgICAgICBzY3JpcHRfbmFtZSArPSAnLycKKworICAgIGVudmlyb25bJ1NDUklQVF9OQU1FJ10gPSBzY3JpcHRfbmFtZQorICAgIGVudmlyb25bJ1BBVEhfSU5GTyddICAgPSAnLycuam9pbihwYXRoX3BhcnRzKQorCisgICAgIyBTcGVjaWFsIGNhc2U6ICcvLicgb24gUEFUSF9JTkZPIGRvZXNuJ3QgZ2V0IHN0cmlwcGVkLAorICAgICMgYmVjYXVzZSB3ZSBkb24ndCBzdHJpcCB0aGUgbGFzdCBlbGVtZW50IG9mIFBBVEhfSU5GTworICAgICMgaWYgdGhlcmUncyBvbmx5IG9uZSBwYXRoIHBhcnQgbGVmdC4gIEluc3RlYWQgb2YgZml4aW5nIHRoaXMKKyAgICAjIGFib3ZlLCB3ZSBmaXggaXQgaGVyZSBzbyB0aGF0IFBBVEhfSU5GTyBnZXRzIG5vcm1hbGl6ZWQgdG8KKyAgICAjIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgZW52aXJvbi4KKyAgICBpZiBuYW1lPT0nLic6CisgICAgICAgIG5hbWUgPSBOb25lCisgICAgcmV0dXJuIG5hbWUKKworZGVmIHNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52aXJvbik6CisgICAgIiIiVXBkYXRlICdlbnZpcm9uJyB3aXRoIHRyaXZpYWwgZGVmYXVsdHMgZm9yIHRlc3RpbmcgcHVycG9zZXMKKworICAgIFRoaXMgYWRkcyB2YXJpb3VzIHBhcmFtZXRlcnMgcmVxdWlyZWQgZm9yIFdTR0ksIGluY2x1ZGluZyBIVFRQX0hPU1QsCisgICAgU0VSVkVSX05BTUUsIFNFUlZFUl9QT1JULCBSRVFVRVNUX01FVEhPRCwgU0NSSVBUX05BTUUsIFBBVEhfSU5GTywKKyAgICBhbmQgYWxsIG9mIHRoZSB3c2dpLiogdmFyaWFibGVzLiAgSXQgb25seSBzdXBwbGllcyBkZWZhdWx0IHZhbHVlcywKKyAgICBhbmQgZG9lcyBub3QgcmVwbGFjZSBhbnkgZXhpc3Rpbmcgc2V0dGluZ3MgZm9yIHRoZXNlIHZhcmlhYmxlcy4KKworICAgIFRoaXMgcm91dGluZSBpcyBpbnRlbmRlZCB0byBtYWtlIGl0IGVhc2llciBmb3IgdW5pdCB0ZXN0cyBvZiBXU0dJCisgICAgc2VydmVycyBhbmQgYXBwbGljYXRpb25zIHRvIHNldCB1cCBkdW1teSBlbnZpcm9ubWVudHMuICBJdCBzaG91bGQgKm5vdCoKKyAgICBiZSB1c2VkIGJ5IGFjdHVhbCBXU0dJIHNlcnZlcnMgb3IgYXBwbGljYXRpb25zLCBzaW5jZSB0aGUgZGF0YSBpcyBmYWtlIQorICAgICIiIgorCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTRVJWRVJfTkFNRScsJzEyNy4wLjAuMScpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdTRVJWRVJfUFJPVE9DT0wnLCdIVFRQLzEuMCcpCisKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ0hUVFBfSE9TVCcsZW52aXJvblsnU0VSVkVSX05BTUUnXSkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1JFUVVFU1RfTUVUSE9EJywnR0VUJykKKworICAgIGlmICdTQ1JJUFRfTkFNRScgbm90IGluIGVudmlyb24gYW5kICdQQVRIX0lORk8nIG5vdCBpbiBlbnZpcm9uOgorICAgICAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ1NDUklQVF9OQU1FJywnJykKKyAgICAgICAgZW52aXJvbi5zZXRkZWZhdWx0KCdQQVRIX0lORk8nLCcvJykKKworICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS52ZXJzaW9uJywgKDEsMCkpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLnJ1bl9vbmNlJywgMCkKKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kubXVsdGl0aHJlYWQnLCAwKQorICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnd3NnaS5tdWx0aXByb2Nlc3MnLCAwKQorCisgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KKyAgICBlbnZpcm9uLnNldGRlZmF1bHQoJ3dzZ2kuaW5wdXQnLCBTdHJpbmdJTygiIikpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLmVycm9ycycsIFN0cmluZ0lPKCkpCisgICAgZW52aXJvbi5zZXRkZWZhdWx0KCd3c2dpLnVybF9zY2hlbWUnLGd1ZXNzX3NjaGVtZShlbnZpcm9uKSkKKworICAgIGlmIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddPT0naHR0cCc6CisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BPUlQnLCAnODAnKQorICAgIGVsaWYgZW52aXJvblsnd3NnaS51cmxfc2NoZW1lJ109PSdodHRwcyc6CisgICAgICAgIGVudmlyb24uc2V0ZGVmYXVsdCgnU0VSVkVSX1BPUlQnLCAnNDQzJykKKworCisKKworX2hvcHBpc2ggPSB7CisgICAgJ2Nvbm5lY3Rpb24nOjEsICdrZWVwLWFsaXZlJzoxLCAncHJveHktYXV0aGVudGljYXRlJzoxLAorICAgICdwcm94eS1hdXRob3JpemF0aW9uJzoxLCAndGUnOjEsICd0cmFpbGVycyc6MSwgJ3RyYW5zZmVyLWVuY29kaW5nJzoxLAorICAgICd1cGdyYWRlJzoxCit9Lmhhc19rZXkKKworZGVmIGlzX2hvcF9ieV9ob3AoaGVhZGVyX25hbWUpOgorICAgICIiIlJldHVybiB0cnVlIGlmICdoZWFkZXJfbmFtZScgaXMgYW4gSFRUUC8xLjEgIkhvcC1ieS1Ib3AiIGhlYWRlciIiIgorICAgIHJldHVybiBfaG9wcGlzaChoZWFkZXJfbmFtZS5sb3dlcigpKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisjCmRpZmYgLS1naXQgYS9MaWIvd3NnaXJlZi92YWxpZGF0ZS5weSBiL0xpYi93c2dpcmVmL3ZhbGlkYXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYWI5ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvd3NnaXJlZi92YWxpZGF0ZS5weQpAQCAtMCwwICsxLDQzMiBAQAorIyAoYykgMjAwNSBJYW4gQmlja2luZyBhbmQgY29udHJpYnV0b3JzOyB3cml0dGVuIGZvciBQYXN0ZSAoaHR0cDovL3B5dGhvbnBhc3RlLm9yZykKKyMgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocAorIyBBbHNvIGxpY2VuY2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgMi4wOiBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYXBhY2hlMi4wLnBocAorIyBMaWNlbnNlZCB0byBQU0YgdW5kZXIgYSBDb250cmlidXRvciBBZ3JlZW1lbnQKKyIiIgorTWlkZGxld2FyZSB0byBjaGVjayBmb3Igb2JlZGllbmNlIHRvIHRoZSBXU0dJIHNwZWNpZmljYXRpb24uCisKK1NvbWUgb2YgdGhlIHRoaW5ncyB0aGlzIGNoZWNrczoKKworKiBTaWduYXR1cmUgb2YgdGhlIGFwcGxpY2F0aW9uIGFuZCBzdGFydF9yZXNwb25zZSAoaW5jbHVkaW5nIHRoYXQKKyAga2V5d29yZCBhcmd1bWVudHMgYXJlIG5vdCB1c2VkKS4KKworKiBFbnZpcm9ubWVudCBjaGVja3M6CisKKyAgLSBFbnZpcm9ubWVudCBpcyBhIGRpY3Rpb25hcnkgKGFuZCBub3QgYSBzdWJjbGFzcykuCisKKyAgLSBUaGF0IGFsbCB0aGUgcmVxdWlyZWQga2V5cyBhcmUgaW4gdGhlIGVudmlyb25tZW50OiBSRVFVRVNUX01FVEhPRCwKKyAgICBTRVJWRVJfTkFNRSwgU0VSVkVSX1BPUlQsIHdzZ2kudmVyc2lvbiwgd3NnaS5pbnB1dCwgd3NnaS5lcnJvcnMsCisgICAgd3NnaS5tdWx0aXRocmVhZCwgd3NnaS5tdWx0aXByb2Nlc3MsIHdzZ2kucnVuX29uY2UKKworICAtIFRoYXQgSFRUUF9DT05URU5UX1RZUEUgYW5kIEhUVFBfQ09OVEVOVF9MRU5HVEggYXJlIG5vdCBpbiB0aGUKKyAgICBlbnZpcm9ubWVudCAodGhlc2UgaGVhZGVycyBzaG91bGQgYXBwZWFyIGFzIENPTlRFTlRfTEVOR1RIIGFuZAorICAgIENPTlRFTlRfVFlQRSkuCisKKyAgLSBXYXJucyBpZiBRVUVSWV9TVFJJTkcgaXMgbWlzc2luZywgYXMgdGhlIGNnaSBtb2R1bGUgYWN0cworICAgIHVucHJlZGljdGFibHkgaW4gdGhhdCBjYXNlLgorCisgIC0gVGhhdCBDR0ktc3R5bGUgdmFyaWFibGVzICh0aGF0IGRvbid0IGNvbnRhaW4gYSAuKSBoYXZlCisgICAgKG5vbi11bmljb2RlKSBzdHJpbmcgdmFsdWVzCisKKyAgLSBUaGF0IHdzZ2kudmVyc2lvbiBpcyBhIHR1cGxlCisKKyAgLSBUaGF0IHdzZ2kudXJsX3NjaGVtZSBpcyAnaHR0cCcgb3IgJ2h0dHBzJyAoQEA6IGlzIHRoaXMgdG9vCisgICAgcmVzdHJpY3RpdmU/KQorCisgIC0gV2FybnMgaWYgdGhlIFJFUVVFU1RfTUVUSE9EIGlzIG5vdCBrbm93biAoQEA6IHByb2JhYmx5IHRvbworICAgIHJlc3RyaWN0aXZlKS4KKworICAtIFRoYXQgU0NSSVBUX05BTUUgYW5kIFBBVEhfSU5GTyBhcmUgZW1wdHkgb3Igc3RhcnQgd2l0aCAvCisKKyAgLSBUaGF0IGF0IGxlYXN0IG9uZSBvZiBTQ1JJUFRfTkFNRSBvciBQQVRIX0lORk8gYXJlIHNldC4KKworICAtIFRoYXQgQ09OVEVOVF9MRU5HVEggaXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLgorCisgIC0gVGhhdCBTQ1JJUFRfTkFNRSBpcyBub3QgJy8nIChpdCBzaG91bGQgYmUgJycsIGFuZCBQQVRIX0lORk8gc2hvdWxkCisgICAgYmUgJy8nKS4KKworICAtIFRoYXQgd3NnaS5pbnB1dCBoYXMgdGhlIG1ldGhvZHMgcmVhZCwgcmVhZGxpbmUsIHJlYWRsaW5lcywgYW5kCisgICAgX19pdGVyX18KKworICAtIFRoYXQgd3NnaS5lcnJvcnMgaGFzIHRoZSBtZXRob2RzIGZsdXNoLCB3cml0ZSwgd3JpdGVsaW5lcworCisqIFRoZSBzdGF0dXMgaXMgYSBzdHJpbmcsIGNvbnRhaW5zIGEgc3BhY2UsIHN0YXJ0cyB3aXRoIGFuIGludGVnZXIsCisgIGFuZCB0aGF0IGludGVnZXIgaXMgaW4gcmFuZ2UgKD4gMTAwKS4KKworKiBUaGF0IHRoZSBoZWFkZXJzIGlzIGEgbGlzdCAobm90IGEgc3ViY2xhc3MsIG5vdCBhbm90aGVyIGtpbmQgb2YKKyAgc2VxdWVuY2UpLgorCisqIFRoYXQgdGhlIGl0ZW1zIG9mIHRoZSBoZWFkZXJzIGFyZSB0dXBsZXMgb2Ygc3RyaW5ncy4KKworKiBUaGF0IHRoZXJlIGlzIG5vICdzdGF0dXMnIGhlYWRlciAodGhhdCBpcyB1c2VkIGluIENHSSwgYnV0IG5vdCBpbgorICBXU0dJKS4KKworKiBUaGF0IHRoZSBoZWFkZXJzIGRvbid0IGNvbnRhaW4gbmV3bGluZXMgb3IgY29sb25zLCBlbmQgaW4gXyBvciAtLCBvcgorICBjb250YWluIGNoYXJhY3RlcnMgY29kZXMgYmVsb3cgMDM3LgorCisqIFRoYXQgQ29udGVudC1UeXBlIGlzIGdpdmVuIGlmIHRoZXJlIGlzIGNvbnRlbnQgKENHSSBvZnRlbiBoYXMgYQorICBkZWZhdWx0IGNvbnRlbnQgdHlwZSwgYnV0IFdTR0kgZG9lcyBub3QpLgorCisqIFRoYXQgbm8gQ29udGVudC1UeXBlIGlzIGdpdmVuIHdoZW4gdGhlcmUgaXMgbm8gY29udGVudCAoQEA6IGlzIHRoaXMKKyAgdG9vIHJlc3RyaWN0aXZlPykKKworKiBUaGF0IHRoZSBleGNfaW5mbyBhcmd1bWVudCB0byBzdGFydF9yZXNwb25zZSBpcyBhIHR1cGxlIG9yIE5vbmUuCisKKyogVGhhdCBhbGwgY2FsbHMgdG8gdGhlIHdyaXRlciBhcmUgd2l0aCBzdHJpbmdzLCBhbmQgbm8gb3RoZXIgbWV0aG9kcworICBvbiB0aGUgd3JpdGVyIGFyZSBhY2Nlc3NlZC4KKworKiBUaGF0IHdzZ2kuaW5wdXQgaXMgdXNlZCBwcm9wZXJseToKKworICAtIC5yZWFkKCkgaXMgY2FsbGVkIHdpdGggemVybyBvciBvbmUgYXJndW1lbnQKKworICAtIFRoYXQgaXQgcmV0dXJucyBhIHN0cmluZworCisgIC0gVGhhdCByZWFkbGluZSwgcmVhZGxpbmVzLCBhbmQgX19pdGVyX18gcmV0dXJuIHN0cmluZ3MKKworICAtIFRoYXQgLmNsb3NlKCkgaXMgbm90IGNhbGxlZAorCisgIC0gTm8gb3RoZXIgbWV0aG9kcyBhcmUgcHJvdmlkZWQKKworKiBUaGF0IHdzZ2kuZXJyb3JzIGlzIHVzZWQgcHJvcGVybHk6CisKKyAgLSAud3JpdGUoKSBhbmQgLndyaXRlbGluZXMoKSBpcyBjYWxsZWQgd2l0aCBhIHN0cmluZworCisgIC0gVGhhdCAuY2xvc2UoKSBpcyBub3QgY2FsbGVkLCBhbmQgbm8gb3RoZXIgbWV0aG9kcyBhcmUgcHJvdmlkZWQuCisKKyogVGhlIHJlc3BvbnNlIGl0ZXJhdG9yOgorCisgIC0gVGhhdCBpdCBpcyBub3QgYSBzdHJpbmcgKGl0IHNob3VsZCBiZSBhIGxpc3Qgb2YgYSBzaW5nbGUgc3RyaW5nOyBhCisgICAgc3RyaW5nIHdpbGwgd29yaywgYnV0IHBlcmZvcm0gaG9ycmlibHkpLgorCisgIC0gVGhhdCAubmV4dCgpIHJldHVybnMgYSBzdHJpbmcKKworICAtIFRoYXQgdGhlIGl0ZXJhdG9yIGlzIG5vdCBpdGVyYXRlZCBvdmVyIHVudGlsIHN0YXJ0X3Jlc3BvbnNlIGhhcworICAgIGJlZW4gY2FsbGVkICh0aGF0IGNhbiBzaWduYWwgZWl0aGVyIGEgc2VydmVyIG9yIGFwcGxpY2F0aW9uCisgICAgZXJyb3IpLgorCisgIC0gVGhhdCAuY2xvc2UoKSBpcyBjYWxsZWQgKGRvZXNuJ3QgcmFpc2UgZXhjZXB0aW9uLCBvbmx5IHByaW50cyB0bworICAgIHN5cy5zdGRlcnIsIGJlY2F1c2Ugd2Ugb25seSBrbm93IGl0IGlzbid0IGNhbGxlZCB3aGVuIHRoZSBvYmplY3QKKyAgICBpcyBnYXJiYWdlIGNvbGxlY3RlZCkuCisiIiIKK19fYWxsX18gPSBbJ3ZhbGlkYXRvciddCisKKworaW1wb3J0IHJlCitpbXBvcnQgc3lzCitmcm9tIHR5cGVzIGltcG9ydCBEaWN0VHlwZSwgU3RyaW5nVHlwZSwgVHVwbGVUeXBlLCBMaXN0VHlwZQoraW1wb3J0IHdhcm5pbmdzCisKK2hlYWRlcl9yZSA9IHJlLmNvbXBpbGUocideW2EtekEtWl1bYS16QS1aMC05XC1fXSokJykKK2JhZF9oZWFkZXJfdmFsdWVfcmUgPSByZS5jb21waWxlKHInW1wwMDAtXDAzN10nKQorCitjbGFzcyBXU0dJV2FybmluZyhXYXJuaW5nKToKKyAgICAiIiIKKyAgICBSYWlzZWQgaW4gcmVzcG9uc2UgdG8gV1NHSS1zcGVjLXJlbGF0ZWQgd2FybmluZ3MKKyAgICAiIiIKKworZGVmIGFzc2VydF8oY29uZCwgKmFyZ3MpOgorICAgIGlmIG5vdCBjb25kOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigqYXJncykKKworZGVmIHZhbGlkYXRvcihhcHBsaWNhdGlvbik6CisKKyAgICAiIiIKKyAgICBXaGVuIGFwcGxpZWQgYmV0d2VlbiBhIFdTR0kgc2VydmVyIGFuZCBhIFdTR0kgYXBwbGljYXRpb24sIHRoaXMKKyAgICBtaWRkbGV3YXJlIHdpbGwgY2hlY2sgZm9yIFdTR0kgY29tcGxpYW5jeSBvbiBhIG51bWJlciBvZiBsZXZlbHMuCisgICAgVGhpcyBtaWRkbGV3YXJlIGRvZXMgbm90IG1vZGlmeSB0aGUgcmVxdWVzdCBvciByZXNwb25zZSBpbiBhbnkKKyAgICB3YXksIGJ1dCB3aWxsIHRocm93IGFuIEFzc2VydGlvbkVycm9yIGlmIGFueXRoaW5nIHNlZW1zIG9mZgorICAgIChleGNlcHQgZm9yIGEgZmFpbHVyZSB0byBjbG9zZSB0aGUgYXBwbGljYXRpb24gaXRlcmF0b3IsIHdoaWNoCisgICAgd2lsbCBiZSBwcmludGVkIHRvIHN0ZGVyciAtLSB0aGVyZSdzIG5vIHdheSB0byB0aHJvdyBhbiBleGNlcHRpb24KKyAgICBhdCB0aGF0IHBvaW50KS4KKyAgICAiIiIKKworICAgIGRlZiBsaW50X2FwcCgqYXJncywgKiprdyk6CisgICAgICAgIGFzc2VydF8obGVuKGFyZ3MpID09IDIsICJUd28gYXJndW1lbnRzIHJlcXVpcmVkIikKKyAgICAgICAgYXNzZXJ0Xyhub3Qga3csICJObyBrZXl3b3JkIGFyZ3VtZW50cyBhbGxvd2VkIikKKyAgICAgICAgZW52aXJvbiwgc3RhcnRfcmVzcG9uc2UgPSBhcmdzCisKKyAgICAgICAgY2hlY2tfZW52aXJvbihlbnZpcm9uKQorCisgICAgICAgICMgV2UgdXNlIHRoaXMgdG8gY2hlY2sgaWYgdGhlIGFwcGxpY2F0aW9uIHJldHVybnMgd2l0aG91dAorICAgICAgICAjIGNhbGxpbmcgc3RhcnRfcmVzcG9uc2U6CisgICAgICAgIHN0YXJ0X3Jlc3BvbnNlX3N0YXJ0ZWQgPSBbXQorCisgICAgICAgIGRlZiBzdGFydF9yZXNwb25zZV93cmFwcGVyKCphcmdzLCAqKmt3KToKKyAgICAgICAgICAgIGFzc2VydF8obGVuKGFyZ3MpID09IDIgb3IgbGVuKGFyZ3MpID09IDMsICgKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBudW1iZXIgb2YgYXJndW1lbnRzOiAlcyIgJSAoYXJncywpKSkKKyAgICAgICAgICAgIGFzc2VydF8obm90IGt3LCAiTm8ga2V5d29yZCBhcmd1bWVudHMgYWxsb3dlZCIpCisgICAgICAgICAgICBzdGF0dXMgPSBhcmdzWzBdCisgICAgICAgICAgICBoZWFkZXJzID0gYXJnc1sxXQorICAgICAgICAgICAgaWYgbGVuKGFyZ3MpID09IDM6CisgICAgICAgICAgICAgICAgZXhjX2luZm8gPSBhcmdzWzJdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4Y19pbmZvID0gTm9uZQorCisgICAgICAgICAgICBjaGVja19zdGF0dXMoc3RhdHVzKQorICAgICAgICAgICAgY2hlY2tfaGVhZGVycyhoZWFkZXJzKQorICAgICAgICAgICAgY2hlY2tfY29udGVudF90eXBlKHN0YXR1cywgaGVhZGVycykKKyAgICAgICAgICAgIGNoZWNrX2V4Y19pbmZvKGV4Y19pbmZvKQorCisgICAgICAgICAgICBzdGFydF9yZXNwb25zZV9zdGFydGVkLmFwcGVuZChOb25lKQorICAgICAgICAgICAgcmV0dXJuIFdyaXRlV3JhcHBlcihzdGFydF9yZXNwb25zZSgqYXJncykpCisKKyAgICAgICAgZW52aXJvblsnd3NnaS5pbnB1dCddID0gSW5wdXRXcmFwcGVyKGVudmlyb25bJ3dzZ2kuaW5wdXQnXSkKKyAgICAgICAgZW52aXJvblsnd3NnaS5lcnJvcnMnXSA9IEVycm9yV3JhcHBlcihlbnZpcm9uWyd3c2dpLmVycm9ycyddKQorCisgICAgICAgIGl0ZXJhdG9yID0gYXBwbGljYXRpb24oZW52aXJvbiwgc3RhcnRfcmVzcG9uc2Vfd3JhcHBlcikKKyAgICAgICAgYXNzZXJ0XyhpdGVyYXRvciBpcyBub3QgTm9uZSBhbmQgaXRlcmF0b3IgIT0gRmFsc2UsCisgICAgICAgICAgICAiVGhlIGFwcGxpY2F0aW9uIG11c3QgcmV0dXJuIGFuIGl0ZXJhdG9yLCBpZiBvbmx5IGFuIGVtcHR5IGxpc3QiKQorCisgICAgICAgIGNoZWNrX2l0ZXJhdG9yKGl0ZXJhdG9yKQorCisgICAgICAgIHJldHVybiBJdGVyYXRvcldyYXBwZXIoaXRlcmF0b3IsIHN0YXJ0X3Jlc3BvbnNlX3N0YXJ0ZWQpCisKKyAgICByZXR1cm4gbGludF9hcHAKKworY2xhc3MgSW5wdXRXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzZ2lfaW5wdXQpOgorICAgICAgICBzZWxmLmlucHV0ID0gd3NnaV9pbnB1dAorCisgICAgZGVmIHJlYWQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBhc3NlcnRfKGxlbihhcmdzKSA8PSAxKQorICAgICAgICB2ID0gc2VsZi5pbnB1dC5yZWFkKCphcmdzKQorICAgICAgICBhc3NlcnRfKHR5cGUodikgaXMgdHlwZSgiIikpCisgICAgICAgIHJldHVybiB2CisKKyAgICBkZWYgcmVhZGxpbmUoc2VsZik6CisgICAgICAgIHYgPSBzZWxmLmlucHV0LnJlYWRsaW5lKCkKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHYpIGlzIHR5cGUoIiIpKQorICAgICAgICByZXR1cm4gdgorCisgICAgZGVmIHJlYWRsaW5lcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGFzc2VydF8obGVuKGFyZ3MpIDw9IDEpCisgICAgICAgIGxpbmVzID0gc2VsZi5pbnB1dC5yZWFkbGluZXMoKmFyZ3MpCisgICAgICAgIGFzc2VydF8odHlwZShsaW5lcykgaXMgdHlwZShbXSkpCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgYXNzZXJ0Xyh0eXBlKGxpbmUpIGlzIHR5cGUoIiIpKQorICAgICAgICByZXR1cm4gbGluZXMKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIGxpbmUgPSBzZWxmLnJlYWRsaW5lKCkKKyAgICAgICAgICAgIGlmIG5vdCBsaW5lOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgeWllbGQgbGluZQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBhc3NlcnRfKDAsICJpbnB1dC5jbG9zZSgpIG11c3Qgbm90IGJlIGNhbGxlZCIpCisKK2NsYXNzIEVycm9yV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2Vycm9ycyk6CisgICAgICAgIHNlbGYuZXJyb3JzID0gd3NnaV9lcnJvcnMKKworICAgIGRlZiB3cml0ZShzZWxmLCBzKToKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHMpIGlzIHR5cGUoIiIpKQorICAgICAgICBzZWxmLmVycm9ycy53cml0ZShzKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLmVycm9ycy5mbHVzaCgpCisKKyAgICBkZWYgd3JpdGVsaW5lcyhzZWxmLCBzZXEpOgorICAgICAgICBmb3IgbGluZSBpbiBzZXE6CisgICAgICAgICAgICBzZWxmLndyaXRlKGxpbmUpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGFzc2VydF8oMCwgImVycm9ycy5jbG9zZSgpIG11c3Qgbm90IGJlIGNhbGxlZCIpCisKK2NsYXNzIFdyaXRlV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX3dyaXRlcik6CisgICAgICAgIHNlbGYud3JpdGVyID0gd3NnaV93cml0ZXIKKworICAgIGRlZiBfX2NhbGxfXyhzZWxmLCBzKToKKyAgICAgICAgYXNzZXJ0Xyh0eXBlKHMpIGlzIHR5cGUoIiIpKQorICAgICAgICBzZWxmLndyaXRlcihzKQorCitjbGFzcyBQYXJ0aWFsSXRlcmF0b3JXcmFwcGVyOgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHdzZ2lfaXRlcmF0b3IpOgorICAgICAgICBzZWxmLml0ZXJhdG9yID0gd3NnaV9pdGVyYXRvcgorCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAjIFdlIHdhbnQgdG8gbWFrZSBzdXJlIF9faXRlcl9fIGlzIGNhbGxlZAorICAgICAgICByZXR1cm4gSXRlcmF0b3JXcmFwcGVyKHNlbGYuaXRlcmF0b3IsIE5vbmUpCisKK2NsYXNzIEl0ZXJhdG9yV3JhcHBlcjoKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3c2dpX2l0ZXJhdG9yLCBjaGVja19zdGFydF9yZXNwb25zZSk6CisgICAgICAgIHNlbGYub3JpZ2luYWxfaXRlcmF0b3IgPSB3c2dpX2l0ZXJhdG9yCisgICAgICAgIHNlbGYuaXRlcmF0b3IgPSBpdGVyKHdzZ2lfaXRlcmF0b3IpCisgICAgICAgIHNlbGYuY2xvc2VkID0gRmFsc2UKKyAgICAgICAgc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSA9IGNoZWNrX3N0YXJ0X3Jlc3BvbnNlCisKKyAgICBkZWYgX19pdGVyX18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgYXNzZXJ0Xyhub3Qgc2VsZi5jbG9zZWQsCisgICAgICAgICAgICAiSXRlcmF0b3IgcmVhZCBhZnRlciBjbG9zZWQiKQorICAgICAgICB2ID0gc2VsZi5pdGVyYXRvci5uZXh0KCkKKyAgICAgICAgaWYgc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGFzc2VydF8oc2VsZi5jaGVja19zdGFydF9yZXNwb25zZSwKKyAgICAgICAgICAgICAgICAiVGhlIGFwcGxpY2F0aW9uIHJldHVybnMgYW5kIHdlIHN0YXJ0ZWQgaXRlcmF0aW5nIG92ZXIgaXRzIGJvZHksIGJ1dCBzdGFydF9yZXNwb25zZSBoYXMgbm90IHlldCBiZWVuIGNhbGxlZCIpCisgICAgICAgICAgICBzZWxmLmNoZWNrX3N0YXJ0X3Jlc3BvbnNlID0gTm9uZQorICAgICAgICByZXR1cm4gdgorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlZCA9IFRydWUKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLm9yaWdpbmFsX2l0ZXJhdG9yLCAnY2xvc2UnKToKKyAgICAgICAgICAgIHNlbGYub3JpZ2luYWxfaXRlcmF0b3IuY2xvc2UoKQorCisgICAgZGVmIF9fZGVsX18oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoCisgICAgICAgICAgICAgICAgIkl0ZXJhdG9yIGdhcmJhZ2UgY29sbGVjdGVkIHdpdGhvdXQgYmVpbmcgY2xvc2VkIikKKyAgICAgICAgYXNzZXJ0XyhzZWxmLmNsb3NlZCwKKyAgICAgICAgICAgICJJdGVyYXRvciBnYXJiYWdlIGNvbGxlY3RlZCB3aXRob3V0IGJlaW5nIGNsb3NlZCIpCisKK2RlZiBjaGVja19lbnZpcm9uKGVudmlyb24pOgorICAgIGFzc2VydF8odHlwZShlbnZpcm9uKSBpcyBEaWN0VHlwZSwKKyAgICAgICAgIkVudmlyb25tZW50IGlzIG5vdCBvZiB0aGUgcmlnaHQgdHlwZTogJXIgKGVudmlyb25tZW50OiAlcikiCisgICAgICAgICUgKHR5cGUoZW52aXJvbiksIGVudmlyb24pKQorCisgICAgZm9yIGtleSBpbiBbJ1JFUVVFU1RfTUVUSE9EJywgJ1NFUlZFUl9OQU1FJywgJ1NFUlZFUl9QT1JUJywKKyAgICAgICAgICAgICAgICAnd3NnaS52ZXJzaW9uJywgJ3dzZ2kuaW5wdXQnLCAnd3NnaS5lcnJvcnMnLAorICAgICAgICAgICAgICAgICd3c2dpLm11bHRpdGhyZWFkJywgJ3dzZ2kubXVsdGlwcm9jZXNzJywKKyAgICAgICAgICAgICAgICAnd3NnaS5ydW5fb25jZSddOgorICAgICAgICBhc3NlcnRfKGtleSBpbiBlbnZpcm9uLAorICAgICAgICAgICAgIkVudmlyb25tZW50IG1pc3NpbmcgcmVxdWlyZWQga2V5OiAlciIgJSAoa2V5LCkpCisKKyAgICBmb3Iga2V5IGluIFsnSFRUUF9DT05URU5UX1RZUEUnLCAnSFRUUF9DT05URU5UX0xFTkdUSCddOgorICAgICAgICBhc3NlcnRfKGtleSBub3QgaW4gZW52aXJvbiwKKyAgICAgICAgICAgICJFbnZpcm9ubWVudCBzaG91bGQgbm90IGhhdmUgdGhlIGtleTogJXMgIgorICAgICAgICAgICAgIih1c2UgJXMgaW5zdGVhZCkiICUgKGtleSwga2V5WzU6XSkpCisKKyAgICBpZiAnUVVFUllfU1RSSU5HJyBub3QgaW4gZW52aXJvbjoKKyAgICAgICAgd2FybmluZ3Mud2FybigKKyAgICAgICAgICAgICdRVUVSWV9TVFJJTkcgaXMgbm90IGluIHRoZSBXU0dJIGVudmlyb25tZW50OyB0aGUgY2dpICcKKyAgICAgICAgICAgICdtb2R1bGUgd2lsbCB1c2Ugc3lzLmFyZ3Ygd2hlbiB0aGlzIHZhcmlhYmxlIGlzIG1pc3NpbmcsICcKKyAgICAgICAgICAgICdzbyBhcHBsaWNhdGlvbiBlcnJvcnMgYXJlIG1vcmUgbGlrZWx5JywKKyAgICAgICAgICAgIFdTR0lXYXJuaW5nKQorCisgICAgZm9yIGtleSBpbiBlbnZpcm9uLmtleXMoKToKKyAgICAgICAgaWYgJy4nIGluIGtleToKKyAgICAgICAgICAgICMgRXh0ZW5zaW9uLCB3ZSBkb24ndCBjYXJlIGFib3V0IGl0cyB0eXBlCisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICBhc3NlcnRfKHR5cGUoZW52aXJvbltrZXldKSBpcyBTdHJpbmdUeXBlLAorICAgICAgICAgICAgIkVudmlyb25tZW50YWwgdmFyaWFibGUgJXMgaXMgbm90IGEgc3RyaW5nOiAlciAodmFsdWU6ICVyKSIKKyAgICAgICAgICAgICUgKGtleSwgdHlwZShlbnZpcm9uW2tleV0pLCBlbnZpcm9uW2tleV0pKQorCisgICAgYXNzZXJ0Xyh0eXBlKGVudmlyb25bJ3dzZ2kudmVyc2lvbiddKSBpcyBUdXBsZVR5cGUsCisgICAgICAgICJ3c2dpLnZlcnNpb24gc2hvdWxkIGJlIGEgdHVwbGUgKCVyKSIgJSAoZW52aXJvblsnd3NnaS52ZXJzaW9uJ10sKSkKKyAgICBhc3NlcnRfKGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddIGluICgnaHR0cCcsICdodHRwcycpLAorICAgICAgICAid3NnaS51cmxfc2NoZW1lIHVua25vd246ICVyIiAlIGVudmlyb25bJ3dzZ2kudXJsX3NjaGVtZSddKQorCisgICAgY2hlY2tfaW5wdXQoZW52aXJvblsnd3NnaS5pbnB1dCddKQorICAgIGNoZWNrX2Vycm9ycyhlbnZpcm9uWyd3c2dpLmVycm9ycyddKQorCisgICAgIyBAQDogdGhlc2UgbmVlZCBmaWxsaW5nIG91dDoKKyAgICBpZiBlbnZpcm9uWydSRVFVRVNUX01FVEhPRCddIG5vdCBpbiAoCisgICAgICAgICdHRVQnLCAnSEVBRCcsICdQT1NUJywgJ09QVElPTlMnLCdQVVQnLCdERUxFVEUnLCdUUkFDRScpOgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgIlVua25vd24gUkVRVUVTVF9NRVRIT0Q6ICVyIiAlIGVudmlyb25bJ1JFUVVFU1RfTUVUSE9EJ10sCisgICAgICAgICAgICBXU0dJV2FybmluZykKKworICAgIGFzc2VydF8obm90IGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpCisgICAgICAgICAgICBvciBlbnZpcm9uWydTQ1JJUFRfTkFNRSddLnN0YXJ0c3dpdGgoJy8nKSwKKyAgICAgICAgIlNDUklQVF9OQU1FIGRvZXNuJ3Qgc3RhcnQgd2l0aCAvOiAlciIgJSBlbnZpcm9uWydTQ1JJUFRfTkFNRSddKQorICAgIGFzc2VydF8obm90IGVudmlyb24uZ2V0KCdQQVRIX0lORk8nKQorICAgICAgICAgICAgb3IgZW52aXJvblsnUEFUSF9JTkZPJ10uc3RhcnRzd2l0aCgnLycpLAorICAgICAgICAiUEFUSF9JTkZPIGRvZXNuJ3Qgc3RhcnQgd2l0aCAvOiAlciIgJSBlbnZpcm9uWydQQVRIX0lORk8nXSkKKyAgICBpZiBlbnZpcm9uLmdldCgnQ09OVEVOVF9MRU5HVEgnKToKKyAgICAgICAgYXNzZXJ0XyhpbnQoZW52aXJvblsnQ09OVEVOVF9MRU5HVEgnXSkgPj0gMCwKKyAgICAgICAgICAgICJJbnZhbGlkIENPTlRFTlRfTEVOR1RIOiAlciIgJSBlbnZpcm9uWydDT05URU5UX0xFTkdUSCddKQorCisgICAgaWYgbm90IGVudmlyb24uZ2V0KCdTQ1JJUFRfTkFNRScpOgorICAgICAgICBhc3NlcnRfKGVudmlyb24uaGFzX2tleSgnUEFUSF9JTkZPJyksCisgICAgICAgICAgICAiT25lIG9mIFNDUklQVF9OQU1FIG9yIFBBVEhfSU5GTyBhcmUgcmVxdWlyZWQgKFBBVEhfSU5GTyAiCisgICAgICAgICAgICAic2hvdWxkIGF0IGxlYXN0IGJlICcvJyBpZiBTQ1JJUFRfTkFNRSBpcyBlbXB0eSkiKQorICAgIGFzc2VydF8oZW52aXJvbi5nZXQoJ1NDUklQVF9OQU1FJykgIT0gJy8nLAorICAgICAgICAiU0NSSVBUX05BTUUgY2Fubm90IGJlICcvJzsgaXQgc2hvdWxkIGluc3RlYWQgYmUgJycsIGFuZCAiCisgICAgICAgICJQQVRIX0lORk8gc2hvdWxkIGJlICcvJyIpCisKK2RlZiBjaGVja19pbnB1dCh3c2dpX2lucHV0KToKKyAgICBmb3IgYXR0ciBpbiBbJ3JlYWQnLCAncmVhZGxpbmUnLCAncmVhZGxpbmVzJywgJ19faXRlcl9fJ106CisgICAgICAgIGFzc2VydF8oaGFzYXR0cih3c2dpX2lucHV0LCBhdHRyKSwKKyAgICAgICAgICAgICJ3c2dpLmlucHV0ICglcikgZG9lc24ndCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXMiCisgICAgICAgICAgICAlICh3c2dpX2lucHV0LCBhdHRyKSkKKworZGVmIGNoZWNrX2Vycm9ycyh3c2dpX2Vycm9ycyk6CisgICAgZm9yIGF0dHIgaW4gWydmbHVzaCcsICd3cml0ZScsICd3cml0ZWxpbmVzJ106CisgICAgICAgIGFzc2VydF8oaGFzYXR0cih3c2dpX2Vycm9ycywgYXR0ciksCisgICAgICAgICAgICAid3NnaS5lcnJvcnMgKCVyKSBkb2Vzbid0IGhhdmUgdGhlIGF0dHJpYnV0ZSAlcyIKKyAgICAgICAgICAgICUgKHdzZ2lfZXJyb3JzLCBhdHRyKSkKKworZGVmIGNoZWNrX3N0YXR1cyhzdGF0dXMpOgorICAgIGFzc2VydF8odHlwZShzdGF0dXMpIGlzIFN0cmluZ1R5cGUsCisgICAgICAgICJTdGF0dXMgbXVzdCBiZSBhIHN0cmluZyAobm90ICVyKSIgJSBzdGF0dXMpCisgICAgIyBJbXBsaWNpdGx5IGNoZWNrIHRoYXQgd2UgY2FuIHR1cm4gaXQgaW50byBhbiBpbnRlZ2VyOgorICAgIHN0YXR1c19jb2RlID0gc3RhdHVzLnNwbGl0KE5vbmUsIDEpWzBdCisgICAgYXNzZXJ0XyhsZW4oc3RhdHVzX2NvZGUpID09IDMsCisgICAgICAgICJTdGF0dXMgY29kZXMgbXVzdCBiZSB0aHJlZSBjaGFyYWN0ZXJzOiAlciIgJSBzdGF0dXNfY29kZSkKKyAgICBzdGF0dXNfaW50ID0gaW50KHN0YXR1c19jb2RlKQorICAgIGFzc2VydF8oc3RhdHVzX2ludCA+PSAxMDAsICJTdGF0dXMgY29kZSBpcyBpbnZhbGlkOiAlciIgJSBzdGF0dXNfaW50KQorICAgIGlmIGxlbihzdGF0dXMpIDwgNCBvciBzdGF0dXNbM10gIT0gJyAnOgorICAgICAgICB3YXJuaW5ncy53YXJuKAorICAgICAgICAgICAgIlRoZSBzdGF0dXMgc3RyaW5nICglcikgc2hvdWxkIGJlIGEgdGhyZWUtZGlnaXQgaW50ZWdlciAiCisgICAgICAgICAgICAiZm9sbG93ZWQgYnkgYSBzaW5nbGUgc3BhY2UgYW5kIGEgc3RhdHVzIGV4cGxhbmF0aW9uIgorICAgICAgICAgICAgJSBzdGF0dXMsIFdTR0lXYXJuaW5nKQorCitkZWYgY2hlY2tfaGVhZGVycyhoZWFkZXJzKToKKyAgICBhc3NlcnRfKHR5cGUoaGVhZGVycykgaXMgTGlzdFR5cGUsCisgICAgICAgICJIZWFkZXJzICglcikgbXVzdCBiZSBvZiB0eXBlIGxpc3Q6ICVyIgorICAgICAgICAlIChoZWFkZXJzLCB0eXBlKGhlYWRlcnMpKSkKKyAgICBoZWFkZXJfbmFtZXMgPSB7fQorICAgIGZvciBpdGVtIGluIGhlYWRlcnM6CisgICAgICAgIGFzc2VydF8odHlwZShpdGVtKSBpcyBUdXBsZVR5cGUsCisgICAgICAgICAgICAiSW5kaXZpZHVhbCBoZWFkZXJzICglcikgbXVzdCBiZSBvZiB0eXBlIHR1cGxlOiAlciIKKyAgICAgICAgICAgICUgKGl0ZW0sIHR5cGUoaXRlbSkpKQorICAgICAgICBhc3NlcnRfKGxlbihpdGVtKSA9PSAyKQorICAgICAgICBuYW1lLCB2YWx1ZSA9IGl0ZW0KKyAgICAgICAgYXNzZXJ0XyhuYW1lLmxvd2VyKCkgIT0gJ3N0YXR1cycsCisgICAgICAgICAgICAiVGhlIFN0YXR1cyBoZWFkZXIgY2Fubm90IGJlIHVzZWQ7IGl0IGNvbmZsaWN0cyB3aXRoIENHSSAiCisgICAgICAgICAgICAic2NyaXB0LCBhbmQgSFRUUCBzdGF0dXMgaXMgbm90IGdpdmVuIHRocm91Z2ggaGVhZGVycyAiCisgICAgICAgICAgICAiKHZhbHVlOiAlcikuIiAlIHZhbHVlKQorICAgICAgICBoZWFkZXJfbmFtZXNbbmFtZS5sb3dlcigpXSA9IE5vbmUKKyAgICAgICAgYXNzZXJ0XygnXG4nIG5vdCBpbiBuYW1lIGFuZCAnOicgbm90IGluIG5hbWUsCisgICAgICAgICAgICAiSGVhZGVyIG5hbWVzIG1heSBub3QgY29udGFpbiAnOicgb3IgJ1xcbic6ICVyIiAlIG5hbWUpCisgICAgICAgIGFzc2VydF8oaGVhZGVyX3JlLnNlYXJjaChuYW1lKSwgIkJhZCBoZWFkZXIgbmFtZTogJXIiICUgbmFtZSkKKyAgICAgICAgYXNzZXJ0Xyhub3QgbmFtZS5lbmRzd2l0aCgnLScpIGFuZCBub3QgbmFtZS5lbmRzd2l0aCgnXycpLAorICAgICAgICAgICAgIk5hbWVzIG1heSBub3QgZW5kIGluICctJyBvciAnXyc6ICVyIiAlIG5hbWUpCisgICAgICAgIGlmIGJhZF9oZWFkZXJfdmFsdWVfcmUuc2VhcmNoKHZhbHVlKToKKyAgICAgICAgICAgIGFzc2VydF8oMCwgIkJhZCBoZWFkZXIgdmFsdWU6ICVyIChiYWQgY2hhcjogJXIpIgorICAgICAgICAgICAgJSAodmFsdWUsIGJhZF9oZWFkZXJfdmFsdWVfcmUuc2VhcmNoKHZhbHVlKS5ncm91cCgwKSkpCisKK2RlZiBjaGVja19jb250ZW50X3R5cGUoc3RhdHVzLCBoZWFkZXJzKToKKyAgICBjb2RlID0gaW50KHN0YXR1cy5zcGxpdChOb25lLCAxKVswXSkKKyAgICAjIEBAOiBuZWVkIG9uZSBtb3JlIHBlcnNvbiB0byB2ZXJpZnkgdGhpcyBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjYxNgorICAgICMgICAgIGh0dHA6Ly93d3cudzMub3JnL1Byb3RvY29scy9yZmMyNjE2L3JmYzI2MTYtc2VjMTAuaHRtbAorICAgIE5PX01FU1NBR0VfQk9EWSA9ICgyMDQsIDMwNCkKKyAgICBmb3IgbmFtZSwgdmFsdWUgaW4gaGVhZGVyczoKKyAgICAgICAgaWYgbmFtZS5sb3dlcigpID09ICdjb250ZW50LXR5cGUnOgorICAgICAgICAgICAgaWYgY29kZSBub3QgaW4gTk9fTUVTU0FHRV9CT0RZOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgYXNzZXJ0XygwLCAoIkNvbnRlbnQtVHlwZSBoZWFkZXIgZm91bmQgaW4gYSAlcyByZXNwb25zZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIndoaWNoIG11c3Qgbm90IHJldHVybiBjb250ZW50LiIpICUgY29kZSkKKyAgICBpZiBjb2RlIG5vdCBpbiBOT19NRVNTQUdFX0JPRFk6CisgICAgICAgIGFzc2VydF8oMCwgIk5vIENvbnRlbnQtVHlwZSBoZWFkZXIgZm91bmQgaW4gaGVhZGVycyAoJXMpIiAlIGhlYWRlcnMpCisKK2RlZiBjaGVja19leGNfaW5mbyhleGNfaW5mbyk6CisgICAgYXNzZXJ0XyhleGNfaW5mbyBpcyBOb25lIG9yIHR5cGUoZXhjX2luZm8pIGlzIHR5cGUoKCkpLAorICAgICAgICAiZXhjX2luZm8gKCVyKSBpcyBub3QgYSB0dXBsZTogJXIiICUgKGV4Y19pbmZvLCB0eXBlKGV4Y19pbmZvKSkpCisgICAgIyBNb3JlIGV4Y19pbmZvIGNoZWNrcz8KKworZGVmIGNoZWNrX2l0ZXJhdG9yKGl0ZXJhdG9yKToKKyAgICAjIFRlY2huaWNhbGx5IGEgc3RyaW5nIGlzIGxlZ2FsLCB3aGljaCBpcyB3aHkgaXQncyBhIHJlYWxseSBiYWQKKyAgICAjIGlkZWEsIGJlY2F1c2UgaXQgbWF5IGNhdXNlIHRoZSByZXNwb25zZSB0byBiZSByZXR1cm5lZAorICAgICMgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlcgorICAgIGFzc2VydF8obm90IGlzaW5zdGFuY2UoaXRlcmF0b3IsIHN0ciksCisgICAgICAgICJZb3Ugc2hvdWxkIG5vdCByZXR1cm4gYSBzdHJpbmcgYXMgeW91ciBhcHBsaWNhdGlvbiBpdGVyYXRvciwgIgorICAgICAgICAiaW5zdGVhZCByZXR1cm4gYSBzaW5nbGUtaXRlbSBsaXN0IGNvbnRhaW5pbmcgdGhhdCBzdHJpbmcuIikKZGlmZiAtLWdpdCBhL0xpYi94bWwucHkgYi9MaWIveG1sL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIExpYi94bWwucHkKcmVuYW1lIHRvIExpYi94bWwvX19pbml0X18ucHkKaW5kZXggNzM5M2M2Ni4uZmE1ZThjZCAxMDA2NDQKLS0tIGEvTGliL3htbC5weQorKysgYi9MaWIveG1sL19faW5pdF9fLnB5CkBAIC0xNiw4ICsxNiw2IEBACiAKICIiIgogCi1pbXBvcnQgc3lzCi1pbXBvcnQgeG1sY29yZQogCiBfX2FsbF9fID0gWyJkb20iLCAicGFyc2VycyIsICJzYXgiLCAiZXRyZWUiXQogCkBAIC0yOSwxMCArMjcsMTEgQEAKIAogX01JTklNVU1fWE1MUExVU19WRVJTSU9OID0gKDAsIDgsIDQpCiAKKwogdHJ5OgogICAgIGltcG9ydCBfeG1scGx1cwogZXhjZXB0IEltcG9ydEVycm9yOgotICAgIHN5cy5tb2R1bGVzW19fbmFtZV9fXSA9IHhtbGNvcmUKKyAgICBwYXNzCiBlbHNlOgogICAgIHRyeToKICAgICAgICAgdiA9IF94bWxwbHVzLnZlcnNpb25faW5mbwpAQCAtNDEsNyArNDAsOCBAQAogICAgICAgICBwYXNzCiAgICAgZWxzZToKICAgICAgICAgaWYgdiA+PSBfTUlOSU1VTV9YTUxQTFVTX1ZFUlNJT046Ci0gICAgICAgICAgICBfeG1scGx1cy5fX3BhdGhfXy5leHRlbmQoeG1sY29yZS5fX3BhdGhfXykKKyAgICAgICAgICAgIGltcG9ydCBzeXMKKyAgICAgICAgICAgIF94bWxwbHVzLl9fcGF0aF9fLmV4dGVuZChfX3BhdGhfXykKICAgICAgICAgICAgIHN5cy5tb2R1bGVzW19fbmFtZV9fXSA9IF94bWxwbHVzCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBkZWwgdgpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL05vZGVGaWx0ZXIucHkgYi9MaWIveG1sL2RvbS9Ob2RlRmlsdGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9kb20vTm9kZUZpbHRlci5weQpyZW5hbWUgdG8gTGliL3htbC9kb20vTm9kZUZpbHRlci5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL19faW5pdF9fLnB5IGIvTGliL3htbC9kb20vX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL19faW5pdF9fLnB5CnJlbmFtZSB0byBMaWIveG1sL2RvbS9fX2luaXRfXy5weQppbmRleCAwMDJjZGI3Li42MzYzZDAwIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vX19pbml0X18ucHkKKysrIGIvTGliL3htbC9kb20vX19pbml0X18ucHkKQEAgLTEzNiw0ICsxMzYsNCBAQAogRU1QVFlfTkFNRVNQQUNFID0gTm9uZQogRU1QVFlfUFJFRklYID0gTm9uZQogCi1mcm9tIC5kb21yZWcgaW1wb3J0IGdldERPTUltcGxlbWVudGF0aW9uLHJlZ2lzdGVyRE9NSW1wbGVtZW50YXRpb24KK2Zyb20gZG9tcmVnIGltcG9ydCBnZXRET01JbXBsZW1lbnRhdGlvbixyZWdpc3RlckRPTUltcGxlbWVudGF0aW9uCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vZG9tcmVnLnB5IGIvTGliL3htbC9kb20vZG9tcmVnLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2RvbS9kb21yZWcucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL2RvbXJlZy5weQppbmRleCBkNjBlZDY0Li42ODRjNDM2IDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vZG9tcmVnLnB5CisrKyBiL0xpYi94bWwvZG9tL2RvbXJlZy5weQpAQCAtMiw3ICsyLDcgQEAKIGRpcmVjdGx5LiBJbnN0ZWFkLCB0aGUgZnVuY3Rpb25zIGdldERPTUltcGxlbWVudGF0aW9uIGFuZAogcmVnaXN0ZXJET01JbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgaW1wb3J0ZWQgZnJvbSB4bWwuZG9tLiIiIgogCi1mcm9tIHhtbGNvcmUuZG9tLm1pbmljb21wYXQgaW1wb3J0ICogICMgaXNpbnN0YW5jZSwgU3RyaW5nVHlwZXMKK2Zyb20geG1sLmRvbS5taW5pY29tcGF0IGltcG9ydCAqICAjIGlzaW5zdGFuY2UsIFN0cmluZ1R5cGVzCiAKICMgVGhpcyBpcyBhIGxpc3Qgb2Ygd2VsbC1rbm93biBpbXBsZW1lbnRhdGlvbnMuICBXZWxsLWtub3duIG5hbWVzCiAjIHNob3VsZCBiZSBwdWJsaXNoZWQgYnkgcG9zdGluZyB0byB4bWwtc2lnQHB5dGhvbi5vcmcsIGFuZCBhcmUKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkgYi9MaWIveG1sL2RvbS9leHBhdGJ1aWxkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL2V4cGF0YnVpbGRlci5weQpyZW5hbWUgdG8gTGliL3htbC9kb20vZXhwYXRidWlsZGVyLnB5CmluZGV4IDMyZmZhNDEuLmEyZjhhMzMgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKKysrIGIvTGliL3htbC9kb20vZXhwYXRidWlsZGVyLnB5CkBAIC0yNywxMyArMjcsMTMgQEAKICMgICAgICBjYWxsaW5nIGFueSBtZXRob2RzIG9uIHRoZSBub2RlIG9iamVjdCBpZiBpdCBleGlzdHMuICAoQSByYXRoZXIKICMgICAgICBuaWNlIHNwZWVkdXAgaXMgYWNoaWV2ZWQgdGhpcyB3YXkgYXMgd2VsbCEpCiAKLWZyb20geG1sY29yZS5kb20gaW1wb3J0IHhtbGJ1aWxkZXIsIG1pbmlkb20sIE5vZGUKLWZyb20geG1sY29yZS5kb20gaW1wb3J0IEVNUFRZX05BTUVTUEFDRSwgRU1QVFlfUFJFRklYLCBYTUxOU19OQU1FU1BBQ0UKLWZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAotZnJvbSB4bWxjb3JlLmRvbS5taW5pZG9tIGltcG9ydCBfYXBwZW5kX2NoaWxkLCBfc2V0X2F0dHJpYnV0ZV9ub2RlCi1mcm9tIHhtbGNvcmUuZG9tLk5vZGVGaWx0ZXIgaW1wb3J0IE5vZGVGaWx0ZXIKK2Zyb20geG1sLmRvbSBpbXBvcnQgeG1sYnVpbGRlciwgbWluaWRvbSwgTm9kZQorZnJvbSB4bWwuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFCitmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAorZnJvbSB4bWwuZG9tLm1pbmlkb20gaW1wb3J0IF9hcHBlbmRfY2hpbGQsIF9zZXRfYXR0cmlidXRlX25vZGUKK2Zyb20geG1sLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCiAKLWZyb20geG1sY29yZS5kb20ubWluaWNvbXBhdCBpbXBvcnQgKgorZnJvbSB4bWwuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKIAogVEVYVF9OT0RFID0gTm9kZS5URVhUX05PREUKIENEQVRBX1NFQ1RJT05fTk9ERSA9IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vbWluaWNvbXBhdC5weSBiL0xpYi94bWwvZG9tL21pbmljb21wYXQucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL21pbmljb21wYXQucHkKaW5kZXggZjk5YjdmZS4uZDQ5MWZiNiAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkKKysrIGIvTGliL3htbC9kb20vbWluaWNvbXBhdC5weQpAQCAtMzgsNyArMzgsNyBAQAogCiBfX2FsbF9fID0gWyJOb2RlTGlzdCIsICJFbXB0eU5vZGVMaXN0IiwgIlN0cmluZ1R5cGVzIiwgImRlZnByb3BlcnR5Il0KIAotaW1wb3J0IHhtbGNvcmUuZG9tCitpbXBvcnQgeG1sLmRvbQogCiB0cnk6CiAgICAgdW5pY29kZQpAQCAtNzEsNiArNzEsNyBAQAogICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgogICAgICAgICBzZWxmWzpdID0gc3RhdGUKIAorCiBjbGFzcyBFbXB0eU5vZGVMaXN0KHR1cGxlKToKICAgICBfX3Nsb3RzX18gPSAoKQogCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vbWluaWRvbS5weSBiL0xpYi94bWwvZG9tL21pbmlkb20ucHkKc2ltaWxhcml0eSBpbmRleCA5MyUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL21pbmlkb20ucHkKaW5kZXggYThhYmQxNC4uM2EzNTc4MSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkKKysrIGIvTGliL3htbC9kb20vbWluaWRvbS5weQpAQCAtMTQsMjIgKzE0LDIyIEBACiAgKiBTQVggMiBuYW1lc3BhY2VzCiAiIiIKIAotaW1wb3J0IHhtbGNvcmUuZG9tCitpbXBvcnQgeG1sLmRvbQogCi1mcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBFTVBUWV9OQU1FU1BBQ0UsIEVNUFRZX1BSRUZJWCwgWE1MTlNfTkFNRVNQQUNFLCBkb21yZWcKLWZyb20geG1sY29yZS5kb20ubWluaWNvbXBhdCBpbXBvcnQgKgotZnJvbSB4bWxjb3JlLmRvbS54bWxidWlsZGVyIGltcG9ydCBET01JbXBsZW1lbnRhdGlvbkxTLCBEb2N1bWVudExTCitmcm9tIHhtbC5kb20gaW1wb3J0IEVNUFRZX05BTUVTUEFDRSwgRU1QVFlfUFJFRklYLCBYTUxOU19OQU1FU1BBQ0UsIGRvbXJlZworZnJvbSB4bWwuZG9tLm1pbmljb21wYXQgaW1wb3J0ICoKK2Zyb20geG1sLmRvbS54bWxidWlsZGVyIGltcG9ydCBET01JbXBsZW1lbnRhdGlvbkxTLCBEb2N1bWVudExTCiAKICMgVGhpcyBpcyB1c2VkIGJ5IHRoZSBJRC1jYWNoZSBpbnZhbGlkYXRpb24gY2hlY2tzOyB0aGUgbGlzdCBpc24ndAogIyBhY3R1YWxseSBjb21wbGV0ZSwgc2luY2UgdGhlIG5vZGVzIGJlaW5nIGNoZWNrZWQgd2lsbCBuZXZlciBiZSB0aGUKICMgRE9DVU1FTlRfTk9ERSBvciBET0NVTUVOVF9GUkFHTUVOVF9OT0RFLiAgKFRoZSBub2RlIGJlaW5nIGNoZWNrZWQgaXMKICMgdGhlIG5vZGUgYmVpbmcgYWRkZWQgb3IgcmVtb3ZlZCwgbm90IHRoZSBub2RlIGJlaW5nIG1vZGlmaWVkLikKICMKLV9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbiA9ICh4bWxjb3JlLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxjb3JlLmRvbS5Ob2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkKK19ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbiA9ICh4bWwuZG9tLk5vZGUuRUxFTUVOVF9OT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhtbC5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCiAKIAotY2xhc3MgTm9kZSh4bWxjb3JlLmRvbS5Ob2RlKToKK2NsYXNzIE5vZGUoeG1sLmRvbS5Ob2RlKToKICAgICBuYW1lc3BhY2VVUkkgPSBOb25lICMgdGhpcyBpcyBub24tbnVsbCBvbmx5IGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcwogICAgIHBhcmVudE5vZGUgPSBOb25lCiAgICAgb3duZXJEb2N1bWVudCA9IE5vbmUKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgICAgICMjIyBUaGUgRE9NIGRvZXMgbm90IGNsZWFybHkgc3BlY2lmeSB3aGF0IHRvIHJldHVybiBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgIHJldHVybiBuZXdDaGlsZAogICAgICAgICBpZiBuZXdDaGlsZC5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihuZXdDaGlsZCksIHJlcHIoc2VsZikpKQogICAgICAgICBpZiBuZXdDaGlsZC5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgbmV3Q2hpbGQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuZXdDaGlsZCkKQEAgLTkzLDcgKzkzLDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYuY2hpbGROb2Rlcy5pbmRleChyZWZDaGlsZCkKICAgICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgICAgIGlmIG5ld0NoaWxkLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbjoKICAgICAgICAgICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKICAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5pbnNlcnQoaW5kZXgsIG5ld0NoaWxkKQpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgICAgICAjIyMgVGhlIERPTSBkb2VzIG5vdCBjbGVhcmx5IHNwZWNpZnkgd2hhdCB0byByZXR1cm4gaW4gdGhpcyBjYXNlCiAgICAgICAgICAgICByZXR1cm4gbm9kZQogICAgICAgICBpZiBub2RlLm5vZGVUeXBlIG5vdCBpbiBzZWxmLl9jaGlsZF9ub2RlX3R5cGVzOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgICAgICAiJXMgY2Fubm90IGJlIGNoaWxkIG9mICVzIiAlIChyZXByKG5vZGUpLCByZXByKHNlbGYpKSkKICAgICAgICAgZWxpZiBub2RlLm5vZGVUeXBlIGluIF9ub2RlVHlwZXNfd2l0aF9jaGlsZHJlbjoKICAgICAgICAgICAgIF9jbGVhcl9pZF9jYWNoZShzZWxmKQpAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgICAgICAgICBzZWxmLnJlbW92ZUNoaWxkKG9sZENoaWxkKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCkKICAgICAgICAgaWYgbmV3Q2hpbGQubm9kZVR5cGUgbm90IGluIHNlbGYuX2NoaWxkX25vZGVfdHlwZXM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobmV3Q2hpbGQpLCByZXByKHNlbGYpKSkKICAgICAgICAgaWYgbmV3Q2hpbGQgaXMgb2xkQ2hpbGQ6CiAgICAgICAgICAgICByZXR1cm4KQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbmRleCA9IHNlbGYuY2hpbGROb2Rlcy5pbmRleChvbGRDaGlsZCkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgc2VsZi5jaGlsZE5vZGVzW2luZGV4XSA9IG5ld0NoaWxkCiAgICAgICAgIG5ld0NoaWxkLnBhcmVudE5vZGUgPSBzZWxmCiAgICAgICAgIG9sZENoaWxkLnBhcmVudE5vZGUgPSBOb25lCkBAIC0xNjEsNyArMTYxLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5jaGlsZE5vZGVzLnJlbW92ZShvbGRDaGlsZCkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgaWYgb2xkQ2hpbGQubmV4dFNpYmxpbmcgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBvbGRDaGlsZC5uZXh0U2libGluZy5wcmV2aW91c1NpYmxpbmcgPSBvbGRDaGlsZC5wcmV2aW91c1NpYmxpbmcKICAgICAgICAgaWYgb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nIGlzIG5vdCBOb25lOgpAQCAtMzg2LDcgKzM4Niw3IEBACiAgICAgICAgIG5zdXJpID0gc2VsZi5uYW1lc3BhY2VVUkkKICAgICAgICAgaWYgcHJlZml4ID09ICJ4bWxucyI6CiAgICAgICAgICAgICBpZiBuc3VyaSBhbmQgbnN1cmkgIT0gWE1MTlNfTkFNRVNQQUNFOgotICAgICAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5hbWVzcGFjZUVycigKKyAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mICd4bWxucycgcHJlZml4IGZvciB0aGUgd3JvbmcgbmFtZXNwYWNlIikKICAgICAgICAgZCA9IHNlbGYuX19kaWN0X18KICAgICAgICAgZFsncHJlZml4J10gPSBwcmVmaXgKQEAgLTU2NCw3ICs1NjQsNyBAQAogICAgICAgICAgICAgICAgIG4uX19kaWN0X19bJ293bmVyRWxlbWVudCddID0gTm9uZQogICAgICAgICAgICAgcmV0dXJuIG4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogCiAgICAgZGVmIHJlbW92ZU5hbWVkSXRlbU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKICAgICAgICAgbiA9IHNlbGYuZ2V0TmFtZWRJdGVtTlMobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpCkBAIC01NzYsMTEgKzU3NiwxMSBAQAogICAgICAgICAgICAgICAgIG4uX19kaWN0X19bJ293bmVyRWxlbWVudCddID0gTm9uZQogICAgICAgICAgICAgcmV0dXJuIG4KICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogCiAgICAgZGVmIHNldE5hbWVkSXRlbShzZWxmLCBub2RlKToKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uobm9kZSwgQXR0cik6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICIlcyBjYW5ub3QgYmUgY2hpbGQgb2YgJXMiICUgKHJlcHIobm9kZSksIHJlcHIoc2VsZikpKQogICAgICAgICBvbGQgPSBzZWxmLl9hdHRycy5nZXQobm9kZS5uYW1lKQogICAgICAgICBpZiBvbGQ6CkBAIC03MzEsNyArNzMxLDcgQEAKIAogICAgIGRlZiBzZXRBdHRyaWJ1dGVOb2RlKHNlbGYsIGF0dHIpOgogICAgICAgICBpZiBhdHRyLm93bmVyRWxlbWVudCBub3QgaW4gKE5vbmUsIHNlbGYpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW51c2VBdHRyaWJ1dGVFcnIoImF0dHJpYnV0ZSBub2RlIGFscmVhZHkgb3duZWQiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbnVzZUF0dHJpYnV0ZUVycigiYXR0cmlidXRlIG5vZGUgYWxyZWFkeSBvd25lZCIpCiAgICAgICAgIG9sZDEgPSBzZWxmLl9hdHRycy5nZXQoYXR0ci5uYW1lLCBOb25lKQogICAgICAgICBpZiBvbGQxIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgc2VsZi5yZW1vdmVBdHRyaWJ1dGVOb2RlKG9sZDEpCkBAIC03NTMsMjMgKzc1MywyMyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBhdHRyID0gc2VsZi5fYXR0cnNbbmFtZV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIHNlbGYucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKQogCiAgICAgZGVmIHJlbW92ZUF0dHJpYnV0ZU5TKHNlbGYsIG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKToKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYXR0ciA9IHNlbGYuX2F0dHJzTlNbKG5hbWVzcGFjZVVSSSwgbG9jYWxOYW1lKV0KICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIHNlbGYucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKQogCiAgICAgZGVmIHJlbW92ZUF0dHJpYnV0ZU5vZGUoc2VsZiwgbm9kZSk6CiAgICAgICAgIGlmIG5vZGUgaXMgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLl9hdHRyc1tub2RlLm5hbWVdCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vdEZvdW5kRXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoKQogICAgICAgICBfY2xlYXJfaWRfY2FjaGUoc2VsZikKICAgICAgICAgbm9kZS51bmxpbmsoKQogICAgICAgICAjIFJlc3RvcmUgdGhpcyBzaW5jZSB0aGUgbm9kZSBpcyBzdGlsbCB1c2VmdWwgYW5kIG90aGVyd2lzZQpAQCAtODM3LDkgKzgzNyw5IEBACiAKICAgICBkZWYgc2V0SWRBdHRyaWJ1dGVOb2RlKHNlbGYsIGlkQXR0cik6CiAgICAgICAgIGlmIGlkQXR0ciBpcyBOb25lIG9yIG5vdCBzZWxmLmlzU2FtZU5vZGUoaWRBdHRyLm93bmVyRWxlbWVudCk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdEZvdW5kRXJyKCkKICAgICAgICAgaWYgX2dldF9jb250YWluaW5nX2VudHJlZihzZWxmKSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigpCiAgICAgICAgIGlmIG5vdCBpZEF0dHIuX2lzX2lkOgogICAgICAgICAgICAgaWRBdHRyLl9fZGljdF9fWydfaXNfaWQnXSA9IFRydWUKICAgICAgICAgICAgIHNlbGYuX21hZ2ljX2lkX25vZGVzICs9IDEKQEAgLTg4MCwyMiArODgwLDIyIEBACiAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBkZWYgYXBwZW5kQ2hpbGQoc2VsZiwgbm9kZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGNhbm5vdCBoYXZlIGNoaWxkcmVuIikKIAogICAgIGRlZiBoYXNDaGlsZE5vZGVzKHNlbGYpOgogICAgICAgICByZXR1cm4gRmFsc2UKIAogICAgIGRlZiBpbnNlcnRCZWZvcmUoc2VsZiwgbmV3Q2hpbGQsIHJlZkNoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgc2VsZi5ub2RlTmFtZSArICIgbm9kZXMgZG8gbm90IGhhdmUgY2hpbGRyZW4iKQogCiAgICAgZGVmIHJlbW92ZUNoaWxkKHNlbGYsIG9sZENoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoCiAgICAgICAgICAgICBzZWxmLm5vZGVOYW1lICsgIiBub2RlcyBkbyBub3QgaGF2ZSBjaGlsZHJlbiIpCiAKICAgICBkZWYgcmVwbGFjZUNoaWxkKHNlbGYsIG5ld0NoaWxkLCBvbGRDaGlsZCk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKICAgICAgICAgICAgIHNlbGYubm9kZU5hbWUgKyAiIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuIikKIAogCkBAIC05NjEsMTEgKzk2MSwxMSBAQAogCiAgICAgZGVmIHN1YnN0cmluZ0RhdGEoc2VsZiwgb2Zmc2V0LCBjb3VudCk6CiAgICAgICAgIGlmIG9mZnNldCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgbmVnYXRpdmUiKQogICAgICAgICBpZiBvZmZzZXQgPj0gbGVuKHNlbGYuZGF0YSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCiAgICAgICAgIGlmIGNvdW50IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJjb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKQogICAgICAgICByZXR1cm4gc2VsZi5kYXRhW29mZnNldDpvZmZzZXQrY291bnRdCiAKICAgICBkZWYgYXBwZW5kRGF0YShzZWxmLCBhcmcpOgpAQCAtOTczLDMwICs5NzMsMzAgQEAKIAogICAgIGRlZiBpbnNlcnREYXRhKHNlbGYsIG9mZnNldCwgYXJnKToKICAgICAgICAgaWYgb2Zmc2V0IDwgMDoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCiAgICAgICAgIGlmIG9mZnNldCA+PSBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoIm9mZnNldCBjYW5ub3QgYmUgYmV5b25kIGVuZCBvZiBkYXRhIikKICAgICAgICAgaWYgYXJnOgogICAgICAgICAgICAgc2VsZi5kYXRhID0gIiVzJXMlcyIgJSAoCiAgICAgICAgICAgICAgICAgc2VsZi5kYXRhWzpvZmZzZXRdLCBhcmcsIHNlbGYuZGF0YVtvZmZzZXQ6XSkKIAogICAgIGRlZiBkZWxldGVEYXRhKHNlbGYsIG9mZnNldCwgY291bnQpOgogICAgICAgICBpZiBvZmZzZXQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQogICAgICAgICBpZiBjb3VudCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgY291bnQ6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSBzZWxmLmRhdGFbOm9mZnNldF0gKyBzZWxmLmRhdGFbb2Zmc2V0K2NvdW50Ol0KIAogICAgIGRlZiByZXBsYWNlRGF0YShzZWxmLCBvZmZzZXQsIGNvdW50LCBhcmcpOgogICAgICAgICBpZiBvZmZzZXQgPCAwOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgb2Zmc2V0ID49IGxlbihzZWxmLmRhdGEpOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSW5kZXhTaXplRXJyKCJvZmZzZXQgY2Fubm90IGJlIGJleW9uZCBlbmQgb2YgZGF0YSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigib2Zmc2V0IGNhbm5vdCBiZSBiZXlvbmQgZW5kIG9mIGRhdGEiKQogICAgICAgICBpZiBjb3VudCA8IDA6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5JbmRleFNpemVFcnIoImNvdW50IGNhbm5vdCBiZSBuZWdhdGl2ZSIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkluZGV4U2l6ZUVycigiY291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIikKICAgICAgICAgaWYgY291bnQ6CiAgICAgICAgICAgICBzZWxmLmRhdGEgPSAiJXMlcyVzIiAlICgKICAgICAgICAgICAgICAgICBzZWxmLmRhdGFbOm9mZnNldF0sIGFyZywgc2VsZi5kYXRhW29mZnNldCtjb3VudDpdKQpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAogICAgIGRlZiBzcGxpdFRleHQoc2VsZiwgb2Zmc2V0KToKICAgICAgICAgaWYgb2Zmc2V0IDwgMCBvciBvZmZzZXQgPiBsZW4oc2VsZi5kYXRhKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkluZGV4U2l6ZUVycigiaWxsZWdhbCBvZmZzZXQgdmFsdWUiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5JbmRleFNpemVFcnIoImlsbGVnYWwgb2Zmc2V0IHZhbHVlIikKICAgICAgICAgbmV3VGV4dCA9IHNlbGYuX19jbGFzc19fKCkKICAgICAgICAgbmV3VGV4dC5kYXRhID0gc2VsZi5kYXRhW29mZnNldDpdCiAgICAgICAgIG5ld1RleHQub3duZXJEb2N1bWVudCA9IHNlbGYub3duZXJEb2N1bWVudApAQCAtMTE4NSwxOSArMTE4NSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIE5vbmUKIAogICAgIGRlZiByZW1vdmVOYW1lZEl0ZW0oc2VsZiwgbmFtZSk6Ci0gICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCiAgICAgICAgICAgICAiTmFtZWROb2RlTWFwIGluc3RhbmNlIGlzIHJlYWQtb25seSIpCiAKICAgICBkZWYgcmVtb3ZlTmFtZWRJdGVtTlMoc2VsZiwgbmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAogICAgICAgICAgICAgIk5hbWVkTm9kZU1hcCBpbnN0YW5jZSBpcyByZWFkLW9ubHkiKQogCiAgICAgZGVmIHNldE5hbWVkSXRlbShzZWxmLCBub2RlKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKIAogICAgIGRlZiBzZXROYW1lZEl0ZW1OUyhzZWxmLCBub2RlKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKICAgICAgICAgICAgICJOYW1lZE5vZGVNYXAgaW5zdGFuY2UgaXMgcmVhZC1vbmx5IikKIAogICAgIGRlZiBfX2dldHN0YXRlX18oc2VsZik6CkBAIC0xMjUxLDcgKzEyNTEsNyBAQAogICAgICAgICAgICAgY2xvbmUgPSBEb2N1bWVudFR5cGUoTm9uZSkKICAgICAgICAgICAgIGNsb25lLm5hbWUgPSBzZWxmLm5hbWUKICAgICAgICAgICAgIGNsb25lLm5vZGVOYW1lID0gc2VsZi5uYW1lCi0gICAgICAgICAgICBvcGVyYXRpb24gPSB4bWxjb3JlLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQKKyAgICAgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECiAgICAgICAgICAgICBpZiBkZWVwOgogICAgICAgICAgICAgICAgIGNsb25lLmVudGl0aWVzLl9zZXEgPSBbXQogICAgICAgICAgICAgICAgIGNsb25lLm5vdGF0aW9ucy5fc2VxID0gW10KQEAgLTEzMTEsMTkgKzEzMTEsMTkgQEAKICAgICAgICAgcmV0dXJuIHNlbGYudmVyc2lvbgogCiAgICAgZGVmIGFwcGVuZENoaWxkKHNlbGYsIG5ld0NoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCBhcHBlbmQgY2hpbGRyZW4gdG8gYW4gZW50aXR5IG5vZGUiKQogCiAgICAgZGVmIGluc2VydEJlZm9yZShzZWxmLCBuZXdDaGlsZCwgcmVmQ2hpbGQpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAiY2Fubm90IGluc2VydCBjaGlsZHJlbiBiZWxvdyBhbiBlbnRpdHkgbm9kZSIpCiAKICAgICBkZWYgcmVtb3ZlQ2hpbGQoc2VsZiwgb2xkQ2hpbGQpOgotICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAiY2Fubm90IHJlbW92ZSBjaGlsZHJlbiBmcm9tIGFuIGVudGl0eSBub2RlIikKIAogICAgIGRlZiByZXBsYWNlQ2hpbGQoc2VsZiwgbmV3Q2hpbGQsIG9sZENoaWxkKToKLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uSGllcmFyY2h5UmVxdWVzdEVycigKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgImNhbm5vdCByZXBsYWNlIGNoaWxkcmVuIG9mIGFuIGVudGl0eSBub2RlIikKIAogY2xhc3MgTm90YXRpb24oSWRlbnRpZmllZCwgQ2hpbGRsZXNzLCBOb2RlKToKQEAgLTEzNTUsNyArMTM1NSw3IEBACiAKICAgICBkZWYgY3JlYXRlRG9jdW1lbnQoc2VsZiwgbmFtZXNwYWNlVVJJLCBxdWFsaWZpZWROYW1lLCBkb2N0eXBlKToKICAgICAgICAgaWYgZG9jdHlwZSBhbmQgZG9jdHlwZS5wYXJlbnROb2RlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uV3JvbmdEb2N1bWVudEVycigKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uV3JvbmdEb2N1bWVudEVycigKICAgICAgICAgICAgICAgICAiZG9jdHlwZSBvYmplY3Qgb3duZWQgYnkgYW5vdGhlciBET00gdHJlZSIpCiAgICAgICAgIGRvYyA9IHNlbGYuX2NyZWF0ZV9kb2N1bWVudCgpCiAKQEAgLTEzNzYsMTUgKzEzNzYsMTUgQEAKICAgICAgICAgICAgICMgTnVsbCB0aGUgZG9jdW1lbnQgaXMgcmV0dXJuZWQgd2l0aG91dCBhIGRvY3VtZW50IGVsZW1lbnQKICAgICAgICAgICAgICMgT3RoZXJ3aXNlIGlmIGRvY3R5cGUgb3IgbmFtZXNwYWNlVVJJIGFyZSBub3QgTm9uZQogICAgICAgICAgICAgIyBUaGVuIHdlIGdvIGJhY2sgdG8gdGhlIGFib3ZlIHByb2JsZW0KLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkludmFsaWRDaGFyYWN0ZXJFcnIoIkVsZW1lbnQgd2l0aCBubyBuYW1lIikKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uSW52YWxpZENoYXJhY3RlckVycigiRWxlbWVudCB3aXRoIG5vIG5hbWUiKQogCiAgICAgICAgIGlmIGFkZF9yb290X2VsZW1lbnQ6CiAgICAgICAgICAgICBwcmVmaXgsIGxvY2FsbmFtZSA9IF9uc3NwbGl0KHF1YWxpZmllZE5hbWUpCiAgICAgICAgICAgICBpZiBwcmVmaXggPT0gInhtbCIgXAogICAgICAgICAgICAgICAgYW5kIG5hbWVzcGFjZVVSSSAhPSAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIjoKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5OYW1lc3BhY2VFcnIoImlsbGVnYWwgdXNlIG9mICd4bWwnIHByZWZpeCIpCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5OYW1lc3BhY2VFcnIoImlsbGVnYWwgdXNlIG9mICd4bWwnIHByZWZpeCIpCiAgICAgICAgICAgICBpZiBwcmVmaXggYW5kIG5vdCBuYW1lc3BhY2VVUkk6Ci0gICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKAogICAgICAgICAgICAgICAgICAgICAiaWxsZWdhbCB1c2Ugb2YgcHJlZml4IHdpdGhvdXQgbmFtZXNwYWNlcyIpCiAgICAgICAgICAgICBlbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhuYW1lc3BhY2VVUkksIHF1YWxpZmllZE5hbWUpCiAgICAgICAgICAgICBpZiBkb2N0eXBlOgpAQCAtMTUzMyw3ICsxNTMzLDcgQEAKIAogICAgIGRlZiBhcHBlbmRDaGlsZChzZWxmLCBub2RlKToKICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSBub3QgaW4gc2VsZi5fY2hpbGRfbm9kZV90eXBlczoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLkhpZXJhcmNoeVJlcXVlc3RFcnIoCiAgICAgICAgICAgICAgICAgIiVzIGNhbm5vdCBiZSBjaGlsZCBvZiAlcyIgJSAocmVwcihub2RlKSwgcmVwcihzZWxmKSkpCiAgICAgICAgIGlmIG5vZGUucGFyZW50Tm9kZSBpcyBub3QgTm9uZToKICAgICAgICAgICAgICMgVGhpcyBuZWVkcyB0byBiZSBkb25lIGJlZm9yZSB0aGUgbmV4dCB0ZXN0IHNpbmNlIHRoaXMKQEAgLTE1NDMsNyArMTU0Myw3IEBACiAKICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSBcCiAgICAgICAgICAgIGFuZCBzZWxmLl9nZXRfZG9jdW1lbnRFbGVtZW50KCk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5IaWVyYXJjaHlSZXF1ZXN0RXJyKAogICAgICAgICAgICAgICAgICJ0d28gZG9jdW1lbnQgZWxlbWVudHMgZGlzYWxsb3dlZCIpCiAgICAgICAgIHJldHVybiBOb2RlLmFwcGVuZENoaWxkKHNlbGYsIG5vZGUpCiAKQEAgLTE1NTEsNyArMTU1MSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuY2hpbGROb2Rlcy5yZW1vdmUob2xkQ2hpbGQpCiAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90Rm91bmRFcnIoKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RGb3VuZEVycigpCiAgICAgICAgIG9sZENoaWxkLm5leHRTaWJsaW5nID0gb2xkQ2hpbGQucHJldmlvdXNTaWJsaW5nID0gTm9uZQogICAgICAgICBvbGRDaGlsZC5wYXJlbnROb2RlID0gTm9uZQogICAgICAgICBpZiBzZWxmLmRvY3VtZW50RWxlbWVudCBpcyBvbGRDaGlsZDoKQEAgLTE1ODcsNyArMTU4Nyw3IEBACiAgICAgICAgICAgICAgICAgYXNzZXJ0IGNsb25lLmRvY3R5cGUgaXMgTm9uZQogICAgICAgICAgICAgICAgIGNsb25lLmRvY3R5cGUgPSBjaGlsZGNsb25lCiAgICAgICAgICAgICBjaGlsZGNsb25lLnBhcmVudE5vZGUgPSBjbG9uZQotICAgICAgICBzZWxmLl9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKHhtbGNvcmUuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwKKyAgICAgICAgc2VsZi5fY2FsbF91c2VyX2RhdGFfaGFuZGxlcih4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLCBjbG9uZSkKICAgICAgICAgcmV0dXJuIGNsb25lCiAKQEAgLTE3MjksOSArMTcyOSw5IEBACiAKICAgICBkZWYgaW1wb3J0Tm9kZShzZWxmLCBub2RlLCBkZWVwKToKICAgICAgICAgaWYgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgbm9kZXMiKQorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgbm9kZXMiKQogICAgICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoImNhbm5vdCBpbXBvcnQgZG9jdW1lbnQgdHlwZSBub2RlcyIpCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigiY2Fubm90IGltcG9ydCBkb2N1bWVudCB0eXBlIG5vZGVzIikKICAgICAgICAgcmV0dXJuIF9jbG9uZV9ub2RlKG5vZGUsIGRlZXAsIHNlbGYpCiAKICAgICBkZWYgd3JpdGV4bWwoc2VsZiwgd3JpdGVyLCBpbmRlbnQ9IiIsIGFkZGluZGVudD0iIiwgbmV3bD0iIiwKQEAgLTE3NDcsMjQgKzE3NDcsMjQgQEAKIAogICAgIGRlZiByZW5hbWVOb2RlKHNlbGYsIG4sIG5hbWVzcGFjZVVSSSwgbmFtZSk6CiAgICAgICAgIGlmIG4ub3duZXJEb2N1bWVudCBpcyBub3Qgc2VsZjoKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLldyb25nRG9jdW1lbnRFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLldyb25nRG9jdW1lbnRFcnIoCiAgICAgICAgICAgICAgICAgImNhbm5vdCByZW5hbWUgbm9kZXMgZnJvbSBvdGhlciBkb2N1bWVudHM7XG4iCiAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzLFxuZm91bmQgJXMiICUgKHNlbGYsIG4ub3duZXJEb2N1bWVudCkpCiAgICAgICAgIGlmIG4ubm9kZVR5cGUgbm90IGluIChOb2RlLkVMRU1FTlRfTk9ERSwgTm9kZS5BVFRSSUJVVEVfTk9ERSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKICAgICAgICAgICAgICAgICAicmVuYW1lTm9kZSgpIG9ubHkgYXBwbGllcyB0byBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXMiKQogICAgICAgICBpZiBuYW1lc3BhY2VVUkkgIT0gRU1QVFlfTkFNRVNQQUNFOgogICAgICAgICAgICAgaWYgJzonIGluIG5hbWU6CiAgICAgICAgICAgICAgICAgcHJlZml4LCBsb2NhbE5hbWUgPSBuYW1lLnNwbGl0KCc6JywgMSkKICAgICAgICAgICAgICAgICBpZiAoICBwcmVmaXggPT0gInhtbG5zIgotICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sY29yZS5kb20uWE1MTlNfTkFNRVNQQUNFKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTmFtZXNwYWNlRXJyKAorICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sLmRvbS5YTUxOU19OQU1FU1BBQ0UpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5hbWVzcGFjZUVycigKICAgICAgICAgICAgICAgICAgICAgICAgICJpbGxlZ2FsIHVzZSBvZiAneG1sbnMnIHByZWZpeCIpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGlmICggIG5hbWUgPT0gInhtbG5zIgotICAgICAgICAgICAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VVUkkgIT0geG1sY29yZS5kb20uWE1MTlNfTkFNRVNQQUNFCisgICAgICAgICAgICAgICAgICAgICAgYW5kIG5hbWVzcGFjZVVSSSAhPSB4bWwuZG9tLlhNTE5TX05BTUVTUEFDRQogICAgICAgICAgICAgICAgICAgICAgIGFuZCBuLm5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpOgotICAgICAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5OYW1lc3BhY2VFcnIoCisgICAgICAgICAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTmFtZXNwYWNlRXJyKAogICAgICAgICAgICAgICAgICAgICAgICAgImlsbGVnYWwgdXNlIG9mIHRoZSAneG1sbnMnIGF0dHJpYnV0ZSIpCiAgICAgICAgICAgICAgICAgcHJlZml4ID0gTm9uZQogICAgICAgICAgICAgICAgIGxvY2FsTmFtZSA9IG5hbWUKQEAgLTE4MTAsOSArMTgxMCw5IEBACiAgICAgQ2FsbGVkIGJ5IE5vZGUuY2xvbmVOb2RlIGFuZCBEb2N1bWVudC5pbXBvcnROb2RlCiAgICAgIiIiCiAgICAgaWYgbm9kZS5vd25lckRvY3VtZW50LmlzU2FtZU5vZGUobmV3T3duZXJEb2N1bWVudCk6Ci0gICAgICAgIG9wZXJhdGlvbiA9IHhtbGNvcmUuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAorICAgICAgICBvcGVyYXRpb24gPSB4bWwuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRAogICAgIGVsc2U6Ci0gICAgICAgIG9wZXJhdGlvbiA9IHhtbGNvcmUuZG9tLlVzZXJEYXRhSGFuZGxlci5OT0RFX0lNUE9SVEVECisgICAgICAgIG9wZXJhdGlvbiA9IHhtbC5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKICAgICBpZiBub2RlLm5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFOgogICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG5vZGUubmFtZXNwYWNlVVJJLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubm9kZU5hbWUpCkBAIC0xODQ5LDcgKzE4NDksNyBAQAogICAgICAgICBjbG9uZS52YWx1ZSA9IG5vZGUudmFsdWUKICAgICBlbGlmIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREU6CiAgICAgICAgIGFzc2VydCBub2RlLm93bmVyRG9jdW1lbnQgaXMgbm90IG5ld093bmVyRG9jdW1lbnQKLSAgICAgICAgb3BlcmF0aW9uID0geG1sY29yZS5kb20uVXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKKyAgICAgICAgb3BlcmF0aW9uID0geG1sLmRvbS5Vc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRAogICAgICAgICBjbG9uZSA9IG5ld093bmVyRG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlRG9jdW1lbnRUeXBlKAogICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnB1YmxpY0lkLCBub2RlLnN5c3RlbUlkKQogICAgICAgICBjbG9uZS5vd25lckRvY3VtZW50ID0gbmV3T3duZXJEb2N1bWVudApAQCAtMTg3Niw3ICsxODc2LDcgQEAKICAgICAgICAgIyBOb3RlIHRoZSBjbG9uaW5nIG9mIERvY3VtZW50IGFuZCBEb2N1bWVudFR5cGUgbm9kZXMgaXMKICAgICAgICAgIyBpbXBsZW1lbmV0YXRpb24gc3BlY2lmaWMuICBtaW5pZG9tIGhhbmRsZXMgdGhvc2UgY2FzZXMKICAgICAgICAgIyBkaXJlY3RseSBpbiB0aGUgY2xvbmVOb2RlKCkgbWV0aG9kcy4KLSAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKCJDYW5ub3QgY2xvbmUgbm9kZSAlcyIgJSByZXByKG5vZGUpKQorICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigiQ2Fubm90IGNsb25lIG5vZGUgJXMiICUgcmVwcihub2RlKSkKIAogICAgICMgQ2hlY2sgZm9yIF9jYWxsX3VzZXJfZGF0YV9oYW5kbGVyKCkgc2luY2UgdGhpcyBjb3VsZCBjb25jZWl2YWJseQogICAgICMgdXNlZCB3aXRoIG90aGVyIERPTSBpbXBsZW1lbnRhdGlvbnMgKG9uZSBvZiB0aGUgRm91clRob3VnaHQKQEAgLTE5MDksMjAgKzE5MDksMjAgQEAKIGRlZiBwYXJzZShmaWxlLCBwYXJzZXI9Tm9uZSwgYnVmc2l6ZT1Ob25lKToKICAgICAiIiJQYXJzZSBhIGZpbGUgaW50byBhIERPTSBieSBmaWxlbmFtZSBvciBmaWxlIG9iamVjdC4iIiIKICAgICBpZiBwYXJzZXIgaXMgTm9uZSBhbmQgbm90IGJ1ZnNpemU6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgogICAgICAgICByZXR1cm4gZXhwYXRidWlsZGVyLnBhcnNlKGZpbGUpCiAgICAgZWxzZToKLSAgICAgICAgZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgcHVsbGRvbQorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IHB1bGxkb20KICAgICAgICAgcmV0dXJuIF9kb19wdWxsZG9tX3BhcnNlKHB1bGxkb20ucGFyc2UsIChmaWxlLCksCiAgICAgICAgICAgICB7J3BhcnNlcic6IHBhcnNlciwgJ2J1ZnNpemUnOiBidWZzaXplfSkKIAogZGVmIHBhcnNlU3RyaW5nKHN0cmluZywgcGFyc2VyPU5vbmUpOgogICAgICIiIlBhcnNlIGEgZmlsZSBpbnRvIGEgRE9NIGZyb20gYSBzdHJpbmcuIiIiCiAgICAgaWYgcGFyc2VyIGlzIE5vbmU6Ci0gICAgICAgIGZyb20geG1sY29yZS5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IGV4cGF0YnVpbGRlcgogICAgICAgICByZXR1cm4gZXhwYXRidWlsZGVyLnBhcnNlU3RyaW5nKHN0cmluZykKICAgICBlbHNlOgotICAgICAgICBmcm9tIHhtbGNvcmUuZG9tIGltcG9ydCBwdWxsZG9tCisgICAgICAgIGZyb20geG1sLmRvbSBpbXBvcnQgcHVsbGRvbQogICAgICAgICByZXR1cm4gX2RvX3B1bGxkb21fcGFyc2UocHVsbGRvbS5wYXJzZVN0cmluZywgKHN0cmluZywpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeydwYXJzZXInOiBwYXJzZXJ9KQogCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20vcHVsbGRvbS5weSBiL0xpYi94bWwvZG9tL3B1bGxkb20ucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL3B1bGxkb20ucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL3B1bGxkb20ucHkKaW5kZXggZGFkMzcxOC4uMThmNDliNSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL3B1bGxkb20ucHkKKysrIGIvTGliL3htbC9kb20vcHVsbGRvbS5weQpAQCAtMSw1ICsxLDUgQEAKLWltcG9ydCB4bWxjb3JlLnNheAotaW1wb3J0IHhtbGNvcmUuc2F4LmhhbmRsZXIKK2ltcG9ydCB4bWwuc2F4CitpbXBvcnQgeG1sLnNheC5oYW5kbGVyCiBpbXBvcnQgdHlwZXMKIAogdHJ5OgpAQCAtMTYsMTIgKzE2LDEyIEBACiBJR05PUkFCTEVfV0hJVEVTUEFDRSA9ICJJR05PUkFCTEVfV0hJVEVTUEFDRSIKIENIQVJBQ1RFUlMgPSAiQ0hBUkFDVEVSUyIKIAotY2xhc3MgUHVsbERPTSh4bWxjb3JlLnNheC5Db250ZW50SGFuZGxlcik6CitjbGFzcyBQdWxsRE9NKHhtbC5zYXguQ29udGVudEhhbmRsZXIpOgogICAgIF9sb2NhdG9yID0gTm9uZQogICAgIGRvY3VtZW50ID0gTm9uZQogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGRvY3VtZW50RmFjdG9yeT1Ob25lKToKLSAgICAgICAgZnJvbSB4bWxjb3JlLmRvbSBpbXBvcnQgWE1MX05BTUVTUEFDRQorICAgICAgICBmcm9tIHhtbC5kb20gaW1wb3J0IFhNTF9OQU1FU1BBQ0UKICAgICAgICAgc2VsZi5kb2N1bWVudEZhY3RvcnkgPSBkb2N1bWVudEZhY3RvcnkKICAgICAgICAgc2VsZi5maXJzdEV2ZW50ID0gW05vbmUsIE5vbmVdCiAgICAgICAgIHNlbGYubGFzdEV2ZW50ID0gc2VsZi5maXJzdEV2ZW50CkBAIC0xNjQsOCArMTY0LDggQEAKIAogICAgIGRlZiBzdGFydERvY3VtZW50KHNlbGYpOgogICAgICAgICBpZiBzZWxmLmRvY3VtZW50RmFjdG9yeSBpcyBOb25lOgotICAgICAgICAgICAgaW1wb3J0IHhtbGNvcmUuZG9tLm1pbmlkb20KLSAgICAgICAgICAgIHNlbGYuZG9jdW1lbnRGYWN0b3J5ID0geG1sY29yZS5kb20ubWluaWRvbS5Eb2N1bWVudC5pbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgaW1wb3J0IHhtbC5kb20ubWluaWRvbQorICAgICAgICAgICAgc2VsZi5kb2N1bWVudEZhY3RvcnkgPSB4bWwuZG9tLm1pbmlkb20uRG9jdW1lbnQuaW1wbGVtZW50YXRpb24KIAogICAgIGRlZiBidWlsZERvY3VtZW50KHNlbGYsIHVyaSwgdGFnbmFtZSk6CiAgICAgICAgICMgQ2FuJ3QgZG8gdGhhdCBpbiBzdGFydERvY3VtZW50LCBzaW5jZSB3ZSBuZWVkIHRoZSB0YWduYW1lCkBAIC0yMTksNyArMjE5LDcgQEAKICAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIHNlbGYucHVsbGRvbSA9IFB1bGxET00oKQogICAgICAgICAjIFRoaXMgY29udGVudCBoYW5kbGVyIHJlbGllcyBvbiBuYW1lc3BhY2Ugc3VwcG9ydAotICAgICAgICBzZWxmLnBhcnNlci5zZXRGZWF0dXJlKHhtbGNvcmUuc2F4LmhhbmRsZXIuZmVhdHVyZV9uYW1lc3BhY2VzLCAxKQorICAgICAgICBzZWxmLnBhcnNlci5zZXRGZWF0dXJlKHhtbC5zYXguaGFuZGxlci5mZWF0dXJlX25hbWVzcGFjZXMsIDEpCiAgICAgICAgIHNlbGYucGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHNlbGYucHVsbGRvbSkKIAogICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBwb3MpOgpAQCAtMzM1LDcgKzMzNSw3IEBACiAgICAgZWxzZToKICAgICAgICAgc3RyZWFtID0gc3RyZWFtX29yX3N0cmluZwogICAgIGlmIG5vdCBwYXJzZXI6Ci0gICAgICAgIHBhcnNlciA9IHhtbGNvcmUuc2F4Lm1ha2VfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyID0geG1sLnNheC5tYWtlX3BhcnNlcigpCiAgICAgcmV0dXJuIERPTUV2ZW50U3RyZWFtKHN0cmVhbSwgcGFyc2VyLCBidWZzaXplKQogCiBkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBwYXJzZXI9Tm9uZSk6CkBAIC0zNDcsNSArMzQ3LDUgQEAKICAgICBidWZzaXplID0gbGVuKHN0cmluZykKICAgICBidWYgPSBTdHJpbmdJTyhzdHJpbmcpCiAgICAgaWYgbm90IHBhcnNlcjoKLSAgICAgICAgcGFyc2VyID0geG1sY29yZS5zYXgubWFrZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIgPSB4bWwuc2F4Lm1ha2VfcGFyc2VyKCkKICAgICByZXR1cm4gRE9NRXZlbnRTdHJlYW0oYnVmLCBwYXJzZXIsIGJ1ZnNpemUpCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9kb20veG1sYnVpbGRlci5weSBiL0xpYi94bWwvZG9tL3htbGJ1aWxkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvZG9tL3htbGJ1aWxkZXIucHkKaW5kZXggNjU2NmQzYy4uYWMxZDQ0OCAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkKKysrIGIvTGliL3htbC9kb20veG1sYnVpbGRlci5weQpAQCAtMSw5ICsxLDkgQEAKICIiIkltcGxlbWVudGF0aW9uIG9mIHRoZSBET00gTGV2ZWwgMyAnTFMtTG9hZCcgZmVhdHVyZS4iIiIKIAogaW1wb3J0IGNvcHkKLWltcG9ydCB4bWxjb3JlLmRvbQoraW1wb3J0IHhtbC5kb20KIAotZnJvbSB4bWxjb3JlLmRvbS5Ob2RlRmlsdGVyIGltcG9ydCBOb2RlRmlsdGVyCitmcm9tIHhtbC5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgogCiAKIF9fYWxsX18gPSBbIkRPTUJ1aWxkZXIiLCAiRE9NRW50aXR5UmVzb2x2ZXIiLCAiRE9NSW5wdXRTb3VyY2UiXQpAQCAtNzgsMTMgKzc4LDEzIEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2V0dGluZ3MgPSBzZWxmLl9zZXR0aW5nc1soX25hbWVfeGZvcm0obmFtZSksIHN0YXRlKV0KICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCisgICAgICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBmZWF0dXJlOiAlciIgJSAobmFtZSwpKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gc2V0dGluZ3M6CiAgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZi5fb3B0aW9ucywgbmFtZSwgdmFsdWUpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigidW5rbm93biBmZWF0dXJlOiAiICsgcmVwcihuYW1lKSkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoInVua25vd24gZmVhdHVyZTogIiArIHJlcHIobmFtZSkpCiAKICAgICBkZWYgc3VwcG9ydHNGZWF0dXJlKHNlbGYsIG5hbWUpOgogICAgICAgICByZXR1cm4gaGFzYXR0cihzZWxmLl9vcHRpb25zLCBfbmFtZV94Zm9ybShuYW1lKSkKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igb3B0aW9ucy5jcmVhdGVfZW50aXR5X3JlZl9ub2RlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igb3B0aW9ucy5lbnRpdGllcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igb3B0aW9ucy5jZGF0YV9zZWN0aW9ucykpCi0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RGb3VuZEVycigiZmVhdHVyZSAlcyBub3Qga25vd24iICUgcmVwcihuYW1lKSkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uTm90Rm91bmRFcnIoImZlYXR1cmUgJXMgbm90IGtub3duIiAlIHJlcHIobmFtZSkpCiAKICAgICBkZWYgcGFyc2VVUkkoc2VsZiwgdXJpKToKICAgICAgICAgaWYgc2VsZi5lbnRpdHlSZXNvbHZlcjoKQEAgLTIwMCw4ICsyMDAsOCBAQAogICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKCJIYXZlbid0IHdyaXR0ZW4gdGhpcyB5ZXQuLi4iKQogCiAgICAgZGVmIF9wYXJzZV9ieXRlc3RyZWFtKHNlbGYsIHN0cmVhbSwgb3B0aW9ucyk6Ci0gICAgICAgIGltcG9ydCB4bWxjb3JlLmRvbS5leHBhdGJ1aWxkZXIKLSAgICAgICAgYnVpbGRlciA9IHhtbGNvcmUuZG9tLmV4cGF0YnVpbGRlci5tYWtlQnVpbGRlcihvcHRpb25zKQorICAgICAgICBpbXBvcnQgeG1sLmRvbS5leHBhdGJ1aWxkZXIKKyAgICAgICAgYnVpbGRlciA9IHhtbC5kb20uZXhwYXRidWlsZGVyLm1ha2VCdWlsZGVyKG9wdGlvbnMpCiAgICAgICAgIHJldHVybiBidWlsZGVyLnBhcnNlRmlsZShzdHJlYW0pCiAKIApAQCAtMzQwLDcgKzM0MCw3IEBACiAgICAgICAgIHJldHVybiBGYWxzZQogICAgIGRlZiBfc2V0X2FzeW5jKHNlbGYsIGFzeW5jKToKICAgICAgICAgaWYgYXN5bmM6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCisgICAgICAgICAgICByYWlzZSB4bWwuZG9tLk5vdFN1cHBvcnRlZEVycigKICAgICAgICAgICAgICAgICAiYXN5bmNocm9ub3VzIGRvY3VtZW50IGxvYWRpbmcgaXMgbm90IHN1cHBvcnRlZCIpCiAKICAgICBkZWYgYWJvcnQoc2VsZik6CkBAIC0zNTksNyArMzU5LDcgQEAKICAgICAgICAgaWYgc25vZGUgaXMgTm9uZToKICAgICAgICAgICAgIHNub2RlID0gc2VsZgogICAgICAgICBlbGlmIHNub2RlLm93bmVyRG9jdW1lbnQgaXMgbm90IHNlbGY6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Xcm9uZ0RvY3VtZW50RXJyKCkKKyAgICAgICAgICAgIHJhaXNlIHhtbC5kb20uV3JvbmdEb2N1bWVudEVycigpCiAgICAgICAgIHJldHVybiBzbm9kZS50b3htbCgpCiAKIApAQCAtMzY5LDEyICszNjksMTIgQEAKIAogICAgIGRlZiBjcmVhdGVET01CdWlsZGVyKHNlbGYsIG1vZGUsIHNjaGVtYVR5cGUpOgogICAgICAgICBpZiBzY2hlbWFUeXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgInNjaGVtYVR5cGUgbm90IHlldCBzdXBwb3J0ZWQiKQogICAgICAgICBpZiBtb2RlID09IHNlbGYuTU9ERV9TWU5DSFJPTk9VUzoKICAgICAgICAgICAgIHJldHVybiBET01CdWlsZGVyKCkKICAgICAgICAgaWYgbW9kZSA9PSBzZWxmLk1PREVfQVNZTkNIUk9OT1VTOgotICAgICAgICAgICAgcmFpc2UgeG1sY29yZS5kb20uTm90U3VwcG9ydGVkRXJyKAorICAgICAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob3RTdXBwb3J0ZWRFcnIoCiAgICAgICAgICAgICAgICAgImFzeW5jaHJvbm91cyBidWlsZGVycyBhcmUgbm90IHN1cHBvcnRlZCIpCiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVua25vd24gdmFsdWUgZm9yIG1vZGUiKQogCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9ldHJlZS9FbGVtZW50SW5jbHVkZS5weSBiL0xpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKaW5kZXggZDdmODViMy4uOTc0Y2MyMSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudEluY2x1ZGUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50SW5jbHVkZS5weQpAQCAtNDksNyArNDksNyBAQAogIyMKIAogaW1wb3J0IGNvcHkKLWZyb20gLiBpbXBvcnQgRWxlbWVudFRyZWUKK2ltcG9ydCBFbGVtZW50VHJlZQogCiBYSU5DTFVERSA9ICJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZX0iCiAKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRQYXRoLnB5IGIvTGliL3htbC9ldHJlZS9FbGVtZW50UGF0aC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudFBhdGgucHkKcmVuYW1lIHRvIExpYi94bWwvZXRyZWUvRWxlbWVudFBhdGgucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2V0cmVlL0VsZW1lbnRUcmVlLnB5IGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9ldHJlZS9FbGVtZW50VHJlZS5weQpyZW5hbWUgdG8gTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQppbmRleCBiMzk3NjBlYS4uN2RiYzcyZSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZXRyZWUvRWxlbWVudFRyZWUucHkKKysrIGIvTGliL3htbC9ldHJlZS9FbGVtZW50VHJlZS5weQpAQCAtODQsNyArODQsNyBAQAogICAgICJ0b3N0cmluZyIsCiAgICAgIlRyZWVCdWlsZGVyIiwKICAgICAiVkVSU0lPTiIsICJYTUwiLAotICAgICJYTUxUcmVlQnVpbGRlciIsCisgICAgIlhNTFBhcnNlciIsICJYTUxUcmVlQnVpbGRlciIsCiAgICAgXQogCiAjIwpAQCAtMTExMiw3ICsxMTEyLDcgQEAKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBodG1sPTAsIHRhcmdldD1Ob25lKToKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgZnJvbSB4bWxjb3JlLnBhcnNlcnMgaW1wb3J0IGV4cGF0CisgICAgICAgICAgICBmcm9tIHhtbC5wYXJzZXJzIGltcG9ydCBleHBhdAogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigKICAgICAgICAgICAgICAgICAiTm8gbW9kdWxlIG5hbWVkIGV4cGF0OyB1c2UgU2ltcGxlWE1MVHJlZUJ1aWxkZXIgaW5zdGVhZCIKQEAgLTExOTQsNyArMTE5NCw3IEBACiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgc2VsZi5fdGFyZ2V0LmRhdGEoc2VsZi5lbnRpdHlbdGV4dFsxOi0xXV0pCiAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgZnJvbSB4bWxjb3JlLnBhcnNlcnMgaW1wb3J0IGV4cGF0CisgICAgICAgICAgICAgICAgZnJvbSB4bWwucGFyc2VycyBpbXBvcnQgZXhwYXQKICAgICAgICAgICAgICAgICByYWlzZSBleHBhdC5lcnJvcigKICAgICAgICAgICAgICAgICAgICAgInVuZGVmaW5lZCBlbnRpdHkgJXM6IGxpbmUgJWQsIGNvbHVtbiAlZCIgJQogICAgICAgICAgICAgICAgICAgICAodGV4dCwgc2VsZi5fcGFyc2VyLkVycm9yTGluZU51bWJlciwKQEAgLTEyNTUsMyArMTI1NSw2IEBACiAgICAgICAgIHRyZWUgPSBzZWxmLl90YXJnZXQuY2xvc2UoKQogICAgICAgICBkZWwgc2VsZi5fdGFyZ2V0LCBzZWxmLl9wYXJzZXIgIyBnZXQgcmlkIG9mIGNpcmN1bGFyIHJlZmVyZW5jZXMKICAgICAgICAgcmV0dXJuIHRyZWUKKworIyBjb21wYXRpYmlsaXR5CitYTUxQYXJzZXIgPSBYTUxUcmVlQnVpbGRlcgpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZXRyZWUvX19pbml0X18ucHkgYi9MaWIveG1sL2V0cmVlL19faW5pdF9fLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9ldHJlZS9fX2luaXRfXy5weQpyZW5hbWUgdG8gTGliL3htbC9ldHJlZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZXRyZWUvY0VsZW1lbnRUcmVlLnB5IGIvTGliL3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL2V0cmVlL2NFbGVtZW50VHJlZS5weQpyZW5hbWUgdG8gTGliL3htbC9ldHJlZS9jRWxlbWVudFRyZWUucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3BhcnNlcnMvX19pbml0X18ucHkgYi9MaWIveG1sL3BhcnNlcnMvX19pbml0X18ucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3BhcnNlcnMvX19pbml0X18ucHkKcmVuYW1lIHRvIExpYi94bWwvcGFyc2Vycy9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvcGFyc2Vycy9leHBhdC5weSBiL0xpYi94bWwvcGFyc2Vycy9leHBhdC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvcGFyc2Vycy9leHBhdC5weQpyZW5hbWUgdG8gTGliL3htbC9wYXJzZXJzL2V4cGF0LnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvX19pbml0X18ucHkgYi9MaWIveG1sL3NheC9fX2luaXRfXy5weQpzaW1pbGFyaXR5IGluZGV4IDg5JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9zYXgvX19pbml0X18ucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L19faW5pdF9fLnB5CmluZGV4IDhhZmJkYjAuLjZiMWIxYmEgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL3NheC9fX2luaXRfXy5weQorKysgYi9MaWIveG1sL3NheC9fX2luaXRfXy5weQpAQCAtMTksMTEgKzE5LDExIEBACiBleHBhdHJlYWRlciAtLSBEcml2ZXIgdGhhdCBhbGxvd3MgdXNlIG9mIHRoZSBFeHBhdCBwYXJzZXIgd2l0aCBTQVguCiAiIiIKIAotZnJvbSAueG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZQotZnJvbSAuaGFuZGxlciBpbXBvcnQgQ29udGVudEhhbmRsZXIsIEVycm9ySGFuZGxlcgotZnJvbSAuX2V4Y2VwdGlvbnMgaW1wb3J0IChTQVhFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFNBWFJlYWRlck5vdEF2YWlsYWJsZSkKK2Zyb20geG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZQorZnJvbSBoYW5kbGVyIGltcG9ydCBDb250ZW50SGFuZGxlciwgRXJyb3JIYW5kbGVyCitmcm9tIF9leGNlcHRpb25zIGltcG9ydCBTQVhFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBWFBhcnNlRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNBWFJlYWRlck5vdEF2YWlsYWJsZQogCiAKIGRlZiBwYXJzZShzb3VyY2UsIGhhbmRsZXIsIGVycm9ySGFuZGxlcj1FcnJvckhhbmRsZXIoKSk6CkBAIC01MSwxMiArNTEsMTIgQEAKICMgdGhpcyBpcyB0aGUgcGFyc2VyIGxpc3QgdXNlZCBieSB0aGUgbWFrZV9wYXJzZXIgZnVuY3Rpb24gaWYgbm8KICMgYWx0ZXJuYXRpdmVzIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBmdW5jdGlvbgogCi1kZWZhdWx0X3BhcnNlcl9saXN0ID0gWyJ4bWxjb3JlLnNheC5leHBhdHJlYWRlciJdCitkZWZhdWx0X3BhcnNlcl9saXN0ID0gWyJ4bWwuc2F4LmV4cGF0cmVhZGVyIl0KIAogIyB0ZWxsIG1vZHVsZWZpbmRlciB0aGF0IGltcG9ydGluZyBzYXggcG90ZW50aWFsbHkgaW1wb3J0cyBleHBhdHJlYWRlcgogX2ZhbHNlID0gMAogaWYgX2ZhbHNlOgotICAgIGltcG9ydCB4bWxjb3JlLnNheC5leHBhdHJlYWRlcgorICAgIGltcG9ydCB4bWwuc2F4LmV4cGF0cmVhZGVyCiAKIGltcG9ydCBvcywgc3lzCiBpZiBvcy5lbnZpcm9uLmhhc19rZXkoIlBZX1NBWF9QQVJTRVIiKToKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3NheC9fZXhjZXB0aW9ucy5weSBiL0xpYi94bWwvc2F4L19leGNlcHRpb25zLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9zYXgvX2V4Y2VwdGlvbnMucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L19leGNlcHRpb25zLnB5CmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9zYXgvZXhwYXRyZWFkZXIucHkgYi9MaWIveG1sL3NheC9leHBhdHJlYWRlci5weQpzaW1pbGFyaXR5IGluZGV4IDk1JQpyZW5hbWUgZnJvbSBMaWIveG1sY29yZS9zYXgvZXhwYXRyZWFkZXIucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L2V4cGF0cmVhZGVyLnB5CmluZGV4IDZmYmQyMmUuLmJiOWMyOTQgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL3NheC9leHBhdHJlYWRlci5weQorKysgYi9MaWIveG1sL3NheC9leHBhdHJlYWRlci5weQpAQCAtNSwyNyArNSwyNyBAQAogCiB2ZXJzaW9uID0gIjAuMjAiCiAKLWZyb20geG1sY29yZS5zYXguX2V4Y2VwdGlvbnMgaW1wb3J0ICoKLWZyb20geG1sY29yZS5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV92YWxpZGF0aW9uLCBmZWF0dXJlX25hbWVzcGFjZXMKLWZyb20geG1sY29yZS5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV9uYW1lc3BhY2VfcHJlZml4ZXMKLWZyb20geG1sY29yZS5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV9leHRlcm5hbF9nZXMsIGZlYXR1cmVfZXh0ZXJuYWxfcGVzCi1mcm9tIHhtbGNvcmUuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfc3RyaW5nX2ludGVybmluZwotZnJvbSB4bWxjb3JlLnNheC5oYW5kbGVyIGltcG9ydCBwcm9wZXJ0eV94bWxfc3RyaW5nLCBwcm9wZXJ0eV9pbnRlcm5pbmdfZGljdAorZnJvbSB4bWwuc2F4Ll9leGNlcHRpb25zIGltcG9ydCAqCitmcm9tIHhtbC5zYXguaGFuZGxlciBpbXBvcnQgZmVhdHVyZV92YWxpZGF0aW9uLCBmZWF0dXJlX25hbWVzcGFjZXMKK2Zyb20geG1sLnNheC5oYW5kbGVyIGltcG9ydCBmZWF0dXJlX25hbWVzcGFjZV9wcmVmaXhlcworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfZXh0ZXJuYWxfZ2VzLCBmZWF0dXJlX2V4dGVybmFsX3BlcworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IGZlYXR1cmVfc3RyaW5nX2ludGVybmluZworZnJvbSB4bWwuc2F4LmhhbmRsZXIgaW1wb3J0IHByb3BlcnR5X3htbF9zdHJpbmcsIHByb3BlcnR5X2ludGVybmluZ19kaWN0CiAKLSMgeG1sY29yZS5wYXJzZXJzLmV4cGF0IGRvZXMgbm90IHJhaXNlIEltcG9ydEVycm9yIGluIEp5dGhvbgorIyB4bWwucGFyc2Vycy5leHBhdCBkb2VzIG5vdCByYWlzZSBJbXBvcnRFcnJvciBpbiBKeXRob24KIGltcG9ydCBzeXMKIGlmIHN5cy5wbGF0Zm9ybVs6NF0gPT0gImphdmEiOgogICAgIHJhaXNlIFNBWFJlYWRlck5vdEF2YWlsYWJsZSgiZXhwYXQgbm90IGF2YWlsYWJsZSBpbiBKYXZhIiwgTm9uZSkKIGRlbCBzeXMKIAogdHJ5OgotICAgIGZyb20geG1sY29yZS5wYXJzZXJzIGltcG9ydCBleHBhdAorICAgIGZyb20geG1sLnBhcnNlcnMgaW1wb3J0IGV4cGF0CiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgcmFpc2UgU0FYUmVhZGVyTm90QXZhaWxhYmxlKCJleHBhdCBub3Qgc3VwcG9ydGVkIiwgTm9uZSkKIGVsc2U6CiAgICAgaWYgbm90IGhhc2F0dHIoZXhwYXQsICJQYXJzZXJDcmVhdGUiKToKICAgICAgICAgcmFpc2UgU0FYUmVhZGVyTm90QXZhaWxhYmxlKCJleHBhdCBub3Qgc3VwcG9ydGVkIiwgTm9uZSkKLWZyb20geG1sY29yZS5zYXggaW1wb3J0IHhtbHJlYWRlciwgc2F4dXRpbHMsIGhhbmRsZXIKK2Zyb20geG1sLnNheCBpbXBvcnQgeG1scmVhZGVyLCBzYXh1dGlscywgaGFuZGxlcgogCiBBdHRyaWJ1dGVzSW1wbCA9IHhtbHJlYWRlci5BdHRyaWJ1dGVzSW1wbAogQXR0cmlidXRlc05TSW1wbCA9IHhtbHJlYWRlci5BdHRyaWJ1dGVzTlNJbXBsCkBAIC00MDcsOCArNDA3LDggQEAKICMgLS0tCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgaW1wb3J0IHhtbGNvcmUuc2F4CisgICAgaW1wb3J0IHhtbC5zYXgKICAgICBwID0gY3JlYXRlX3BhcnNlcigpCi0gICAgcC5zZXRDb250ZW50SGFuZGxlcih4bWxjb3JlLnNheC5YTUxHZW5lcmF0b3IoKSkKLSAgICBwLnNldEVycm9ySGFuZGxlcih4bWxjb3JlLnNheC5FcnJvckhhbmRsZXIoKSkKKyAgICBwLnNldENvbnRlbnRIYW5kbGVyKHhtbC5zYXguWE1MR2VuZXJhdG9yKCkpCisgICAgcC5zZXRFcnJvckhhbmRsZXIoeG1sLnNheC5FcnJvckhhbmRsZXIoKSkKICAgICBwLnBhcnNlKCIuLi8uLi8uLi9oYW1sZXQueG1sIikKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3NheC9oYW5kbGVyLnB5IGIvTGliL3htbC9zYXgvaGFuZGxlci5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L2hhbmRsZXIucHkKcmVuYW1lIHRvIExpYi94bWwvc2F4L2hhbmRsZXIucHkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3NheC9zYXh1dGlscy5weSBiL0xpYi94bWwvc2F4L3NheHV0aWxzLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi94bWxjb3JlL3NheC9zYXh1dGlscy5weQpyZW5hbWUgdG8gTGliL3htbC9zYXgvc2F4dXRpbHMucHkKaW5kZXggODgwZGU4MC4uYTQ5NjUxOSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvc2F4L3NheHV0aWxzLnB5CisrKyBiL0xpYi94bWwvc2F4L3NheHV0aWxzLnB5CkBAIC00LDggKzQsOCBAQAogIiIiCiAKIGltcG9ydCBvcywgdXJscGFyc2UsIHVybGxpYiwgdHlwZXMKLWZyb20gLiBpbXBvcnQgaGFuZGxlcgotZnJvbSAuIGltcG9ydCB4bWxyZWFkZXIKK2ltcG9ydCBoYW5kbGVyCitpbXBvcnQgeG1scmVhZGVyCiAKIHRyeToKICAgICBfU3RyaW5nVHlwZXMgPSBbdHlwZXMuU3RyaW5nVHlwZSwgdHlwZXMuVW5pY29kZVR5cGVdCkBAIC02OCw2ICs2OCw4IEBACiAgICAgdGhlIG9wdGlvbmFsIGVudGl0aWVzIHBhcmFtZXRlci4gIFRoZSBrZXlzIGFuZCB2YWx1ZXMgbXVzdCBhbGwgYmUKICAgICBzdHJpbmdzOyBlYWNoIGtleSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggaXRzIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgIiIiCisgICAgZW50aXRpZXMgPSBlbnRpdGllcy5jb3B5KCkKKyAgICBlbnRpdGllcy51cGRhdGUoeydcbic6ICcmIzEwOycsICdccic6ICcmIzEzOycsICdcdCc6JyYjOTsnfSkKICAgICBkYXRhID0gZXNjYXBlKGRhdGEsIGVudGl0aWVzKQogICAgIGlmICciJyBpbiBkYXRhOgogICAgICAgICBpZiAiJyIgaW4gZGF0YToKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL3NheC94bWxyZWFkZXIucHkgYi9MaWIveG1sL3NheC94bWxyZWFkZXIucHkKc2ltaWxhcml0eSBpbmRleCA5OCUKcmVuYW1lIGZyb20gTGliL3htbGNvcmUvc2F4L3htbHJlYWRlci5weQpyZW5hbWUgdG8gTGliL3htbC9zYXgveG1scmVhZGVyLnB5CmluZGV4IDFjYWRlNjUuLjlhMjM2MWUgMTAwNjQ0Ci0tLSBhL0xpYi94bWxjb3JlL3NheC94bWxyZWFkZXIucHkKKysrIGIvTGliL3htbC9zYXgveG1scmVhZGVyLnB5CkBAIC0xLDkgKzEsOSBAQAogIiIiQW4gWE1MIFJlYWRlciBpcyB0aGUgU0FYIDIgbmFtZSBmb3IgYW4gWE1MIHBhcnNlci4gWE1MIFBhcnNlcnMKIHNob3VsZCBiZSBiYXNlZCBvbiB0aGlzIGNvZGUuICIiIgogCi1mcm9tIC4gaW1wb3J0IGhhbmRsZXIKK2ltcG9ydCBoYW5kbGVyCiAKLWZyb20gLl9leGNlcHRpb25zIGltcG9ydCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24KK2Zyb20gX2V4Y2VwdGlvbnMgaW1wb3J0IFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbgogCiAKICMgPT09PT0gWE1MUkVBREVSID09PT09CkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgWE1MUmVhZGVyLl9faW5pdF9fKHNlbGYpCiAKICAgICBkZWYgcGFyc2Uoc2VsZiwgc291cmNlKToKLSAgICAgICAgZnJvbSAuIGltcG9ydCBzYXh1dGlscworICAgICAgICBpbXBvcnQgc2F4dXRpbHMKICAgICAgICAgc291cmNlID0gc2F4dXRpbHMucHJlcGFyZV9pbnB1dF9zb3VyY2Uoc291cmNlKQogCiAgICAgICAgIHNlbGYucHJlcGFyZVBhcnNlcihzb3VyY2UpCmRpZmYgLS1naXQgYS9MaWIveG1sY29yZS9fX2luaXRfXy5weSBiL0xpYi94bWxjb3JlL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZkOGRkLi4wMDAwMDAwCi0tLSBhL0xpYi94bWxjb3JlL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIiIiQ29yZSBYTUwgc3VwcG9ydCBmb3IgUHl0aG9uLgotCi1UaGlzIHBhY2thZ2UgY29udGFpbnMgZm91ciBzdWItcGFja2FnZXM6Ci0KLWRvbSAtLSBUaGUgVzNDIERvY3VtZW50IE9iamVjdCBNb2RlbC4gIFRoaXMgc3VwcG9ydHMgRE9NIExldmVsIDEgKwotICAgICAgIE5hbWVzcGFjZXMuCi0KLXBhcnNlcnMgLS0gUHl0aG9uIHdyYXBwZXJzIGZvciBYTUwgcGFyc2VycyAoY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgRXhwYXQpLgotCi1zYXggLS0gVGhlIFNpbXBsZSBBUEkgZm9yIFhNTCwgZGV2ZWxvcGVkIGJ5IFhNTC1EZXYsIGxlZCBieSBEYXZpZAotICAgICAgIE1lZ2dpbnNvbiBhbmQgcG9ydGVkIHRvIFB5dGhvbiBieSBMYXJzIE1hcml1cyBHYXJzaG9sLiAgVGhpcwotICAgICAgIHN1cHBvcnRzIHRoZSBTQVggMiBBUEkuCi0KLWV0cmVlIC0tIFRoZSBFbGVtZW50VHJlZSBYTUwgbGlicmFyeS4gIFRoaXMgaXMgYSBzdWJzZXQgb2YgdGhlIGZ1bGwKLSAgICAgICBFbGVtZW50VHJlZSBYTUwgcmVsZWFzZS4KLQotIiIiCi0KLQotX19hbGxfXyA9IFsiZG9tIiwgInBhcnNlcnMiLCAic2F4IiwgImV0cmVlIl0KZGlmZiAtLWdpdCBhL0xpYi96aXBmaWxlLnB5IGIvTGliL3ppcGZpbGUucHkKaW5kZXggMTY4ZDI0NS4uNWMzZmZmMyAxMDA2NDQKLS0tIGEvTGliL3ppcGZpbGUucHkKKysrIGIvTGliL3ppcGZpbGUucHkKQEAgLTEsNyArMSw4IEBACi0iUmVhZCBhbmQgd3JpdGUgWklQIGZpbGVzLiIKLQorIiIiCitSZWFkIGFuZCB3cml0ZSBaSVAgZmlsZXMuCisiIiIKIGltcG9ydCBzdHJ1Y3QsIG9zLCB0aW1lLCBzeXMKLWltcG9ydCBiaW5hc2NpaQoraW1wb3J0IGJpbmFzY2lpLCBjU3RyaW5nSU8KIAogdHJ5OgogICAgIGltcG9ydCB6bGliICMgV2UgbWF5IG5lZWQgaXRzIGNvbXByZXNzaW9uIG1ldGhvZApAQCAtOSwxMiArMTAsMjIgQEAKICAgICB6bGliID0gTm9uZQogCiBfX2FsbF9fID0gWyJCYWRaaXBmaWxlIiwgImVycm9yIiwgIlpJUF9TVE9SRUQiLCAiWklQX0RFRkxBVEVEIiwgImlzX3ppcGZpbGUiLAotICAgICAgICAgICAiWmlwSW5mbyIsICJaaXBGaWxlIiwgIlB5WmlwRmlsZSJdCisgICAgICAgICAgICJaaXBJbmZvIiwgIlppcEZpbGUiLCAiUHlaaXBGaWxlIiwgIkxhcmdlWmlwRmlsZSIgXQogCiBjbGFzcyBCYWRaaXBmaWxlKEV4Y2VwdGlvbik6CiAgICAgcGFzcworCisKK2NsYXNzIExhcmdlWmlwRmlsZShFeGNlcHRpb24pOgorICAgICIiIgorICAgIFJhaXNlZCB3aGVuIHdyaXRpbmcgYSB6aXBmaWxlLCB0aGUgemlwZmlsZSByZXF1aXJlcyBaSVA2NCBleHRlbnNpb25zCisgICAgYW5kIHRob3NlIGV4dGVuc2lvbnMgYXJlIGRpc2FibGVkLgorICAgICIiIgorCiBlcnJvciA9IEJhZFppcGZpbGUgICAgICAjIFRoZSBleGNlcHRpb24gcmFpc2VkIGJ5IHRoaXMgbW9kdWxlCiAKK1pJUDY0X0xJTUlUPSAoMSA8PCAzMSkgLSAxCisKICMgY29uc3RhbnRzIGZvciBaaXAgZmlsZSBjb21wcmVzc2lvbiBtZXRob2RzCiBaSVBfU1RPUkVEID0gMAogWklQX0RFRkxBVEVEID0gOApAQCAtMjcsNiArMzgsMTEgQEAKIHN0cmluZ0NlbnRyYWxEaXIgPSAiUEtcMDAxXDAwMiIgICAjIG1hZ2ljIG51bWJlciBmb3IgY2VudHJhbCBkaXJlY3RvcnkKIHN0cnVjdEZpbGVIZWFkZXIgPSAiPDRzMkI0SGxMTDJIIiAgIyAxMiBpdGVtcywgZmlsZSBoZWFkZXIgcmVjb3JkLCAzMCBieXRlcwogc3RyaW5nRmlsZUhlYWRlciA9ICJQS1wwMDNcMDA0IiAgICMgbWFnaWMgbnVtYmVyIGZvciBmaWxlIGhlYWRlcgorc3RydWN0RW5kQXJjaGl2ZTY0TG9jYXRvciA9ICI8NHNscWwiICMgNCBpdGVtcywgbG9jYXRlIFppcDY0IGhlYWRlciwgMjAgYnl0ZXMKK3N0cmluZ0VuZEFyY2hpdmU2NExvY2F0b3IgPSAiUEtceDA2XHgwNyIgIyBtYWdpYyB0b2tlbiBmb3IgbG9jYXRvciBoZWFkZXIKK3N0cnVjdEVuZEFyY2hpdmU2NCA9ICI8NHNxaGhsbHFxcXEiICMgMTAgaXRlbXMsIGVuZCBvZiBhcmNoaXZlIChaaXA2NCksIDU2IGJ5dGVzCitzdHJpbmdFbmRBcmNoaXZlNjQgPSAiUEtceDA2XHgwNiIgIyBtYWdpYyB0b2tlbiBmb3IgWmlwNjQgaGVhZGVyCisKIAogIyBpbmRleGVzIG9mIGVudHJpZXMgaW4gdGhlIGNlbnRyYWwgZGlyZWN0b3J5IHN0cnVjdHVyZQogX0NEX1NJR05BVFVSRSA9IDAKQEAgLTc1LDYgKzkxLDQwIEBACiAgICAgICAgIHBhc3MKICAgICByZXR1cm4gRmFsc2UKIAorZGVmIF9FbmRSZWNEYXRhNjQoZnBpbiwgb2Zmc2V0LCBlbmRyZWMpOgorICAgICIiIgorICAgIFJlYWQgdGhlIFpJUDY0IGVuZC1vZi1hcmNoaXZlIHJlY29yZHMgYW5kIHVzZSB0aGF0IHRvIHVwZGF0ZSBlbmRyZWMKKyAgICAiIiIKKyAgICBsb2NhdG9yU2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yKQorICAgIGZwaW4uc2VlayhvZmZzZXQgLSBsb2NhdG9yU2l6ZSwgMikKKyAgICBkYXRhID0gZnBpbi5yZWFkKGxvY2F0b3JTaXplKQorICAgIHNpZywgZGlza25vLCByZWxvZmYsIGRpc2tzID0gc3RydWN0LnVucGFjayhzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yLCBkYXRhKQorICAgIGlmIHNpZyAhPSBzdHJpbmdFbmRBcmNoaXZlNjRMb2NhdG9yOgorICAgICAgICByZXR1cm4gZW5kcmVjCisKKyAgICBpZiBkaXNrbm8gIT0gMCBvciBkaXNrcyAhPSAxOgorICAgICAgICByYWlzZSBCYWRaaXBmaWxlKCJ6aXBmaWxlcyB0aGF0IHNwYW4gbXVsdGlwbGUgZGlza3MgYXJlIG5vdCBzdXBwb3J0ZWQiKQorCisgICAgIyBBc3N1bWUgbm8gJ3ppcDY0IGV4dGVuc2libGUgZGF0YScKKyAgICBlbmRBcmNoaXZlU2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShzdHJ1Y3RFbmRBcmNoaXZlNjQpCisgICAgZnBpbi5zZWVrKG9mZnNldCAtIGxvY2F0b3JTaXplIC0gZW5kQXJjaGl2ZVNpemUsIDIpCisgICAgZGF0YSA9IGZwaW4ucmVhZChlbmRBcmNoaXZlU2l6ZSkKKyAgICBzaWcsIHN6LCBjcmVhdGVfdmVyc2lvbiwgcmVhZF92ZXJzaW9uLCBkaXNrX251bSwgZGlza19kaXIsIFwKKyAgICAgICAgICAgIGRpcmNvdW50LCBkaXJjb3VudDIsIGRpcnNpemUsIGRpcm9mZnNldCA9IFwKKyAgICAgICAgICAgIHN0cnVjdC51bnBhY2soc3RydWN0RW5kQXJjaGl2ZTY0LCBkYXRhKQorICAgIGlmIHNpZyAhPSBzdHJpbmdFbmRBcmNoaXZlNjQ6CisgICAgICAgIHJldHVybiBlbmRyZWMKKworICAgICMgVXBkYXRlIHRoZSBvcmlnaW5hbCBlbmRyZWMgdXNpbmcgZGF0YSBmcm9tIHRoZSBaSVA2NCByZWNvcmQKKyAgICBlbmRyZWNbMV0gPSBkaXNrX251bQorICAgIGVuZHJlY1syXSA9IGRpc2tfZGlyCisgICAgZW5kcmVjWzNdID0gZGlyY291bnQKKyAgICBlbmRyZWNbNF0gPSBkaXJjb3VudDIKKyAgICBlbmRyZWNbNV0gPSBkaXJzaXplCisgICAgZW5kcmVjWzZdID0gZGlyb2Zmc2V0CisgICAgcmV0dXJuIGVuZHJlYworCisKIGRlZiBfRW5kUmVjRGF0YShmcGluKToKICAgICAiIiJSZXR1cm4gZGF0YSBmcm9tIHRoZSAiRW5kIG9mIENlbnRyYWwgRGlyZWN0b3J5IiByZWNvcmQsIG9yIE5vbmUuCiAKQEAgLTg4LDYgKzEzOCw4IEBACiAgICAgICAgIGVuZHJlYyA9IGxpc3QoZW5kcmVjKQogICAgICAgICBlbmRyZWMuYXBwZW5kKCIiKSAgICAgICAgICAgICAgICMgQXBwZW5kIHRoZSBhcmNoaXZlIGNvbW1lbnQKICAgICAgICAgZW5kcmVjLmFwcGVuZChmaWxlc2l6ZSAtIDIyKSAgICAjIEFwcGVuZCB0aGUgcmVjb3JkIHN0YXJ0IG9mZnNldAorICAgICAgICBpZiBlbmRyZWNbLTRdID09IC0xIG9yIGVuZHJlY1stNF0gPT0gMHhmZmZmZmZmZjoKKyAgICAgICAgICAgIHJldHVybiBfRW5kUmVjRGF0YTY0KGZwaW4sIC0yMiwgZW5kcmVjKQogICAgICAgICByZXR1cm4gZW5kcmVjCiAgICAgIyBTZWFyY2ggdGhlIGxhc3QgRU5EX0JMT0NLIGJ5dGVzIG9mIHRoZSBmaWxlIGZvciB0aGUgcmVjb3JkIHNpZ25hdHVyZS4KICAgICAjIFRoZSBjb21tZW50IGlzIGFwcGVuZGVkIHRvIHRoZSBaSVAgZmlsZSBhbmQgaGFzIGEgMTYgYml0IGxlbmd0aC4KQEAgLTEwNiwyNSArMTU4LDUwIEBACiAgICAgICAgICAgICAjIEFwcGVuZCB0aGUgYXJjaGl2ZSBjb21tZW50IGFuZCBzdGFydCBvZmZzZXQKICAgICAgICAgICAgIGVuZHJlYy5hcHBlbmQoY29tbWVudCkKICAgICAgICAgICAgIGVuZHJlYy5hcHBlbmQoZmlsZXNpemUgLSBFTkRfQkxPQ0sgKyBzdGFydCkKKyAgICAgICAgICAgIGlmIGVuZHJlY1stNF0gPT0gLTEgb3IgZW5kcmVjWy00XSA9PSAweGZmZmZmZmZmOgorICAgICAgICAgICAgICAgIHJldHVybiBfRW5kUmVjRGF0YTY0KGZwaW4sIC0gRU5EX0JMT0NLICsgc3RhcnQsIGVuZHJlYykKICAgICAgICAgICAgIHJldHVybiBlbmRyZWMKICAgICByZXR1cm4gICAgICAjIEVycm9yLCByZXR1cm4gTm9uZQogCiAKLWNsYXNzIFppcEluZm86CitjbGFzcyBaaXBJbmZvIChvYmplY3QpOgogICAgICIiIkNsYXNzIHdpdGggYXR0cmlidXRlcyBkZXNjcmliaW5nIGVhY2ggZmlsZSBpbiB0aGUgWklQIGFyY2hpdmUuIiIiCiAKKyAgICBfX3Nsb3RzX18gPSAoCisgICAgICAgICAgICAnb3JpZ19maWxlbmFtZScsCisgICAgICAgICAgICAnZmlsZW5hbWUnLAorICAgICAgICAgICAgJ2RhdGVfdGltZScsCisgICAgICAgICAgICAnY29tcHJlc3NfdHlwZScsCisgICAgICAgICAgICAnY29tbWVudCcsCisgICAgICAgICAgICAnZXh0cmEnLAorICAgICAgICAgICAgJ2NyZWF0ZV9zeXN0ZW0nLAorICAgICAgICAgICAgJ2NyZWF0ZV92ZXJzaW9uJywKKyAgICAgICAgICAgICdleHRyYWN0X3ZlcnNpb24nLAorICAgICAgICAgICAgJ3Jlc2VydmVkJywKKyAgICAgICAgICAgICdmbGFnX2JpdHMnLAorICAgICAgICAgICAgJ3ZvbHVtZScsCisgICAgICAgICAgICAnaW50ZXJuYWxfYXR0cicsCisgICAgICAgICAgICAnZXh0ZXJuYWxfYXR0cicsCisgICAgICAgICAgICAnaGVhZGVyX29mZnNldCcsCisgICAgICAgICAgICAnQ1JDJywKKyAgICAgICAgICAgICdjb21wcmVzc19zaXplJywKKyAgICAgICAgICAgICdmaWxlX3NpemUnLAorICAgICAgICApCisKICAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWU9Ik5vTmFtZSIsIGRhdGVfdGltZT0oMTk4MCwxLDEsMCwwLDApKToKICAgICAgICAgc2VsZi5vcmlnX2ZpbGVuYW1lID0gZmlsZW5hbWUgICAjIE9yaWdpbmFsIGZpbGUgbmFtZSBpbiBhcmNoaXZlCi0jIFRlcm1pbmF0ZSB0aGUgZmlsZSBuYW1lIGF0IHRoZSBmaXJzdCBudWxsIGJ5dGUuICBOdWxsIGJ5dGVzIGluIGZpbGUKLSMgbmFtZXMgYXJlIHVzZWQgYXMgdHJpY2tzIGJ5IHZpcnVzZXMgaW4gYXJjaGl2ZXMuCisKKyAgICAgICAgIyBUZXJtaW5hdGUgdGhlIGZpbGUgbmFtZSBhdCB0aGUgZmlyc3QgbnVsbCBieXRlLiAgTnVsbCBieXRlcyBpbiBmaWxlCisgICAgICAgICMgbmFtZXMgYXJlIHVzZWQgYXMgdHJpY2tzIGJ5IHZpcnVzZXMgaW4gYXJjaGl2ZXMuCiAgICAgICAgIG51bGxfYnl0ZSA9IGZpbGVuYW1lLmZpbmQoY2hyKDApKQogICAgICAgICBpZiBudWxsX2J5dGUgPj0gMDoKICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWVbMDpudWxsX2J5dGVdCi0jIFRoaXMgaXMgdXNlZCB0byBlbnN1cmUgcGF0aHMgaW4gZ2VuZXJhdGVkIFpJUCBmaWxlcyBhbHdheXMgdXNlCi0jIGZvcndhcmQgc2xhc2hlcyBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciwgYXMgcmVxdWlyZWQgYnkgdGhlCi0jIFpJUCBmb3JtYXQgc3BlY2lmaWNhdGlvbi4KLSAgICAgICAgaWYgb3Muc2VwICE9ICIvIjoKKyAgICAgICAgIyBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHBhdGhzIGluIGdlbmVyYXRlZCBaSVAgZmlsZXMgYWx3YXlzIHVzZQorICAgICAgICAjIGZvcndhcmQgc2xhc2hlcyBhcyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciwgYXMgcmVxdWlyZWQgYnkgdGhlCisgICAgICAgICMgWklQIGZvcm1hdCBzcGVjaWZpY2F0aW9uLgorICAgICAgICBpZiBvcy5zZXAgIT0gIi8iIGFuZCBvcy5zZXAgaW4gZmlsZW5hbWU6CiAgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lLnJlcGxhY2Uob3Muc2VwLCAiLyIpCisKICAgICAgICAgc2VsZi5maWxlbmFtZSA9IGZpbGVuYW1lICAgICAgICAjIE5vcm1hbGl6ZWQgZmlsZSBuYW1lCiAgICAgICAgIHNlbGYuZGF0ZV90aW1lID0gZGF0ZV90aW1lICAgICAgIyB5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYwogICAgICAgICAjIFN0YW5kYXJkIHZhbHVlczoKQEAgLTE0NSw3ICsyMjIsNiBAQAogICAgICAgICBzZWxmLmV4dGVybmFsX2F0dHIgPSAwICAgICAgICAgICMgRXh0ZXJuYWwgZmlsZSBhdHRyaWJ1dGVzCiAgICAgICAgICMgT3RoZXIgYXR0cmlidXRlcyBhcmUgc2V0IGJ5IGNsYXNzIFppcEZpbGU6CiAgICAgICAgICMgaGVhZGVyX29mZnNldCAgICAgICAgIEJ5dGUgb2Zmc2V0IHRvIHRoZSBmaWxlIGhlYWRlcgotICAgICAgICAjIGZpbGVfb2Zmc2V0ICAgICAgICAgICBCeXRlIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUgZGF0YQogICAgICAgICAjIENSQyAgICAgICAgICAgICAgICAgICBDUkMtMzIgb2YgdGhlIHVuY29tcHJlc3NlZCBmaWxlCiAgICAgICAgICMgY29tcHJlc3Nfc2l6ZSAgICAgICAgIFNpemUgb2YgdGhlIGNvbXByZXNzZWQgZmlsZQogICAgICAgICAjIGZpbGVfc2l6ZSAgICAgICAgICAgICBTaXplIG9mIHRoZSB1bmNvbXByZXNzZWQgZmlsZQpAQCAtMTYyLDI5ICsyMzgsODUgQEAKICAgICAgICAgICAgIENSQyA9IHNlbGYuQ1JDCiAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gc2VsZi5jb21wcmVzc19zaXplCiAgICAgICAgICAgICBmaWxlX3NpemUgPSBzZWxmLmZpbGVfc2l6ZQorCisgICAgICAgIGV4dHJhID0gc2VsZi5leHRyYQorCisgICAgICAgIGlmIGZpbGVfc2l6ZSA+IFpJUDY0X0xJTUlUIG9yIGNvbXByZXNzX3NpemUgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICMgRmlsZSBpcyBsYXJnZXIgdGhhbiB3aGF0IGZpdHMgaW50byBhIDQgYnl0ZSBpbnRlZ2VyLAorICAgICAgICAgICAgIyBmYWxsIGJhY2sgdG8gdGhlIFpJUDY0IGV4dGVuc2lvbgorICAgICAgICAgICAgZm10ID0gJzxoaHFxJworICAgICAgICAgICAgZXh0cmEgPSBleHRyYSArIHN0cnVjdC5wYWNrKGZtdCwKKyAgICAgICAgICAgICAgICAgICAgMSwgc3RydWN0LmNhbGNzaXplKGZtdCktNCwgZmlsZV9zaXplLCBjb21wcmVzc19zaXplKQorICAgICAgICAgICAgZmlsZV9zaXplID0gMHhmZmZmZmZmZiAjIC0xCisgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZiAjIC0xCisgICAgICAgICAgICBzZWxmLmV4dHJhY3RfdmVyc2lvbiA9IG1heCg0NSwgc2VsZi5leHRyYWN0X3ZlcnNpb24pCisgICAgICAgICAgICBzZWxmLmNyZWF0ZV92ZXJzaW9uID0gbWF4KDQ1LCBzZWxmLmV4dHJhY3RfdmVyc2lvbikKKwogICAgICAgICBoZWFkZXIgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RGaWxlSGVhZGVyLCBzdHJpbmdGaWxlSGVhZGVyLAogICAgICAgICAgICAgICAgICBzZWxmLmV4dHJhY3RfdmVyc2lvbiwgc2VsZi5yZXNlcnZlZCwgc2VsZi5mbGFnX2JpdHMsCiAgICAgICAgICAgICAgICAgIHNlbGYuY29tcHJlc3NfdHlwZSwgZG9zdGltZSwgZG9zZGF0ZSwgQ1JDLAogICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplLCBmaWxlX3NpemUsCi0gICAgICAgICAgICAgICAgIGxlbihzZWxmLmZpbGVuYW1lKSwgbGVuKHNlbGYuZXh0cmEpKQotICAgICAgICByZXR1cm4gaGVhZGVyICsgc2VsZi5maWxlbmFtZSArIHNlbGYuZXh0cmEKKyAgICAgICAgICAgICAgICAgbGVuKHNlbGYuZmlsZW5hbWUpLCBsZW4oZXh0cmEpKQorICAgICAgICByZXR1cm4gaGVhZGVyICsgc2VsZi5maWxlbmFtZSArIGV4dHJhCisKKyAgICBkZWYgX2RlY29kZUV4dHJhKHNlbGYpOgorICAgICAgICAjIFRyeSB0byBkZWNvZGUgdGhlIGV4dHJhIGZpZWxkLgorICAgICAgICBleHRyYSA9IHNlbGYuZXh0cmEKKyAgICAgICAgdW5wYWNrID0gc3RydWN0LnVucGFjaworICAgICAgICB3aGlsZSBleHRyYToKKyAgICAgICAgICAgIHRwLCBsbiA9IHVucGFjaygnPGhoJywgZXh0cmFbOjRdKQorICAgICAgICAgICAgaWYgdHAgPT0gMToKKyAgICAgICAgICAgICAgICBpZiBsbiA+PSAyNDoKKyAgICAgICAgICAgICAgICAgICAgY291bnRzID0gdW5wYWNrKCc8cXFxJywgZXh0cmFbNDoyOF0pCisgICAgICAgICAgICAgICAgZWxpZiBsbiA9PSAxNjoKKyAgICAgICAgICAgICAgICAgICAgY291bnRzID0gdW5wYWNrKCc8cXEnLCBleHRyYVs0OjIwXSkKKyAgICAgICAgICAgICAgICBlbGlmIGxuID09IDg6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9IHVucGFjaygnPHEnLCBleHRyYVs0OjEyXSkKKyAgICAgICAgICAgICAgICBlbGlmIGxuID09IDA6CisgICAgICAgICAgICAgICAgICAgIGNvdW50cyA9ICgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiQ29ycnVwdCBleHRyYSBmaWVsZCAlcyIlKGxuLCkKKworICAgICAgICAgICAgICAgIGlkeCA9IDAKKworICAgICAgICAgICAgICAgICMgWklQNjQgZXh0ZW5zaW9uIChsYXJnZSBmaWxlcyBhbmQvb3IgbGFyZ2UgYXJjaGl2ZXMpCisgICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlX3NpemUgPT0gLTEgb3Igc2VsZi5maWxlX3NpemUgPT0gMHhGRkZGRkZGRkw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZV9zaXplID0gY291bnRzW2lkeF0KKyAgICAgICAgICAgICAgICAgICAgaWR4ICs9IDEKKworICAgICAgICAgICAgICAgIGlmIHNlbGYuY29tcHJlc3Nfc2l6ZSA9PSAtMSBvciBzZWxmLmNvbXByZXNzX3NpemUgPT0gMHhGRkZGRkZGRkw6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcHJlc3Nfc2l6ZSA9IGNvdW50c1tpZHhdCisgICAgICAgICAgICAgICAgICAgIGlkeCArPSAxCisKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmhlYWRlcl9vZmZzZXQgPT0gLTEgb3Igc2VsZi5oZWFkZXJfb2Zmc2V0ID09IDB4ZmZmZmZmZmZMOgorICAgICAgICAgICAgICAgICAgICBvbGQgPSBzZWxmLmhlYWRlcl9vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5oZWFkZXJfb2Zmc2V0ID0gY291bnRzW2lkeF0KKyAgICAgICAgICAgICAgICAgICAgaWR4Kz0xCisKKyAgICAgICAgICAgIGV4dHJhID0gZXh0cmFbbG4rNDpdCiAKIAogY2xhc3MgWmlwRmlsZToKICAgICAiIiIgQ2xhc3Mgd2l0aCBtZXRob2RzIHRvIG9wZW4sIHJlYWQsIHdyaXRlLCBjbG9zZSwgbGlzdCB6aXAgZmlsZXMuCiAKLSAgICB6ID0gWmlwRmlsZShmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCkKKyAgICB6ID0gWmlwRmlsZShmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCwgYWxsb3daaXA2ND1UcnVlKQogCiAgICAgZmlsZTogRWl0aGVyIHRoZSBwYXRoIHRvIHRoZSBmaWxlLCBvciBhIGZpbGUtbGlrZSBvYmplY3QuCiAgICAgICAgICAgSWYgaXQgaXMgYSBwYXRoLCB0aGUgZmlsZSB3aWxsIGJlIG9wZW5lZCBhbmQgY2xvc2VkIGJ5IFppcEZpbGUuCiAgICAgbW9kZTogVGhlIG1vZGUgY2FuIGJlIGVpdGhlciByZWFkICJyIiwgd3JpdGUgInciIG9yIGFwcGVuZCAiYSIuCiAgICAgY29tcHJlc3Npb246IFpJUF9TVE9SRUQgKG5vIGNvbXByZXNzaW9uKSBvciBaSVBfREVGTEFURUQgKHJlcXVpcmVzIHpsaWIpLgorICAgIGFsbG93WmlwNjQ6IGlmIFRydWUgWmlwRmlsZSB3aWxsIGNyZWF0ZSBmaWxlcyB3aXRoIFpJUDY0IGV4dGVuc2lvbnMgd2hlbgorICAgICAgICAgICAgICAgIG5lZWRlZCwgb3RoZXJ3aXNlIGl0IHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4gdGhpcyB3b3VsZAorICAgICAgICAgICAgICAgIGJlIG5lY2Vzc2FyeS4KKwogICAgICIiIgogCiAgICAgZnAgPSBOb25lICAgICAgICAgICAgICAgICAgICMgU2V0IGhlcmUgc2luY2UgX19kZWxfXyBjaGVja3MgaXQKIAotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlLCBtb2RlPSJyIiwgY29tcHJlc3Npb249WklQX1NUT1JFRCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpbGUsIG1vZGU9InIiLCBjb21wcmVzc2lvbj1aSVBfU1RPUkVELCBhbGxvd1ppcDY0PUZhbHNlKToKICAgICAgICAgIiIiT3BlbiB0aGUgWklQIGZpbGUgd2l0aCBtb2RlIHJlYWQgInIiLCB3cml0ZSAidyIgb3IgYXBwZW5kICJhIi4iIiIKKyAgICAgICAgc2VsZi5fYWxsb3daaXA2NCA9IGFsbG93WmlwNjQKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gRmFsc2UKICAgICAgICAgaWYgY29tcHJlc3Npb24gPT0gWklQX1NUT1JFRDoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxpZiBjb21wcmVzc2lvbiA9PSBaSVBfREVGTEFURUQ6CkBAIC0yNTAsNyArMzgyLDEwIEBACiAgICAgICAgIG9mZnNldF9jZCA9IGVuZHJlY1s2XSAgICMgb2Zmc2V0IG9mIGNlbnRyYWwgZGlyZWN0b3J5CiAgICAgICAgIHNlbGYuY29tbWVudCA9IGVuZHJlY1s4XSAgICAgICAgIyBhcmNoaXZlIGNvbW1lbnQKICAgICAgICAgIyBlbmRyZWNbOV0gaXMgdGhlIG9mZnNldCBvZiB0aGUgIkVuZCBvZiBDZW50cmFsIERpciIgcmVjb3JkCi0gICAgICAgIHggPSBlbmRyZWNbOV0gLSBzaXplX2NkCisgICAgICAgIGlmIGVuZHJlY1s5XSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgeCA9IGVuZHJlY1s5XSAtIHNpemVfY2QgLSA1NiAtIDIwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB4ID0gZW5kcmVjWzldIC0gc2l6ZV9jZAogICAgICAgICAjICJjb25jYXQiIGlzIHplcm8sIHVubGVzcyB6aXAgd2FzIGNvbmNhdGVuYXRlZCB0byBhbm90aGVyIGZpbGUKICAgICAgICAgY29uY2F0ID0geCAtIG9mZnNldF9jZAogICAgICAgICBpZiBzZWxmLmRlYnVnID4gMjoKQEAgLTI1OCw2ICszOTMsOCBAQAogICAgICAgICAjIHNlbGYuc3RhcnRfZGlyOiAgUG9zaXRpb24gb2Ygc3RhcnQgb2YgY2VudHJhbCBkaXJlY3RvcnkKICAgICAgICAgc2VsZi5zdGFydF9kaXIgPSBvZmZzZXRfY2QgKyBjb25jYXQKICAgICAgICAgZnAuc2VlayhzZWxmLnN0YXJ0X2RpciwgMCkKKyAgICAgICAgZGF0YSA9IGZwLnJlYWQoc2l6ZV9jZCkKKyAgICAgICAgZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKICAgICAgICAgdG90YWwgPSAwCiAgICAgICAgIHdoaWxlIHRvdGFsIDwgc2l6ZV9jZDoKICAgICAgICAgICAgIGNlbnRkaXIgPSBmcC5yZWFkKDQ2KQpAQCAtMjc1LDggKzQxMiw3IEBACiAgICAgICAgICAgICB0b3RhbCA9ICh0b3RhbCArIGNlbnRkaXJbX0NEX0ZJTEVOQU1FX0xFTkdUSF0KICAgICAgICAgICAgICAgICAgICAgICsgY2VudGRpcltfQ0RfRVhUUkFfRklFTERfTEVOR1RIXQogICAgICAgICAgICAgICAgICAgICAgKyBjZW50ZGlyW19DRF9DT01NRU5UX0xFTkdUSF0pCi0gICAgICAgICAgICB4LmhlYWRlcl9vZmZzZXQgPSBjZW50ZGlyW19DRF9MT0NBTF9IRUFERVJfT0ZGU0VUXSArIGNvbmNhdAotICAgICAgICAgICAgIyBmaWxlX29mZnNldCBtdXN0IGJlIGNvbXB1dGVkIGJlbG93Li4uCisgICAgICAgICAgICB4LmhlYWRlcl9vZmZzZXQgPSBjZW50ZGlyW19DRF9MT0NBTF9IRUFERVJfT0ZGU0VUXQogICAgICAgICAgICAgKHguY3JlYXRlX3ZlcnNpb24sIHguY3JlYXRlX3N5c3RlbSwgeC5leHRyYWN0X3ZlcnNpb24sIHgucmVzZXJ2ZWQsCiAgICAgICAgICAgICAgICAgeC5mbGFnX2JpdHMsIHguY29tcHJlc3NfdHlwZSwgdCwgZCwKICAgICAgICAgICAgICAgICB4LkNSQywgeC5jb21wcmVzc19zaXplLCB4LmZpbGVfc2l6ZSkgPSBjZW50ZGlyWzE6MTJdCkBAIC0yODQsMjggKzQyMCwxNCBAQAogICAgICAgICAgICAgIyBDb252ZXJ0IGRhdGUvdGltZSBjb2RlIHRvICh5ZWFyLCBtb250aCwgZGF5LCBob3VyLCBtaW4sIHNlYykKICAgICAgICAgICAgIHguZGF0ZV90aW1lID0gKCAoZD4+OSkrMTk4MCwgKGQ+PjUpJjB4RiwgZCYweDFGLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQ+PjExLCAodD4+NSkmMHgzRiwgKHQmMHgxRikgKiAyICkKKworICAgICAgICAgICAgeC5fZGVjb2RlRXh0cmEoKQorICAgICAgICAgICAgeC5oZWFkZXJfb2Zmc2V0ID0geC5oZWFkZXJfb2Zmc2V0ICsgY29uY2F0CiAgICAgICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZCh4KQogICAgICAgICAgICAgc2VsZi5OYW1lVG9JbmZvW3guZmlsZW5hbWVdID0geAogICAgICAgICAgICAgaWYgc2VsZi5kZWJ1ZyA+IDI6CiAgICAgICAgICAgICAgICAgcHJpbnQgInRvdGFsIiwgdG90YWwKLSAgICAgICAgZm9yIGRhdGEgaW4gc2VsZi5maWxlbGlzdDoKLSAgICAgICAgICAgIGZwLnNlZWsoZGF0YS5oZWFkZXJfb2Zmc2V0LCAwKQotICAgICAgICAgICAgZmhlYWRlciA9IGZwLnJlYWQoMzApCi0gICAgICAgICAgICBpZiBmaGVhZGVyWzA6NF0gIT0gc3RyaW5nRmlsZUhlYWRlcjoKLSAgICAgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlLCAiQmFkIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIiCi0gICAgICAgICAgICBmaGVhZGVyID0gc3RydWN0LnVucGFjayhzdHJ1Y3RGaWxlSGVhZGVyLCBmaGVhZGVyKQotICAgICAgICAgICAgIyBmaWxlX29mZnNldCBpcyBjb21wdXRlZCBoZXJlLCBzaW5jZSB0aGUgZXh0cmEgZmllbGQgZm9yCi0gICAgICAgICAgICAjIHRoZSBjZW50cmFsIGRpcmVjdG9yeSBhbmQgZm9yIHRoZSBsb2NhbCBmaWxlIGhlYWRlcgotICAgICAgICAgICAgIyByZWZlciB0byBkaWZmZXJlbnQgZmllbGRzLCBhbmQgdGhleSBjYW4gaGF2ZSBkaWZmZXJlbnQKLSAgICAgICAgICAgICMgbGVuZ3RocwotICAgICAgICAgICAgZGF0YS5maWxlX29mZnNldCA9IChkYXRhLmhlYWRlcl9vZmZzZXQgKyAzMAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGZoZWFkZXJbX0ZIX0ZJTEVOQU1FX0xFTkdUSF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaGVhZGVyW19GSF9FWFRSQV9GSUVMRF9MRU5HVEhdKQotICAgICAgICAgICAgZm5hbWUgPSBmcC5yZWFkKGZoZWFkZXJbX0ZIX0ZJTEVOQU1FX0xFTkdUSF0pCi0gICAgICAgICAgICBpZiBmbmFtZSAhPSBkYXRhLm9yaWdfZmlsZW5hbWU6Ci0gICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCi0gICAgICAgICAgICAgICAgICAgICAgJ0ZpbGUgbmFtZSBpbiBkaXJlY3RvcnkgIiVzIiBhbmQgaGVhZGVyICIlcyIgZGlmZmVyLicgJSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEub3JpZ19maWxlbmFtZSwgZm5hbWUpCisKIAogICAgIGRlZiBuYW1lbGlzdChzZWxmKToKICAgICAgICAgIiIiUmV0dXJuIGEgbGlzdCBvZiBmaWxlIG5hbWVzIGluIHRoZSBhcmNoaXZlLiIiIgpAQCAtMzM0LDYgKzQ1Niw3IEBACiAgICAgICAgICAgICBleGNlcHQgQmFkWmlwZmlsZToKICAgICAgICAgICAgICAgICByZXR1cm4gemluZm8uZmlsZW5hbWUKIAorCiAgICAgZGVmIGdldGluZm8oc2VsZiwgbmFtZSk6CiAgICAgICAgICIiIlJldHVybiB0aGUgaW5zdGFuY2Ugb2YgWmlwSW5mbyBnaXZlbiAnbmFtZScuIiIiCiAgICAgICAgIHJldHVybiBzZWxmLk5hbWVUb0luZm9bbmFtZV0KQEAgLTM0Nyw3ICs0NzAsMjQgQEAKICAgICAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIHJlYWQgWklQIGFyY2hpdmUgdGhhdCB3YXMgYWxyZWFkeSBjbG9zZWQiCiAgICAgICAgIHppbmZvID0gc2VsZi5nZXRpbmZvKG5hbWUpCiAgICAgICAgIGZpbGVwb3MgPSBzZWxmLmZwLnRlbGwoKQotICAgICAgICBzZWxmLmZwLnNlZWsoemluZm8uZmlsZV9vZmZzZXQsIDApCisKKyAgICAgICAgc2VsZi5mcC5zZWVrKHppbmZvLmhlYWRlcl9vZmZzZXQsIDApCisKKyAgICAgICAgIyBTa2lwIHRoZSBmaWxlIGhlYWRlcjoKKyAgICAgICAgZmhlYWRlciA9IHNlbGYuZnAucmVhZCgzMCkKKyAgICAgICAgaWYgZmhlYWRlclswOjRdICE9IHN0cmluZ0ZpbGVIZWFkZXI6CisgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlLCAiQmFkIG1hZ2ljIG51bWJlciBmb3IgZmlsZSBoZWFkZXIiCisKKyAgICAgICAgZmhlYWRlciA9IHN0cnVjdC51bnBhY2soc3RydWN0RmlsZUhlYWRlciwgZmhlYWRlcikKKyAgICAgICAgZm5hbWUgPSBzZWxmLmZwLnJlYWQoZmhlYWRlcltfRkhfRklMRU5BTUVfTEVOR1RIXSkKKyAgICAgICAgaWYgZmhlYWRlcltfRkhfRVhUUkFfRklFTERfTEVOR1RIXToKKyAgICAgICAgICAgIHNlbGYuZnAucmVhZChmaGVhZGVyW19GSF9FWFRSQV9GSUVMRF9MRU5HVEhdKQorCisgICAgICAgIGlmIGZuYW1lICE9IHppbmZvLm9yaWdfZmlsZW5hbWU6CisgICAgICAgICAgICByYWlzZSBCYWRaaXBmaWxlLCBcCisgICAgICAgICAgICAgICAgICAgICAgJ0ZpbGUgbmFtZSBpbiBkaXJlY3RvcnkgIiVzIiBhbmQgaGVhZGVyICIlcyIgZGlmZmVyLicgJSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHppbmZvLm9yaWdfZmlsZW5hbWUsIGZuYW1lKQorCiAgICAgICAgIGJ5dGVzID0gc2VsZi5mcC5yZWFkKHppbmZvLmNvbXByZXNzX3NpemUpCiAgICAgICAgIHNlbGYuZnAuc2VlayhmaWxlcG9zLCAwKQogICAgICAgICBpZiB6aW5mby5jb21wcmVzc190eXBlID09IFpJUF9TVE9SRUQ6CkBAIC0zODgsNiArNTI4LDEyIEBACiAgICAgICAgIGlmIHppbmZvLmNvbXByZXNzX3R5cGUgbm90IGluIChaSVBfU1RPUkVELCBaSVBfREVGTEFURUQpOgogICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCBcCiAgICAgICAgICAgICAgICAgICAiVGhhdCBjb21wcmVzc2lvbiBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCIKKyAgICAgICAgaWYgemluZm8uZmlsZV9zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5fYWxsb3daaXA2NDoKKyAgICAgICAgICAgICAgICByYWlzZSBMYXJnZVppcEZpbGUoIkZpbGVzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCisgICAgICAgIGlmIHppbmZvLmhlYWRlcl9vZmZzZXQgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd1ppcDY0OgorICAgICAgICAgICAgICAgIHJhaXNlIExhcmdlWmlwRmlsZSgiWmlwZmlsZSBzaXplIHdvdWxkIHJlcXVpcmUgWklQNjQgZXh0ZW5zaW9ucyIpCiAKICAgICBkZWYgd3JpdGUoc2VsZiwgZmlsZW5hbWUsIGFyY25hbWU9Tm9uZSwgY29tcHJlc3NfdHlwZT1Ob25lKToKICAgICAgICAgIiIiUHV0IHRoZSBieXRlcyBmcm9tIGZpbGVuYW1lIGludG8gdGhlIGFyY2hpdmUgdW5kZXIgdGhlIG5hbWUKQEAgLTQwNywxNiArNTUzLDE5IEBACiAgICAgICAgICAgICB6aW5mby5jb21wcmVzc190eXBlID0gc2VsZi5jb21wcmVzc2lvbgogICAgICAgICBlbHNlOgogICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IGNvbXByZXNzX3R5cGUKLSAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKLSAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAicmIiKQorCisgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IHN0LnN0X3NpemUKICAgICAgICAgemluZm8uZmxhZ19iaXRzID0gMHgwMAogICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKKworICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQorICAgICAgICBzZWxmLl9kaWRNb2RpZnkgPSBUcnVlCisgICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgInJiIikKICAgICAgICAgIyBNdXN0IG92ZXJ3cml0ZSBDUkMgYW5kIHNpemVzIHdpdGggY29ycmVjdCBkYXRhIGxhdGVyCiAgICAgICAgIHppbmZvLkNSQyA9IENSQyA9IDAKICAgICAgICAgemluZm8uY29tcHJlc3Nfc2l6ZSA9IGNvbXByZXNzX3NpemUgPSAwCiAgICAgICAgIHppbmZvLmZpbGVfc2l6ZSA9IGZpbGVfc2l6ZSA9IDAKICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5GaWxlSGVhZGVyKCkpCi0gICAgICAgIHppbmZvLmZpbGVfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgICAjIFN0YXJ0IG9mIGZpbGUgYnl0ZXMKICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQ6CiAgICAgICAgICAgICBjbXByID0gemxpYi5jb21wcmVzc29iaih6bGliLlpfREVGQVVMVF9DT01QUkVTU0lPTiwKICAgICAgICAgICAgICAgICAgemxpYi5ERUZMQVRFRCwgLTE1KQpAQCAtNDYxLDggKzYxMCwxMCBAQAogICAgICAgICAgICAgemluZm8uY29tcHJlc3NfdHlwZSA9IHNlbGYuY29tcHJlc3Npb24KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHppbmZvID0gemluZm9fb3JfYXJjbmFtZQotICAgICAgICBzZWxmLl93cml0ZWNoZWNrKHppbmZvKQogICAgICAgICB6aW5mby5maWxlX3NpemUgPSBsZW4oYnl0ZXMpICAgICAgICAgICAgIyBVbmNvbXByZXNzZWQgc2l6ZQorICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0ID0gc2VsZi5mcC50ZWxsKCkgICAgIyBTdGFydCBvZiBoZWFkZXIgYnl0ZXMKKyAgICAgICAgc2VsZi5fd3JpdGVjaGVjayh6aW5mbykKKyAgICAgICAgc2VsZi5fZGlkTW9kaWZ5ID0gVHJ1ZQogICAgICAgICB6aW5mby5DUkMgPSBiaW5hc2NpaS5jcmMzMihieXRlcykgICAgICAgIyBDUkMtMzIgY2hlY2tzdW0KICAgICAgICAgaWYgemluZm8uY29tcHJlc3NfdHlwZSA9PSBaSVBfREVGTEFURUQ6CiAgICAgICAgICAgICBjbyA9IHpsaWIuY29tcHJlc3NvYmooemxpYi5aX0RFRkFVTFRfQ09NUFJFU1NJT04sCkBAIC00NzMsOCArNjI0LDggQEAKICAgICAgICAgICAgIHppbmZvLmNvbXByZXNzX3NpemUgPSB6aW5mby5maWxlX3NpemUKICAgICAgICAgemluZm8uaGVhZGVyX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICMgU3RhcnQgb2YgaGVhZGVyIGJ5dGVzCiAgICAgICAgIHNlbGYuZnAud3JpdGUoemluZm8uRmlsZUhlYWRlcigpKQotICAgICAgICB6aW5mby5maWxlX29mZnNldCA9IHNlbGYuZnAudGVsbCgpICAgICAgIyBTdGFydCBvZiBmaWxlIGJ5dGVzCiAgICAgICAgIHNlbGYuZnAud3JpdGUoYnl0ZXMpCisgICAgICAgIHNlbGYuZnAuZmx1c2goKQogICAgICAgICBpZiB6aW5mby5mbGFnX2JpdHMgJiAweDA4OgogICAgICAgICAgICAgIyBXcml0ZSBDUkMgYW5kIGZpbGUgc2l6ZXMgYWZ0ZXIgdGhlIGZpbGUgZGF0YQogICAgICAgICAgICAgc2VsZi5mcC53cml0ZShzdHJ1Y3QucGFjaygiPGxMTCIsIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwKQEAgLTQ5MSw3ICs2NDIsOCBAQAogICAgICAgICByZWNvcmRzLiIiIgogICAgICAgICBpZiBzZWxmLmZwIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgc2VsZi5tb2RlIGluICgidyIsICJhIik6ICAgICAgICAgICAgICMgd3JpdGUgZW5kaW5nIHJlY29yZHMKKworICAgICAgICBpZiBzZWxmLm1vZGUgaW4gKCJ3IiwgImEiKSBhbmQgc2VsZi5fZGlkTW9kaWZ5OiAjIHdyaXRlIGVuZGluZyByZWNvcmRzCiAgICAgICAgICAgICBjb3VudCA9IDAKICAgICAgICAgICAgIHBvczEgPSBzZWxmLmZwLnRlbGwoKQogICAgICAgICAgICAgZm9yIHppbmZvIGluIHNlbGYuZmlsZWxpc3Q6ICAgICAgICAgIyB3cml0ZSBjZW50cmFsIGRpcmVjdG9yeQpAQCAtNDk5LDIzICs2NTEsNzMgQEAKICAgICAgICAgICAgICAgICBkdCA9IHppbmZvLmRhdGVfdGltZQogICAgICAgICAgICAgICAgIGRvc2RhdGUgPSAoZHRbMF0gLSAxOTgwKSA8PCA5IHwgZHRbMV0gPDwgNSB8IGR0WzJdCiAgICAgICAgICAgICAgICAgZG9zdGltZSA9IGR0WzNdIDw8IDExIHwgZHRbNF0gPDwgNSB8IChkdFs1XSAvLyAyKQorICAgICAgICAgICAgICAgIGV4dHJhID0gW10KKyAgICAgICAgICAgICAgICBpZiB6aW5mby5maWxlX3NpemUgPiBaSVA2NF9MSU1JVCBcCisgICAgICAgICAgICAgICAgICAgICAgICBvciB6aW5mby5jb21wcmVzc19zaXplID4gWklQNjRfTElNSVQ6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5maWxlX3NpemUpCisgICAgICAgICAgICAgICAgICAgIGV4dHJhLmFwcGVuZCh6aW5mby5jb21wcmVzc19zaXplKQorICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSAweGZmZmZmZmZmICMtMQorICAgICAgICAgICAgICAgICAgICBjb21wcmVzc19zaXplID0gMHhmZmZmZmZmZiAjLTEKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBmaWxlX3NpemUgPSB6aW5mby5maWxlX3NpemUKKyAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Nfc2l6ZSA9IHppbmZvLmNvbXByZXNzX3NpemUKKworICAgICAgICAgICAgICAgIGlmIHppbmZvLmhlYWRlcl9vZmZzZXQgPiBaSVA2NF9MSU1JVDoKKyAgICAgICAgICAgICAgICAgICAgZXh0cmEuYXBwZW5kKHppbmZvLmhlYWRlcl9vZmZzZXQpCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9vZmZzZXQgPSAtMSAgIyBzdHJ1Y3QgImwiIGZvcm1hdDogIDMyIG9uZSBiaXRzCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCA9IHppbmZvLmhlYWRlcl9vZmZzZXQKKworICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSB6aW5mby5leHRyYQorICAgICAgICAgICAgICAgIGlmIGV4dHJhOgorICAgICAgICAgICAgICAgICAgICAjIEFwcGVuZCBhIFpJUDY0IGZpZWxkIHRvIHRoZSBleHRyYSdzCisgICAgICAgICAgICAgICAgICAgIGV4dHJhX2RhdGEgPSBzdHJ1Y3QucGFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGhoJyArICdxJypsZW4oZXh0cmEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDgqbGVuKGV4dHJhKSwgKmV4dHJhKSArIGV4dHJhX2RhdGEKKworICAgICAgICAgICAgICAgICAgICBleHRyYWN0X3ZlcnNpb24gPSBtYXgoNDUsIHppbmZvLmV4dHJhY3RfdmVyc2lvbikKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlX3ZlcnNpb24gPSBtYXgoNDUsIHppbmZvLmNyZWF0ZV92ZXJzaW9uKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RfdmVyc2lvbiA9IHppbmZvLmV4dHJhY3RfdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICBjcmVhdGVfdmVyc2lvbiA9IHppbmZvLmNyZWF0ZV92ZXJzaW9uCisKICAgICAgICAgICAgICAgICBjZW50ZGlyID0gc3RydWN0LnBhY2soc3RydWN0Q2VudHJhbERpciwKLSAgICAgICAgICAgICAgICAgIHN0cmluZ0NlbnRyYWxEaXIsIHppbmZvLmNyZWF0ZV92ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgemluZm8uY3JlYXRlX3N5c3RlbSwgemluZm8uZXh0cmFjdF92ZXJzaW9uLCB6aW5mby5yZXNlcnZlZCwKKyAgICAgICAgICAgICAgICAgIHN0cmluZ0NlbnRyYWxEaXIsIGNyZWF0ZV92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgemluZm8uY3JlYXRlX3N5c3RlbSwgZXh0cmFjdF92ZXJzaW9uLCB6aW5mby5yZXNlcnZlZCwKICAgICAgICAgICAgICAgICAgIHppbmZvLmZsYWdfYml0cywgemluZm8uY29tcHJlc3NfdHlwZSwgZG9zdGltZSwgZG9zZGF0ZSwKLSAgICAgICAgICAgICAgICAgIHppbmZvLkNSQywgemluZm8uY29tcHJlc3Nfc2l6ZSwgemluZm8uZmlsZV9zaXplLAotICAgICAgICAgICAgICAgICAgbGVuKHppbmZvLmZpbGVuYW1lKSwgbGVuKHppbmZvLmV4dHJhKSwgbGVuKHppbmZvLmNvbW1lbnQpLAorICAgICAgICAgICAgICAgICAgemluZm8uQ1JDLCBjb21wcmVzc19zaXplLCBmaWxlX3NpemUsCisgICAgICAgICAgICAgICAgICBsZW4oemluZm8uZmlsZW5hbWUpLCBsZW4oZXh0cmFfZGF0YSksIGxlbih6aW5mby5jb21tZW50KSwKICAgICAgICAgICAgICAgICAgIDAsIHppbmZvLmludGVybmFsX2F0dHIsIHppbmZvLmV4dGVybmFsX2F0dHIsCi0gICAgICAgICAgICAgICAgICB6aW5mby5oZWFkZXJfb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgaGVhZGVyX29mZnNldCkKICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKGNlbnRkaXIpCiAgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aW5mby5maWxlbmFtZSkKLSAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLmV4dHJhKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZXh0cmFfZGF0YSkKICAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppbmZvLmNvbW1lbnQpCisKICAgICAgICAgICAgIHBvczIgPSBzZWxmLmZwLnRlbGwoKQogICAgICAgICAgICAgIyBXcml0ZSBlbmQtb2YtemlwLWFyY2hpdmUgcmVjb3JkCi0gICAgICAgICAgICBlbmRyZWMgPSBzdHJ1Y3QucGFjayhzdHJ1Y3RFbmRBcmNoaXZlLCBzdHJpbmdFbmRBcmNoaXZlLAotICAgICAgICAgICAgICAgICAgICAgMCwgMCwgY291bnQsIGNvdW50LCBwb3MyIC0gcG9zMSwgcG9zMSwgMCkKLSAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZW5kcmVjKQorICAgICAgICAgICAgaWYgcG9zMSA+IFpJUDY0X0xJTUlUOgorICAgICAgICAgICAgICAgICMgTmVlZCB0byB3cml0ZSB0aGUgWklQNjQgZW5kLW9mLWFyY2hpdmUgcmVjb3JkcworICAgICAgICAgICAgICAgIHppcDY0ZW5kcmVjID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RFbmRBcmNoaXZlNjQsIHN0cmluZ0VuZEFyY2hpdmU2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDQ0LCA0NSwgNDUsIDAsIDAsIGNvdW50LCBjb3VudCwgcG9zMiAtIHBvczEsIHBvczEpCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZSh6aXA2NGVuZHJlYykKKworICAgICAgICAgICAgICAgIHppcDY0bG9jcmVjID0gc3RydWN0LnBhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RFbmRBcmNoaXZlNjRMb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRW5kQXJjaGl2ZTY0TG9jYXRvciwgMCwgcG9zMiwgMSkKKyAgICAgICAgICAgICAgICBzZWxmLmZwLndyaXRlKHppcDY0bG9jcmVjKQorCisgICAgICAgICAgICAgICAgIyBYWFggV2h5IGlzIGBwb3MzYCBjb21wdXRlZCBuZXh0PyAgSXQncyBuZXZlciByZWZlcmVuY2VkLgorICAgICAgICAgICAgICAgIHBvczMgPSBzZWxmLmZwLnRlbGwoKQorICAgICAgICAgICAgICAgIGVuZHJlYyA9IHN0cnVjdC5wYWNrKHN0cnVjdEVuZEFyY2hpdmUsIHN0cmluZ0VuZEFyY2hpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgY291bnQsIGNvdW50LCBwb3MyIC0gcG9zMSwgLTEsIDApCisgICAgICAgICAgICAgICAgc2VsZi5mcC53cml0ZShlbmRyZWMpCisKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZW5kcmVjID0gc3RydWN0LnBhY2soc3RydWN0RW5kQXJjaGl2ZSwgc3RyaW5nRW5kQXJjaGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBjb3VudCwgY291bnQsIHBvczIgLSBwb3MxLCBwb3MxLCAwKQorICAgICAgICAgICAgICAgIHNlbGYuZnAud3JpdGUoZW5kcmVjKQogICAgICAgICAgICAgc2VsZi5mcC5mbHVzaCgpCiAgICAgICAgIGlmIG5vdCBzZWxmLl9maWxlUGFzc2VkOgogICAgICAgICAgICAgc2VsZi5mcC5jbG9zZSgpCkBAIC02MTksMyArODIxLDgwIEBACiAgICAgICAgIGlmIGJhc2VuYW1lOgogICAgICAgICAgICAgYXJjaGl2ZW5hbWUgPSAiJXMvJXMiICUgKGJhc2VuYW1lLCBhcmNoaXZlbmFtZSkKICAgICAgICAgcmV0dXJuIChmbmFtZSwgYXJjaGl2ZW5hbWUpCisKKworZGVmIG1haW4oYXJncyA9IE5vbmUpOgorICAgIGltcG9ydCB0ZXh0d3JhcAorICAgIFVTQUdFPXRleHR3cmFwLmRlZGVudCgiIiJcCisgICAgICAgIFVzYWdlOgorICAgICAgICAgICAgemlwZmlsZS5weSAtbCB6aXBmaWxlLnppcCAgICAgICAgIyBTaG93IGxpc3Rpbmcgb2YgYSB6aXBmaWxlCisgICAgICAgICAgICB6aXBmaWxlLnB5IC10IHppcGZpbGUuemlwICAgICAgICAjIFRlc3QgaWYgYSB6aXBmaWxlIGlzIHZhbGlkCisgICAgICAgICAgICB6aXBmaWxlLnB5IC1lIHppcGZpbGUuemlwIHRhcmdldCAjIEV4dHJhY3QgemlwZmlsZSBpbnRvIHRhcmdldCBkaXIKKyAgICAgICAgICAgIHppcGZpbGUucHkgLWMgemlwZmlsZS56aXAgc3JjIC4uLiAjIENyZWF0ZSB6aXBmaWxlIGZyb20gc291cmNlcworICAgICAgICAiIiIpCisgICAgaWYgYXJncyBpcyBOb25lOgorICAgICAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisKKyAgICBpZiBub3QgYXJncyBvciBhcmdzWzBdIG5vdCBpbiAoJy1sJywgJy1jJywgJy1lJywgJy10Jyk6CisgICAgICAgIHByaW50IFVTQUdFCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBpZiBhcmdzWzBdID09ICctbCc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAncicpCisgICAgICAgIHpmLnByaW50ZGlyKCkKKyAgICAgICAgemYuY2xvc2UoKQorCisgICAgZWxpZiBhcmdzWzBdID09ICctdCc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIHpmID0gWmlwRmlsZShhcmdzWzFdLCAncicpCisgICAgICAgIHpmLnRlc3R6aXAoKQorICAgICAgICBwcmludCAiRG9uZSB0ZXN0aW5nIgorCisgICAgZWxpZiBhcmdzWzBdID09ICctZSc6CisgICAgICAgIGlmIGxlbihhcmdzKSAhPSAzOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgemYgPSBaaXBGaWxlKGFyZ3NbMV0sICdyJykKKyAgICAgICAgb3V0ID0gYXJnc1syXQorICAgICAgICBmb3IgcGF0aCBpbiB6Zi5uYW1lbGlzdCgpOgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKCcuLycpOgorICAgICAgICAgICAgICAgIHRndCA9IG9zLnBhdGguam9pbihvdXQsIHBhdGhbMjpdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0Z3QgPSBvcy5wYXRoLmpvaW4ob3V0LCBwYXRoKQorCisgICAgICAgICAgICB0Z3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUodGd0KQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHRndGRpcik6CisgICAgICAgICAgICAgICAgb3MubWFrZWRpcnModGd0ZGlyKQorICAgICAgICAgICAgZnAgPSBvcGVuKHRndCwgJ3diJykKKyAgICAgICAgICAgIGZwLndyaXRlKHpmLnJlYWQocGF0aCkpCisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHpmLmNsb3NlKCkKKworICAgIGVsaWYgYXJnc1swXSA9PSAnLWMnOgorICAgICAgICBpZiBsZW4oYXJncykgPCAzOgorICAgICAgICAgICAgcHJpbnQgVVNBR0UKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICAgICAgZGVmIGFkZFRvWmlwKHpmLCBwYXRoLCB6aXBwYXRoKToKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgIHpmLndyaXRlKHBhdGgsIHppcHBhdGgsIFpJUF9ERUZMQVRFRCkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihwYXRoKToKKyAgICAgICAgICAgICAgICBmb3Igbm0gaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9aaXAoemYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHBhdGgsIG5tKSwgb3MucGF0aC5qb2luKHppcHBhdGgsIG5tKSkKKyAgICAgICAgICAgICMgZWxzZTogaWdub3JlCisKKyAgICAgICAgemYgPSBaaXBGaWxlKGFyZ3NbMV0sICd3JywgYWxsb3daaXA2ND1UcnVlKQorICAgICAgICBmb3Igc3JjIGluIGFyZ3NbMjpdOgorICAgICAgICAgICAgYWRkVG9aaXAoemYsIHNyYywgb3MucGF0aC5iYXNlbmFtZShzcmMpKQorCisgICAgICAgIHpmLmNsb3NlKCkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9SRUFETUUudHh0IGIvTWFjL0J1aWxkU2NyaXB0L1JFQURNRS50eHQKaW5kZXggYzU1NmRlODMuLjQxZGYwZTQgMTAwNjQ0Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9SRUFETUUudHh0CisrKyBiL01hYy9CdWlsZFNjcmlwdC9SRUFETUUudHh0CkBAIC04LDE1ICs4LDQ3IEBACiBhbiBJbnN0YWxsZXIgcGFja2FnZSBmcm9tIHRoZSBpbnN0YWxsYXRpb24gcGx1cyBvdGhlciBmaWxlcyBpbiBgYHJlc291cmNlc2BgIAogYW5kIGBgc2NyaXB0c2BgIGFuZCBwbGFjZWQgdGhhdCBvbiBhIGBgLmRtZ2BgIGRpc2sgaW1hZ2UuCiAKLUhlcmUgYXJlIHRoZSBzdGVwcyB5b3UgbmVkIHRvIGZvbGxvdyB0byBidWlsZCBhIE1hY1B5dGhvbiBpbnN0YWxsZXI6CitQcmVyZXF1aXNpdGVzCistLS0tLS0tLS0tLS0tCiAKLS0gUnVuIGBgLi9idWlsZC1pbnN0YWxsZXIucHlgYC4gT3B0aW9uYWxseSB5b3UgY2FuIHBhc3MgYSBudW1iZXIgb2YgYXJndW1lbnRzCi0gIHRvIHNwZWNpZnkgbG9jYXRpb25zIG9mIHZhcmlvdXMgZmlsZXMuIFBsZWFzZSBzZWUgdGhlIHRvcCBvZgorKiBBIE1hY09TIFggMTAuNCAob3IgbGF0ZXIpCisKKyogWENvZGUgMi4yIChvciBsYXRlciksIHdpdGggdGhlIHVuaXZlcnNhbCBTREsKKworKiBObyBGaW5rIChpbiBgYC9zd2BgKSBvciBEYXJ3aW5Qb3J0cyAoaW4gYGAvb3B0L2xvY2FsYGApLCB0aG9zZSBjb3VsZAorICBpbnRlcmZlcmUgd2l0aCB0aGUgYnVpbGQuCisKKyogVGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSByZWxlYXNlIG11c3QgYmUgYXZhaWxhYmxlIG9uIHB5dGhvbi5vcmcKKyAgYmVjYXVzZSBpdCBpcyBpbmNsdWRlZCBpbiB0aGUgaW5zdGFsbGVyLgorCisKK1RoZSBSZWNpcGUKKy0tLS0tLS0tLS0KKworSGVyZSBhcmUgdGhlIHN0ZXBzIHlvdSBuZWVkIHRvIGZvbGxvdyB0byBidWlsZCBhIE1hY1B5dGhvbiBpbnN0YWxsZXI6CisKKyogIFJ1biBgYC4vYnVpbGQtaW5zdGFsbGVyLnB5YGAuIE9wdGlvbmFsbHkgeW91IGNhbiBwYXNzIGEgbnVtYmVyIG9mIGFyZ3VtZW50cworICAgdG8gc3BlY2lmeSBsb2NhdGlvbnMgb2YgdmFyaW91cyBmaWxlcy4gUGxlYXNlIHNlZSB0aGUgdG9wIG9mCiAgIGBgYnVpbGQtaW5zdGFsbGVyLnB5YGAgZm9yIGl0cyB1c2FnZS4KLS0gV2hlbiBkb25lIHRoZSBzY3JpcHQgd2lsbCB0ZWxsIHlvdSB3aGVyZSB0aGUgRE1HIGltYWdlIGlzLgogCi1UaGUgc2NyaXB0IG5lZWRzIHRvIGJlIHJ1biBvbiBNYWMgT1MgWCAxMC40IHdpdGggWGNvZGUgMi4yIG9yIGxhdGVyIGFuZAotdGhlIDEwLjR1IFNESy4KKyAgUnVubmluZyB0aGlzIHNjcmlwdCB0YWtlcyBzb21lIHRpbWUsIEkgd2lsbCBub3Qgb25seSBidWlsZCBQeXRob24gaXRzZWxmCisgIGJ1dCBhbHNvIHNvbWUgM3RoLXBhcnR5IGxpYnJhcmllcyB0aGF0IGFyZSBuZWVkZWQgZm9yIGV4dGVuc2lvbnMuCisKKyogV2hlbiBkb25lIHRoZSBzY3JpcHQgd2lsbCB0ZWxsIHlvdSB3aGVyZSB0aGUgRE1HIGltYWdlIGlzIChieSBkZWZhdWx0CisgIHNvbWV3aGVyZSBpbiBgYC90bXAvX3B5YGApLgorCitUZXN0aW5nCistLS0tLS0tCisKK1RoZSByZXN1bHRpbmcgYmluYXJpZXMgc2hvdWxkIHdvcmsgb24gTWFjT1NYIDEwLjMuOSBvciBsYXRlci4gSSB1c3VhbGx5IHJ1bgordGhlIGluc3RhbGxlciBvbiBhIDEwLjMuOSwgYSAxMC40LnggUFBDIGFuZCBhIDEwLjQueCBJbnRlbCBzeXN0ZW0gYW5kIHRoZW4KK3J1biB0aGUgdGVzdHN1aXRlIHRvIG1ha2Ugc3VyZS4KKworCitBbm5vdW5jZW1lbnRzCistLS0tLS0tLS0tLS0tCisKKyhUaGlzIGlzIG1vc3RseSBvZiBoaXN0b3JpYyBpbnRlcmVzdCkKIAogV2hlbiBhbGwgaXMgZG9uZSwgYW5ub3VuY2VtZW50cyBjYW4gYmUgcG9zdGVkIHRvIGF0IGxlYXN0IHRoZSBmb2xsb3dpbmcKIHBsYWNlczoKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkgYi9NYWMvQnVpbGRTY3JpcHQvYnVpbGQtaW5zdGFsbGVyLnB5CmluZGV4IDA1YWZlOTguLjA4MzIwOWIgMTAwNzU1Ci0tLSBhL01hYy9CdWlsZFNjcmlwdC9idWlsZC1pbnN0YWxsZXIucHkKKysrIGIvTWFjL0J1aWxkU2NyaXB0L2J1aWxkLWluc3RhbGxlci5weQpAQCAtNjcsNiArNjcsOCBAQAogU0RLUEFUSD0iL0RldmVsb3Blci9TREtzL01hY09TWDEwLjR1LnNkayIKICNTREtQQVRIPSIvIgogCitBUkNITElTVD0oJ2kzODYnLCAncHBjJywpCisKICMgU291cmNlIGRpcmVjdG9yeSAoYXN1bWUgd2UncmUgaW4gTWFjL0J1aWxkU2NyaXB0KQogU1JDRElSPW9zLnBhdGguZGlybmFtZSgKICAgICAgICAgb3MucGF0aC5kaXJuYW1lKApAQCAtOTEsNiArOTMsMjYgQEAKICMgYmF0dGVyaWVzIGluY2x1ZGVkIHB5dGhvbi4KIExJQlJBUllfUkVDSVBFUz1bCiAgICAgZGljdCgKKyAgICAgICAgbmFtZT0iQnppcDIgMS4wLjMiLAorICAgICAgICB1cmw9Imh0dHA6Ly93d3cuYnppcC5vcmcvMS4wLjMvYnppcDItMS4wLjMudGFyLmd6IiwKKyAgICAgICAgY29uZmlndXJlPU5vbmUsCisgICAgICAgIGluc3RhbGw9J21ha2UgaW5zdGFsbCBQUkVGSVg9JXMvdXNyL2xvY2FsLyBDRkxBR1M9Ii1hcmNoICVzIC1pc3lzcm9vdCAlcyInJSgKKyAgICAgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKSksCisgICAgICAgICAgICAnIC1hcmNoICcuam9pbihBUkNITElTVCksCisgICAgICAgICAgICBTREtQQVRILAorICAgICAgICApLAorICAgICksCisgICAgZGljdCgKKyAgICAgICAgbmFtZT0iWkxpYiAxLjIuMyIsCisgICAgICAgIHVybD0iaHR0cDovL3d3dy5nemlwLm9yZy96bGliL3psaWItMS4yLjMudGFyLmd6IiwKKyAgICAgICAgY29uZmlndXJlPU5vbmUsCisgICAgICAgIGluc3RhbGw9J21ha2UgaW5zdGFsbCBwcmVmaXg9JXMvdXNyL2xvY2FsLyBDRkxBR1M9Ii1hcmNoICVzIC1pc3lzcm9vdCAlcyInJSgKKyAgICAgICAgICAgIHNoZWxsUXVvdGUob3MucGF0aC5qb2luKFdPUktESVIsICdsaWJyYXJpZXMnKSksCisgICAgICAgICAgICAnIC1hcmNoICcuam9pbihBUkNITElTVCksCisgICAgICAgICAgICBTREtQQVRILAorICAgICAgICApLAorICAgICksCisgICAgZGljdCgKICAgICAgICAgIyBOb3RlIHRoYXQgR05VIHJlYWRsaW5lIGlzIEdQTCdkIHNvZnR3YXJlCiAgICAgICAgIG5hbWU9IkdOVSBSZWFkbGluZSA1LjEuNCIsCiAgICAgICAgIHVybD0iaHR0cDovL2Z0cC5nbnUub3JnL3B1Yi9nbnUvcmVhZGxpbmUvcmVhZGxpbmUtNS4xLnRhci5neiIgLApAQCAtMjM2LDcgKzI1OCw3IEBACiAgICAgICAgICAgICBNYWMgT1MgWCAxMC4zIHRvIGVuc3VyZSB0aGF0IHlvdSBjYW4gYnVpbGQgbmV3IHB5dGhvbiBleHRlbnNpb25zCiAgICAgICAgICAgICB1c2luZyB0aGF0IGNvcHkgb2YgcHl0aG9uIGFmdGVyIGluc3RhbGxpbmcgdGhpcyB2ZXJzaW9uIG9mCiAgICAgICAgICAgICBweXRob24uCi0gICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICIiIiwKICAgICAgICAgcG9zdGZsaWdodD0iLi4vVG9vbHMvZml4YXBwbGVweXRob24yMy5weSIsCiAgICAgICAgIHRvcGRpcj0iL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrIiwKICAgICAgICAgc291cmNlPSIvZW1wdHktZGlyIiwKQEAgLTQ4Niw0OCArNTA4LDQ5IEBACiAgICAgICAgIHJ1bkNvbW1hbmQoJ3BhdGNoIC1wJXMgPCAlcyclKHJlY2lwZS5nZXQoJ3BhdGNobGV2ZWwnLCAxKSwKICAgICAgICAgICAgIHNoZWxsUXVvdGUoZm4pLCkpCiAKLSAgICBjb25maWd1cmVfYXJncyA9IFsKLSAgICAgICAgIi0tcHJlZml4PS91c3IvbG9jYWwiLAotICAgICAgICAiLS1lbmFibGUtc3RhdGljIiwKLSAgICAgICAgIi0tZGlzYWJsZS1zaGFyZWQiLAotICAgICAgICAjIkNQUD1nY2MgLWFyY2ggJXMgLUUiJSgnIC1hcmNoICcuam9pbihhcmNoTGlzdCwpLCksCi0gICAgXQorICAgIGlmIGNvbmZpZ3VyZSBpcyBub3QgTm9uZToKKyAgICAgICAgY29uZmlndXJlX2FyZ3MgPSBbCisgICAgICAgICAgICAiLS1wcmVmaXg9L3Vzci9sb2NhbCIsCisgICAgICAgICAgICAiLS1lbmFibGUtc3RhdGljIiwKKyAgICAgICAgICAgICItLWRpc2FibGUtc2hhcmVkIiwKKyAgICAgICAgICAgICMiQ1BQPWdjYyAtYXJjaCAlcyAtRSIlKCcgLWFyY2ggJy5qb2luKGFyY2hMaXN0LCksKSwKKyAgICAgICAgXQogCi0gICAgaWYgJ2NvbmZpZ3VyZV9wcmUnIGluIHJlY2lwZToKLSAgICAgICAgYXJncyA9IGxpc3QocmVjaXBlWydjb25maWd1cmVfcHJlJ10pCi0gICAgICAgIGlmICctLWRpc2FibGUtc3RhdGljJyBpbiBhcmdzOgotICAgICAgICAgICAgY29uZmlndXJlX2FyZ3MucmVtb3ZlKCctLWVuYWJsZS1zdGF0aWMnKQotICAgICAgICBpZiAnLS1lbmFibGUtc2hhcmVkJyBpbiBhcmdzOgotICAgICAgICAgICAgY29uZmlndXJlX2FyZ3MucmVtb3ZlKCctLWRpc2FibGUtc2hhcmVkJykKLSAgICAgICAgY29uZmlndXJlX2FyZ3MuZXh0ZW5kKGFyZ3MpCisgICAgICAgIGlmICdjb25maWd1cmVfcHJlJyBpbiByZWNpcGU6CisgICAgICAgICAgICBhcmdzID0gbGlzdChyZWNpcGVbJ2NvbmZpZ3VyZV9wcmUnXSkKKyAgICAgICAgICAgIGlmICctLWRpc2FibGUtc3RhdGljJyBpbiBhcmdzOgorICAgICAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLnJlbW92ZSgnLS1lbmFibGUtc3RhdGljJykKKyAgICAgICAgICAgIGlmICctLWVuYWJsZS1zaGFyZWQnIGluIGFyZ3M6CisgICAgICAgICAgICAgICAgY29uZmlndXJlX2FyZ3MucmVtb3ZlKCctLWRpc2FibGUtc2hhcmVkJykKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChhcmdzKQogCi0gICAgaWYgcmVjaXBlLmdldCgndXNlTERGbGFncycsIDEpOgotICAgICAgICBjb25maWd1cmVfYXJncy5leHRlbmQoWwotICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAotICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCksCisgICAgICAgIGlmIHJlY2lwZS5nZXQoJ3VzZUxERmxhZ3MnLCAxKToKKyAgICAgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmV4dGVuZChbCisgICAgICAgICAgICAgICAgIkNGTEFHUz0tYXJjaCAlcyAtaXN5c3Jvb3QgJXMgLUklcy91c3IvbG9jYWwvaW5jbHVkZSIlKAorICAgICAgICAgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKVsxOi0xXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sKSwKKyAgICAgICAgICAgICAgICAiTERGTEFHUz0tc3lzbGlicm9vdCwlcyAtTCVzL3Vzci9sb2NhbC9saWIgLWFyY2ggJXMiJSgKICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKVsxOi0xXSwKLSAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwpLAotICAgICAgICAgICAgIkxERkxBR1M9LXN5c2xpYnJvb3QsJXMgLUwlcy91c3IvbG9jYWwvbGliIC1hcmNoICVzIiUoCi0gICAgICAgICAgICAgICAgc2hlbGxRdW90ZShTREtQQVRIKVsxOi0xXSwKLSAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLAotICAgICAgICAgICAgICAgICcgLWFyY2ggJy5qb2luKGFyY2hMaXN0KSksCi0gICAgICAgIF0pCi0gICAgZWxzZToKLSAgICAgICAgY29uZmlndXJlX2FyZ3MuZXh0ZW5kKFsKLSAgICAgICAgICAgICJDRkxBR1M9LWFyY2ggJXMgLWlzeXNyb290ICVzIC1JJXMvdXNyL2xvY2FsL2luY2x1ZGUiJSgKLSAgICAgICAgICAgICAgICAgICAgJyAtYXJjaCAnLmpvaW4oYXJjaExpc3QpLAotICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAotICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKGJhc2VkaXIpWzE6LTFdLCksCi0gICAgICAgIF0pCisgICAgICAgICAgICAgICAgICAgIHNoZWxsUXVvdGUoYmFzZWRpcilbMTotMV0sCisgICAgICAgICAgICAgICAgICAgICcgLWFyY2ggJy5qb2luKGFyY2hMaXN0KSksCisgICAgICAgICAgICBdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29uZmlndXJlX2FyZ3MuZXh0ZW5kKFsKKyAgICAgICAgICAgICAgICAiQ0ZMQUdTPS1hcmNoICVzIC1pc3lzcm9vdCAlcyAtSSVzL3Vzci9sb2NhbC9pbmNsdWRlIiUoCisgICAgICAgICAgICAgICAgICAgICAgICAnIC1hcmNoICcuam9pbihhcmNoTGlzdCksCisgICAgICAgICAgICAgICAgICAgICAgICBzaGVsbFF1b3RlKFNES1BBVEgpWzE6LTFdLAorICAgICAgICAgICAgICAgICAgICAgICAgc2hlbGxRdW90ZShiYXNlZGlyKVsxOi0xXSwpLAorICAgICAgICAgICAgXSkKIAotICAgIGlmICdjb25maWd1cmVfcG9zdCcgaW4gcmVjaXBlOgotICAgICAgICBjb25maWd1cmVfYXJncyA9IGNvbmZpZ3VyZV9hcmdzID0gbGlzdChyZWNpcGVbJ2NvbmZpZ3VyZV9wb3N0J10pCisgICAgICAgIGlmICdjb25maWd1cmVfcG9zdCcgaW4gcmVjaXBlOgorICAgICAgICAgICAgY29uZmlndXJlX2FyZ3MgPSBjb25maWd1cmVfYXJncyA9IGxpc3QocmVjaXBlWydjb25maWd1cmVfcG9zdCddKQogCi0gICAgY29uZmlndXJlX2FyZ3MuaW5zZXJ0KDAsIGNvbmZpZ3VyZSkKLSAgICBjb25maWd1cmVfYXJncyA9IFsgc2hlbGxRdW90ZShhKSBmb3IgYSBpbiBjb25maWd1cmVfYXJncyBdCisgICAgICAgIGNvbmZpZ3VyZV9hcmdzLmluc2VydCgwLCBjb25maWd1cmUpCisgICAgICAgIGNvbmZpZ3VyZV9hcmdzID0gWyBzaGVsbFF1b3RlKGEpIGZvciBhIGluIGNvbmZpZ3VyZV9hcmdzIF0KIAotICAgIHByaW50ICJSdW5uaW5nIGNvbmZpZ3VyZSBmb3IgJXMiJShuYW1lLCkKLSAgICBydW5Db21tYW5kKCcgJy5qb2luKGNvbmZpZ3VyZV9hcmdzKSArICcgMj4mMScpCisgICAgICAgIHByaW50ICJSdW5uaW5nIGNvbmZpZ3VyZSBmb3IgJXMiJShuYW1lLCkKKyAgICAgICAgcnVuQ29tbWFuZCgnICcuam9pbihjb25maWd1cmVfYXJncykgKyAnIDI+JjEnKQogCiAgICAgcHJpbnQgIlJ1bm5pbmcgaW5zdGFsbCBmb3IgJXMiJShuYW1lLCkKICAgICBydW5Db21tYW5kKCd7ICcgKyBpbnN0YWxsICsgJyA7fSAyPiYxJykKQEAgLTU1MCw3ICs1NzMsNyBAQAogICAgIG9zLm1ha2VkaXJzKG9zLnBhdGguam9pbih1bml2ZXJzYWwsICd1c3InLCAnbG9jYWwnLCAnaW5jbHVkZScpKQogCiAgICAgZm9yIHJlY2lwZSBpbiBMSUJSQVJZX1JFQ0lQRVM6Ci0gICAgICAgIGJ1aWxkUmVjaXBlKHJlY2lwZSwgdW5pdmVyc2FsLCAoJ2kzODYnLCAncHBjJywpKQorICAgICAgICBidWlsZFJlY2lwZShyZWNpcGUsIHVuaXZlcnNhbCwgQVJDSExJU1QpCiAKIAogCkBAIC02ODYsNiArNzA5LDkgQEAKICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCckTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUJywgJzEwLjMgb3IgbGF0ZXInKQogICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJyRBUkNISVRFQ1RVUkVTJywgImkzODYsIHBwYyIpCiAgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnJElOU1RBTExfU0laRScsIGluc3RhbGxTaXplKCkpCisKKyAgICAjIFRoaXMgb25lIGlzIG5vdCBoYW5keSBhcyBhIHRlbXBsYXRlIHZhcmlhYmxlCisgICAgZGF0YSA9IGRhdGEucmVwbGFjZSgnJFBZVEhPTkZSQU1FV09SS0lOU1RBTExESVInLCAnL0xpYnJhcnkvRnJhbWV3b3Jrcy9QeXRob24uZnJhbWV3b3JrJykKICAgICBmcCA9IG9wZW4ob3V0UGF0aCwgJ3diJykKICAgICBmcC53cml0ZShkYXRhKQogICAgIGZwLmNsb3NlKCkKQEAgLTcwMyw3ICs3MjksMTAgQEAKIGRlZiBwYWNrYWdlRnJvbVJlY2lwZSh0YXJnZXREaXIsIHJlY2lwZSk6CiAgICAgY3VyZGlyID0gb3MuZ2V0Y3dkKCkKICAgICB0cnk6Ci0gICAgICAgIHBrZ25hbWUgPSByZWNpcGVbJ25hbWUnXQorICAgICAgICAjIFRoZSBtYWpvciB2ZXJzaW9uIChzdWNoIGFzIDIuNSkgaXMgaW5jbHVkZWQgaW4gdGhlIHBhY2FrZ2UgbmFtZQorICAgICAgICAjIGJlY2F1c2UgaGF2ZWluZyB0d28gdmVyc2lvbiBvZiBweXRob24gaW5zdGFsbGVkIGF0IHRoZSBzYW1lIHRpbWUgaXMKKyAgICAgICAgIyBjb21tb24uCisgICAgICAgIHBrZ25hbWUgPSAnJXMtJXMnJShyZWNpcGVbJ25hbWUnXSwgZ2V0VmVyc2lvbigpKQogICAgICAgICBzcmNkaXIgID0gcmVjaXBlLmdldCgnc291cmNlJykKICAgICAgICAgcGtncm9vdCA9IHJlY2lwZS5nZXQoJ3RvcGRpcicsIHNyY2RpcikKICAgICAgICAgcG9zdGZsaWdodCA9IHJlY2lwZS5nZXQoJ3Bvc3RmbGlnaHQnKQpAQCAtODA0LDcgKzgzMyw3IEBACiAgICAgICAgICAgICBJRlBrZ0ZsYWdDb21wb25lbnREaXJlY3Rvcnk9IkNvbnRlbnRzL1BhY2thZ2VzIiwKICAgICAgICAgICAgIElGUGtnRmxhZ1BhY2thZ2VMaXN0PVsKICAgICAgICAgICAgICAgICBkaWN0KAotICAgICAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdQYWNrYWdlTG9jYXRpb249JyVzLnBrZyclKGl0ZW1bJ25hbWUnXSksCisgICAgICAgICAgICAgICAgICAgIElGUGtnRmxhZ1BhY2thZ2VMb2NhdGlvbj0nJXMtJXMucGtnJyUoaXRlbVsnbmFtZSddLCBnZXRWZXJzaW9uKCkpLAogICAgICAgICAgICAgICAgICAgICBJRlBrZ0ZsYWdQYWNrYWdlU2VsZWN0aW9uPSdzZWxlY3RlZCcKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgZm9yIGl0ZW0gaW4gUEtHX1JFQ0lQRVMKQEAgLTgxMiw2ICs4NDEsNyBAQAogICAgICAgICAgICAgSUZQa2dGb3JtYXRWZXJzaW9uPTAuMTAwMDAwMDAxNDkwMTE2MTIsCiAgICAgICAgICAgICBJRlBrZ0ZsYWdCYWNrZ3JvdW5kU2NhbGluZz0icHJvcG9ydGlvbmFsIiwKICAgICAgICAgICAgIElGUGtnRmxhZ0JhY2tncm91bmRBbGlnbm1lbnQ9ImxlZnQiLAorICAgICAgICAgICAgSUZQa2dGbGFnQXV0aG9yaXphdGlvbkFjdGlvbj0iUm9vdEF1dGhvcml6YXRpb24iLAogICAgICAgICApCiAKICAgICB3cml0ZVBsaXN0KHBsLCBwYXRoKQpAQCAtODU5LDcgKzg4OSw3IEBACiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBwYXRjaEZpbGUob3MucGF0aC5qb2luKCdyZXNvdXJjZXMnLCBmbiksIG9zLnBhdGguam9pbihyc3JjRGlyLCBmbikpCiAKLSAgICBzaHV0aWwuY29weSgiLi4vLi4vLi4vTElDRU5TRSIsIG9zLnBhdGguam9pbihyc3JjRGlyLCAnTGljZW5zZS50eHQnKSkKKyAgICBzaHV0aWwuY29weSgiLi4vLi4vTElDRU5TRSIsIG9zLnBhdGguam9pbihyc3JjRGlyLCAnTGljZW5zZS50eHQnKSkKIAogCiBkZWYgaW5zdGFsbFNpemUoY2xlYXI9RmFsc2UsIF9zYXZlZD1bXSk6CkBAIC05OTAsNyArMTAyMCw3IEBACiAgICAgYnVpbGRQeXRob25Eb2NzKCkKICAgICBmbiA9IG9zLnBhdGguam9pbihXT1JLRElSLCAiX3Jvb3QiLCAiQXBwbGljYXRpb25zIiwKICAgICAgICAgICAgICAgICAiTWFjUHl0aG9uICVzIiUoZ2V0VmVyc2lvbigpLCksICJVcGRhdGUgU2hlbGwgUHJvZmlsZS5jb21tYW5kIikKLSAgICBzaHV0aWwuY29weSgic2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUiLCAgZm4pCisgICAgcGF0Y2hGaWxlKCJzY3JpcHRzL3Bvc3RmbGlnaHQucGF0Y2gtcHJvZmlsZSIsICBmbikKICAgICBvcy5jaG1vZChmbiwgMDc1NSkKIAogICAgIGZvbGRlciA9IG9zLnBhdGguam9pbihXT1JLRElSLCAiX3Jvb3QiLCAiQXBwbGljYXRpb25zIiwgIk1hY1B5dGhvbiAlcyIlKApAQCAtMTAwNSw3ICsxMDM1LDcgQEAKICAgICBwYXRjaEZpbGUoJ3Jlc291cmNlcy9SZWFkTWUudHh0Jywgb3MucGF0aC5qb2luKFdPUktESVIsICdpbnN0YWxsZXInLCAnUmVhZE1lLnR4dCcpKQogCiAgICAgIyBEaXR0byBmb3IgdGhlIGxpY2Vuc2UgZmlsZS4KLSAgICBzaHV0aWwuY29weSgnLi4vLi4vLi4vTElDRU5TRScsIG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJywgJ0xpY2Vuc2UudHh0JykpCisgICAgc2h1dGlsLmNvcHkoJy4uLy4uL0xJQ0VOU0UnLCBvcy5wYXRoLmpvaW4oV09SS0RJUiwgJ2luc3RhbGxlcicsICdMaWNlbnNlLnR4dCcpKQogCiAgICAgZnAgPSBvcGVuKG9zLnBhdGguam9pbihXT1JLRElSLCAnaW5zdGFsbGVyJywgJ0J1aWxkLnR4dCcpLCAndycpCiAgICAgcHJpbnQgPj4gZnAsICIjIEJVSUxEIElORk8iCmRpZmYgLS1naXQgYS9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1dlbGNvbWUucnRmIGIvTWFjL0J1aWxkU2NyaXB0L3Jlc291cmNlcy9XZWxjb21lLnJ0ZgppbmRleCBjYjY1ZjA5Li5kMDdlMTA0IDEwMDY0NAotLS0gYS9NYWMvQnVpbGRTY3JpcHQvcmVzb3VyY2VzL1dlbGNvbWUucnRmCisrKyBiL01hYy9CdWlsZFNjcmlwdC9yZXNvdXJjZXMvV2VsY29tZS5ydGYKQEAgLTEsNCArMSw0IEBACi17XHJ0ZjFcbWFjXGFuc2ljcGcxMDAwMFxjb2NvYXJ0ZjgyNFxjb2NvYXN1YnJ0ZjMzMAore1xydGYxXG1hY1xhbnNpY3BnMTAwMDBcY29jb2FydGY4MjRcY29jb2FzdWJydGY0MTAKIHtcZm9udHRibFxmMFxmc3dpc3NcZmNoYXJzZXQ3NyBIZWx2ZXRpY2E7XGYxXGZzd2lzc1xmY2hhcnNldDc3IEhlbHZldGljYS1Cb2xkO30KIHtcY29sb3J0Ymw7XHJlZDI1NVxncmVlbjI1NVxibHVlMjU1O30KIFxwYXBlcncxMTkwMFxwYXBlcmgxNjg0MFxtYXJnbDE0NDBcbWFyZ3IxNDQwXHZpZXd3OTkyMFx2aWV3aDEwNjYwXHZpZXdraW5kMApAQCAtMTIsNCArMTIsNyBAQAogXAogTWFjUHl0aG9uIGNvbnNpc3RzIG9mIHRoZSBQeXRob24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIsIHBsdXMgYSBzZXQgb2YgcHJvZ3JhbXMgdG8gYWxsb3cgZWFzeSBhY2Nlc3MgdG8gaXQgZm9yIE1hYyB1c2VycyAoYW4gaW50ZWdyYXRlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCwgYW4gYXBwbGV0IGJ1aWxkZXIpLCBwbHVzIGEgc2V0IG9mIHByZS1idWlsdCBleHRlbnNpb24gbW9kdWxlcyB0aGF0IG9wZW4gdXAgc3BlY2lmaWMgTWFjaW50b3NoIHRlY2hub2xvZ2llcyB0byBQeXRob24gcHJvZ3JhbXMgKENhcmJvbiwgQXBwbGVTY3JpcHQsIFF1aWNrdGltZSwgbW9yZSkuXAogXAotU2VlIHRoZSBSZWFkTWUgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi59ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorU2VlIHRoZSBSZWFkTWUgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cCitcCitcCitUaGlzIHBhY2thZ2Ugd2lsbCBieSBkZWZhdWx0IHVwZGF0ZSB5b3VyIHNoZWxsIHByb2ZpbGUgdG8gZW5zdXJlIHRoYXQgdGhpcyB2ZXJzaW9uIG9mIFB5dGhvbiBpcyBvbiB0aGUgc2VhcmNoIHBhdGggb2YgeW91ciBzaGVsbC4gUGxlYXNlIGRlc2VsZWN0IHRoZSAiU2hlbGwgcHJvZmlsZSB1cGRhdGVyIiBwYWNrYWdlIG9uIHRoZSBwYWNrYWdlIGN1c3RvbWl6YXRpb24gc2NyZWVuICBpZiB5b3Ugd2FudCB0byBhdm9pZCB0aGlzIG1vZGlmaWNhdGlvbi4gfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQuZnJhbWV3b3JrIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKaW5kZXggNTMyZTc0NS4uYjc5NmExMCAxMDA3NTUKLS0tIGEvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKKysrIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5mcmFtZXdvcmsKQEAgLTQsNyArNCw3IEBACiAjCiAKIFBZVkVSPSJAUFlWRVJAIgotRldLPSIvTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvQFBZVkVSQC8iCitGV0s9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy9AUFlWRVJAIgogCiAiJHtGV0t9L2Jpbi9weXRob24iIC1XaSAtdHQgXAogICAgICIke0ZXS30vbGliL3B5dGhvbiR7UFlWRVJ9L2NvbXBpbGVhbGwucHkiIFwKZGlmZiAtLWdpdCBhL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQucGF0Y2gtcHJvZmlsZSBiL01hYy9CdWlsZFNjcmlwdC9zY3JpcHRzL3Bvc3RmbGlnaHQucGF0Y2gtcHJvZmlsZQppbmRleCA0OGJmNzAxLi5jNDJlMTFlIDEwMDc1NQotLS0gYS9NYWMvQnVpbGRTY3JpcHQvc2NyaXB0cy9wb3N0ZmxpZ2h0LnBhdGNoLXByb2ZpbGUKKysrIGIvTWFjL0J1aWxkU2NyaXB0L3NjcmlwdHMvcG9zdGZsaWdodC5wYXRjaC1wcm9maWxlCkBAIC01LDE0ICs1LDI3IEBACiBlY2hvICJUaGVzZSBjaGFuZ2VzIHdpbGwgYmUgZWZmZWN0aXZlIG9ubHkgaW4gc2hlbGwgd2luZG93cyB0aGF0IHlvdSBvcGVuIgogZWNobyAiYWZ0ZXIgcnVubmluZyB0aGlzIHNjcmlwdC4iCiAKLVBZVkVSPUBQWVZFUkAKK1BZVkVSPTIuNQogUFlUSE9OX1JPT1Q9Ii9MaWJyYXJ5L0ZyYW1ld29ya3MvUHl0aG9uLmZyYW1ld29yay9WZXJzaW9ucy9DdXJyZW50IgogCitpZiBbIGBpZCAtdXJgID0gMCBdOyB0aGVuCisJIyBSdW4gZnJvbSB0aGUgaW5zdGFsbGVyLCBkbyBzb21lIHRyaWNrZXJ5IHRvIGZldGNoIHRoZSBpbmZvcm1hdGlvbgorCSMgd2UgbmVlZC4KKwl0aGVTaGVsbD0iYGZpbmdlciAkVVNFUiB8IGdyZXAgU2hlbGw6IHwgaGVhZCAgLTEgfCBhd2sgJ3sgcHJpbnQgJE5GIH0nYCIKKworZWxzZQorCXRoZVNoZWxsPSIke1NIRUxMfSIKK2ZpCisKICMgTWFrZSBzdXJlIHRoZSBkaXJlY3RvcnkgJHtQWVRIT05fUk9PVH0vYmluIGlzIG9uIHRoZSB1c2VycyBQQVRILgotQlNIPSJgYmFzZW5hbWUgIiR7U0hFTEx9ImAiCitCU0g9ImBiYXNlbmFtZSAiJHt0aGVTaGVsbH0iYCIKIGNhc2UgIiR7QlNIfSIgaW4KIGJhc2h8a3NofHNofCpjc2gpCi0JUD0iYCR7U0hFTEx9IC1jICdlY2hvICRQQVRIJ2AiCisJaWYgWyBgaWQgLXVyYCA9IDAgXTsgdGhlbgorCQlQPWBzdSAtICR7VVNFUn0gLWMgJ2VjaG8gQS1YLTQtWEBAJFBBVEhAQFgtNC1YLUEnIHwgZ3JlcCAnQS1YLTQtWEBALipAQFgtNC1YLUEnIHwgc2VkIC1lICdzL15BLVgtNC1YQEAvL2cnIC1lICdzL0BAWC00LVgtQSQvL2cnYAorCWVsc2UKKwkJUD0iYChleGVjIC1sICR7dGhlU2hlbGx9IC1jICdlY2hvICRQQVRIJylgIgorCWZpCiAJOzsKICopCiAJZWNobyAiU29ycnksIEkgZG9uJ3Qga25vdyBob3cgdG8gcGF0Y2ggJEJTSCBzaGVsbHMiCkBAIC00MiwxMCArNTUsMTUgQEAKIAllY2hvICIjIFNldHRpbmcgUEFUSCBmb3IgTWFjUHl0aG9uICR7UFlWRVJ9IiA+PiAiJHtIT01FfS8uY3NocmMiCiAJZWNobyAiIyBUaGUgb3JnaW5hbCB2ZXJzaW9uIGlzIHNhdmVkIGluIC5jc2hyYy5weXNhdmUiID4+ICIke0hPTUV9Ly5jc2hyYyIKIAllY2hvICJzZXQgcGF0aD0oJHtQWVRIT05fUk9PVH0vYmluICInJHBhdGgnIikiID4+ICIke0hPTUV9Ly5jc2hyYyIKKwlpZiBbIGBpZCAtdXJgID0gMCBdOyB0aGVuCisJCWNob3duICIke1VTRVJ9IiAiJHtIT01FfS8uY3NocmMiCisJZmkKIAlleGl0IDAKIAk7OwogYmFzaCkKLQlpZiBbIC1lICIke0hPTUV9Ly5wcm9maWxlIiBdOyB0aGVuCisJaWYgWyAtZSAiJHtIT01FfS8uYmFzaF9wcm9maWxlIiBdOyB0aGVuCisJCVBSPSIke0hPTUV9Ly5iYXNoX3Byb2ZpbGUiCisJZWxpZiBbIC1lICIke0hPTUV9Ly5wcm9maWxlIiBdOyB0aGVuCiAJCVBSPSIke0hPTUV9Ly5wcm9maWxlIgogCWVsc2UKIAkJUFI9IiR7SE9NRX0vLmJhc2hfcHJvZmlsZSIKQEAgLTY2LDYgKzg0LDYgQEAKIGVjaG8gJ1BBVEg9IiciJHtQWVRIT05fUk9PVH0vYmluIic6JHtQQVRIfSInID4+ICIke1BSfSIKIGVjaG8gJ2V4cG9ydCBQQVRIJyA+PiAiJHtQUn0iCiBpZiBbIGBpZCAtdXJgID0gMCBdOyB0aGVuCi0JY2hvd24gIiR7TE9HTkFNRX0iICIke1BSfSIKKwljaG93biAiJHtVU0VSfSIgIiR7UFJ9IgogZmkKIGV4aXQgMApkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQuaHRtbCBiL01hYy9EZW1vL2FwcGxlc2NyaXB0Lmh0bWwKaW5kZXggMDE0ZTJhZC4uNWU0ZmFjNyAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQuaHRtbAorKysgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC5odG1sCkBAIC00LDYgKzQsMTAgQEAKIDxoMT5Vc2luZyB0aGUgT3BlbiBTY3JpcHRpbmcgQXJjaGl0ZWN0dXJlIGZyb20gUHl0aG9uPC9oMT4KIDxocj4KIAorPHA+PGI+Tk9URTo8L2I+IHRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBPU0Egc3VwcG9ydCB0aGF0IGlzIHNoaXBwZWQgd2l0aAordGhlIGNvcmUgcHl0aG9uIGRpc3RyaWJ1dGlvbi4gTW9zdCB1c2VycyBhcmUgYmV0dGVyIG9mIHdpdGggdGhlIG1vcmUgCit1c2VyZnJpZW5kbHkgPGEgaHJlZj0iaHR0cDovL2ZyZWVzcGFjZS52aXJnaW4ubmV0L2hhbWlzaC5zYW5kZXJzb24vYXBwc2NyaXB0Lmh0bWwiPmFwcHNjcmlwdCBsaWJyYXJ5PC9hPi4KKwogPHA+T1NBIHN1cHBvcnQgaW4gUHl0aG9uIGlzIHN0aWxsIG5vdCAxMDAlIGNvbXBsZXRlLCBidXQKIHRoZXJlIGlzIGFscmVhZHkgZW5vdWdoIGluIHBsYWNlIHRvIGFsbG93IHlvdSB0byBkbyBzb21lIG5pZnR5IHRoaW5ncwogd2l0aCBvdGhlciBwcm9ncmFtcyBmcm9tIHlvdXIgcHl0aG9uIHByb2dyYW0uIDwvcD4gCkBAIC0zNTUsNCArMzU5LDQgQEAKIAogCiA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorPC9odG1sPgpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vY2FsbGRsbC9yZWFkbWUgYi9NYWMvRGVtby9jYWxsZGxsL3JlYWRtZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU2NGRmZS4uMDAwMDAwMAotLS0gYS9NYWMvRGVtby9jYWxsZGxsL3JlYWRtZQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLVByZWxpbWluYXJ5IG5vdGVzL2RvY3VtZW50YXRpb24gZm9yIHRoZSBjYWxsZGxsIG1vZHVsZSwgdmVyc2lvbiAwLjIuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1DYWxsZGxsIGFsbG93cyB5b3UgdG8gY2FsbCByYW5kb20gQyBmdW5jdGlvbnMgZnJvbSBweXRob24gd2l0aG91dCB3cml0aW5nIGFueQotQyBjb2RlLiBJdCBpcyBtYWlubHkgbWVhbnQgdG8gY2FsbCBNYWNPUyB0b29sYm94IHJvdXRpbmVzIGZvciB3aGljaCBubyBQeXRob24KLXdyYXBwZXIgbW9kdWxlIGlzIGF2YWlsYWJsZS4gSXQgaXMgYWxzbyBpbmNvbXBsZXRlLCBpbiB0aGF0IG9ubHkgYSBmZXcgYXJndW1lbnQKLXR5cGVzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkLiBQbGVhc2UgbGV0IG1lIGtub3cgd2hpY2ggb3RoZXIgYXJndW1lbnQgdHlwZXMKLXlvdSBuZWVkLCBhbmQvb3Igd2hldGhlciB5b3UgaGF2ZSBhbnkgaWRlYXMgb24gYSBnZW5lcmFsICJlc2NhcGUiIGFsbG93aW5nIHBlb3BsZQotdG8gcGFzcyBhbnl0aGluZy4KLQotVGhlIG1vZHVsZSBleHBvcnRzIHRocmVlIGZ1bmN0aW9uczoKLS0gc3ltdGFibGUgPSBnZXRsaWJyYXJ5KGxpYnJhcnluYW1lKQotCUdldCBhIHJlZmVyZW5jZSB0byBpbXBvcnQgbGlicmFyeSBsaWJyYXJ5bmFtZS4gIkludGVyZmFjZUxpYiIgaXMgdGhlIG1vc3QgY29tbW9ubHkKLQl1c2VkIG9uZSwgY29udGFpbmluZyBtb3N0IHRvb2xib3ggcm91dGluZXMuIFRoZSBzeW1ib2wgdGFibGUgY2FuIGJlIHVzZWQKLQl0byBsb29rdXAgcm91dGluZXMgdG8gYmUgcGFzc2VkIHRvIG5ld2NhbGw6ICJzeW10YWJsZS5XYWl0TmV4dEV2ZW50IiB3aWxsCi0JcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHJvdXRpbmUgV2FpdE5leHRFdmVudC4gYW5kIHNvIHdpbGwgInN5bXRhYmxlWydXYWl0TmV4dEV2ZW50J10iLgotCVRoZSBzeW10YWJsZSBpcyBhIG1hcHBpbmcsIHNvIHlvdSBjYW4gdXNlIGtleXMoKSBhbmQgbGVuKC4uLikgdG8gaW5zcGVjdCBpdC4KLS0gc3ltdGFibGUgPSBnZXRkaXNrZnJhZ21lbnQoZmlsZSkKLQlMb2FkIHRoZSBzcGVjaWZpZWQgZmlsZSAoZ2l2ZW4gYnkgZnNzcGVjIG9yIGZpbGVuYW1lKSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvCi0JaXRzIHN5bWJvbHRhYmxlLgotLSBjYWxsYWJsZSA9IG5ld2NhbGwocm91dGluZSwgcmV0dXJudHlwZSwgW2FyZ3R5cGUsIC4uLl0pCi0JUmV0dXJuIGEgY2FsbGFibGUgb2JqZWN0LiBZb3Ugc3BlY2lmeSB0aGUgQyByb3V0aW5lIHRvIGJlIGNhbGxlZCAoYXMgZXhwbGFpbmVkIGFib3ZlKSwKLQl0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlIGFuZCB0aGUgYXJndW1lbnQgdHlwZXMuIFRoZSByZXN1bHRpbmcgb2JqZWN0IGNhbgotCWJlIGNhbGxlZCBmcm9tIFB5dGhvbiBjb2RlIGluIHRoZSBub3JtYWwgd2F5LCBhbmQgdHlwZWNoZWNraW5nIG9uIGFyZ3VtZW50cyBpcwotCXBlcmZvcm1lZCAoYnV0LCBvZiBjb3Vyc2UsIGlmIHlvdSBzcGVjaWZ5IGluY29ycmVjdCBhcmd1bWVudCB0eXBlcyBpbiB0aGlzIGNhbGwKLQl5b3UgbWF5IHdlbGwgY3Jhc2ggeW91ciBtYWNoaW5lKS4gUHJpbnRpbmcgYSBjYWxsYWJsZSB3aWxsIGdpdmUgeW91IGEgZGVzY3JpcHRpb24KLQlvZiB0aGUgKEMtKSBjYWxsaW5nIHNlcXVlbmNlLgotCi1UaGUgQyByZXR1cm4gdmFsdWUgY2FuIGJlIG9uZSBvZiAnTm9uZScsICdCeXRlJywgJ1Nob3J0JywgJ0xvbmcnLCAnUHN0cmluZycgKGEgcGFzY2FsCi1zdHJpbmcgcmV0dXJuZWQgYnkgYWRkcmVzcywgY29waWVkIHRvIGEgUHl0aG9uIHN0cmluZyksICdDb2JqZWN0JyAoYSB3cmFwcGVyIGFyb3VuZCBhIHZvaWQKLXBvaW50ZXIpLCAnSGFuZGxlJyAoYSBuZXcgaGFuZGxlLCByZXR1cm5lZCBhcyBhIFJlcy5SZXNvdXJjZSBvYmplY3QpIG9yICdPU0VycicgKHdoaWNoIHJhaXNlcwotTWFjT1MuRXJyb3IgaWYgbm9uLXplcm8pLgotCi1Bcmd1bWVudHMgY2FuIGJlIGFueSBvZiAnSW5CeXRlJywgJ0luU2hvcnQnLCAnSW5Mb25nJywgJ0luU3RyaW5nJyAoYSBweXRob24gc3RyaW5nLCB3aXRoIHRoZQotYWRkcmVzcyBvZiB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlIEMgcm91dGluZSwgc28gYmUgY2FyZWZ1bCEpLCAnSW5Qc3RyaW5nJyAoYSBweXRob24gc3RyaW5nIGNvcGllZAotdG8gYSBTdHIyNTUgYW5kIHBhc3NlZCBieSBhZGRyZXNzKSwgICdJbkNvYmplY3QnLCAnSW5IYW5kbGUnLCAnT3V0Qnl0ZScgKHN0b3JhZ2UgaXMgYWxsb2NhdGVkIGZvcgotYSBzaW5nbGUgYnl0ZSwgdGhlIGFkZHJlc3MgcGFzc2VkIHRvIEMgYW5kIHRoZSByZXN1bHRpbmcgdmFsdWUgcmV0dXJuZWQgdG8gUHl0aG9uKSwgJ091dFNob3J0JywKLSdPdXRMb25nJywgJ091dFBzdHJpbmcnIChhZ2Fpbjogc3RvcmFnZSBwcmUtYWxsb2NhdGVkIGFuZCB0aGUgYWRkcmVzcyBwYXNzZWQgdG8gQyksICdPdXRDb2JqZWN0JwotKHN0b3JhZ2UgZm9yIGEgdm9pZCAqIGlzIGFsbG9jYXRlZCwgdGhpcyB2b2lkICoqIGlzIHBhc3NlZCB0byBDIGFuZCB0aGUgcmVzdWx0aW5nIHZvaWQgKiBpcwotZW5jYXBzdWxhdGVkIGluIHRoZSBDb2JqZWN0IHJldHVybmVkKSBvciAnT3V0SGFuZGxlJyAoZGl0dG8sIHdoaWNoIG1lYW5zIHRoYXQgdGhpcyBpcyB1c3VhbGx5ICpub3QqCi13aGF0IHlvdSB1c2UsIHlvdSBub3JtYWxseSB1c2UgJ0luSGFuZGxlJyBiZWNhdXNlIG1vc3QgdG9vbGJveCBjYWxscyBleHBlY3QgeW91IHRvIHByZWFsbG9jYXRlCi10aGUgaGFuZGxlKS4KLQotQWxsIHZhbHVlcyB0byBiZSByZXR1cm5lZCAoZnJvbSB0aGUgcmV0dXJuIHZhbHVlIGFuZCB0aGUgT3V0IGFyZ3VtZW50cykgYXJlIGNvbGxlY3RlZC4gSWYgdGhlcmUKLWFyZW4ndCBhbnkgTm9uZSBpcyByZXR1cm5lZCwgaWYgdGhlcmUgaXMgb25lIHZhbHVlIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQsIGlmIHRoZXJlIGFyZSBtdWx0aXBsZQotdmFsdWVzIGEgdHVwbGUgaXMgcmV0dXJuZWQuCi0KLVRoZXJlIGlzIHRlc3QgY29kZSBpbiB0ZXN0Y2FsbGRsbC5weSwgYW5kIGEgbWluaW1hbCBleGFtcGxlIGluIHNhbXBsZWNhbGxkbGwucHkuCmRpZmYgLS1naXQgYS9NYWMvRGVtby9jYWxsZGxsL3NhbXBsZWNhbGxkbGwucHkgYi9NYWMvRGVtby9jYWxsZGxsL3NhbXBsZWNhbGxkbGwucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNWJiNWMuLjAwMDAwMDAKLS0tIGEvTWFjL0RlbW8vY2FsbGRsbC9zYW1wbGVjYWxsZGxsLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIwotIyBUZXN0IGNhbGxkbGwuIFRlbGwgdGhlIHVzZXIgaG93IG9mdGVuIG1lbnVzIGZsYXNoLCBhbmQgbGV0IGhlciBjaGFuZ2UgaXQuCi0jCi0KLWltcG9ydCBjYWxsZGxsCi1pbXBvcnQgc3lzCi0KLSMgT2J0YWluIGEgcmVmZXJlbmNlIHRvIHRoZSBsaWJyYXJ5IHdpdGggdGhlIHRvb2xib3ggY2FsbHMKLWludGVyZmFjZWxpYiA9IGNhbGxkbGwuZ2V0bGlicmFyeSgnSW50ZXJmYWNlTGliJykKLQotIyBHZXQgdGhlIHJvdXRpbmVzIHdlIG5lZWQgKHNlZSBMb3dNZW0uaCBmb3IgZGV0YWlscykKLUxNR2V0TWVudUZsYXNoID0gY2FsbGRsbC5uZXdjYWxsKGludGVyZmFjZWxpYi5MTUdldE1lbnVGbGFzaCwgJ1Nob3J0JykKLUxNU2V0TWVudUZsYXNoID0gY2FsbGRsbC5uZXdjYWxsKGludGVyZmFjZWxpYi5MTVNldE1lbnVGbGFzaCwgJ05vbmUnLCAnSW5TaG9ydCcpCi0KLXByaW50ICJNZW51cyBjdXJyZW50bHkgZmxhc2giLExNR2V0TWVudUZsYXNoKCksInRpbWVzLiIKLXByaW50ICJIb3cgb2Z0ZW4gd291bGQgeW91IGxpa2UgdGhlbSB0byBmbGFzaD8iLAotCi0jIE5vdGU6IHdlIHVzZSBpbnB1dCgpLCBzbyB5b3UgY2FuIHRyeSBwYXNzaW5nIG5vbi1pbnRlZ2VyIG9iamVjdHMKLW5ld2ZsYXNoID0gaW5wdXQoKQotTE1TZXRNZW51Rmxhc2gobmV3Zmxhc2gpCi0KLXByaW50ICJPa2F5LCBtZW51cyBub3cgZmxhc2giLCBMTUdldE1lbnVGbGFzaCgpLCJ0aW1lcy4iCi0KLXN5cy5leGl0KDEpICAgIyBTbyB0aGUgd2luZG93IHN0YXlzIG9uLXNjcmVlbgpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vY2FsbGRsbC90ZXN0Y2FsbGRsbC5weSBiL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZjY5NjQuLjAwMDAwMDAKLS0tIGEvTWFjL0RlbW8vY2FsbGRsbC90ZXN0Y2FsbGRsbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi1pbXBvcnQgY2FsbGRsbAotaW1wb3J0IG1hY2ZzCi1pbXBvcnQgc3lzCi1pbXBvcnQgTWFjT1MKLWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLQotZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlNob3cgbWUgY2FsbGRsbC5wcGMuc2xiIikKLQotbGliID0gY2FsbGRsbC5nZXRkaXNrZnJhZ21lbnQoZnNzLCAnY2FsbGRsbC5wcGMuc2xiJykKLQotY2RsbF9iX2JiYmJiYmJiID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2JfYmJiYmJiYmIsICdCeXRlJywgJ0luQnl0ZScsICdJbkJ5dGUnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5CeXRlJywgJ0luQnl0ZScsJ0luQnl0ZScsICdJbkJ5dGUnLCdJbkJ5dGUnLCAnSW5CeXRlJykKLWNkbGxfaF9oaGhoaGhoaCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9oX2hoaGhoaGhoLCAnU2hvcnQnLCAnSW5TaG9ydCcsICdJblNob3J0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luU2hvcnQnLCAnSW5TaG9ydCcsJ0luU2hvcnQnLCAnSW5TaG9ydCcsJ0luU2hvcnQnLCAnSW5TaG9ydCcpCi1jZGxsX2xfbGxsbGxsbGwgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfbF9sbGxsbGxsbCwgJ0xvbmcnLCAnSW5Mb25nJywgJ0luTG9uZycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbkxvbmcnLCAnSW5Mb25nJywnSW5Mb25nJywgJ0luTG9uZycsJ0luTG9uZycsICdJbkxvbmcnKQotCi1jZGxsX05fc3Nzc3Nzc3MgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfTl9zc3Nzc3NzcywgJ05vbmUnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnLCAnSW5TdHJpbmcnKQotCi1jZGxsX29fbCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9vX2wsICdPU0VycicsICdJbkxvbmcnKQotCi1jZGxsX05fcHAgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfTl9wcCwgJ05vbmUnLCAnSW5Qc3RyaW5nJywgJ091dFBzdHJpbmcnKQotCi1jZGxsX05fYmIgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfTl9iYiwgJ05vbmUnLCAnSW5CeXRlJywgJ091dEJ5dGUnKQotY2RsbF9OX2hoID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05faGgsICdOb25lJywgJ0luU2hvcnQnLCAnT3V0U2hvcnQnKQotY2RsbF9OX2xsID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fbGwsICdOb25lJywgJ0luTG9uZycsICdPdXRMb25nJykKLWNkbGxfTl9zSCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9OX3NILCAnTm9uZScsICdJblN0cmluZycsICdJbkhhbmRsZScpCi0KLXByaW50ICdUZXN0IGNkbGxfYl9iYmJiYmJiYicKLXJ2ID0gY2RsbF9iX2JiYmJiYmJiKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCi1pZiBydiA9PSAzNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfYl9iYmJiYmJiYiBuZWdhdGl2ZScKLXJ2ID0gY2RsbF9iX2JiYmJiYmJiKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKLWlmIHJ2ID09IC0zNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfaF9oaGhoaGhoaCcKLXJ2ID0gY2RsbF9oX2hoaGhoaGhoKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCi1pZiBydiA9PSAzNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfaF9oaGhoaGhoaCBuZWdhdGl2ZScKLXJ2ID0gY2RsbF9oX2hoaGhoaGhoKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKLWlmIHJ2ID09IC0zNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfbF9sbGxsbGxsbCcKLXJ2ID0gY2RsbF9sX2xsbGxsbGxsKDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgpCi1pZiBydiA9PSAzNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfbF9sbGxsbGxsbCBuZWdhdGl2ZScKLXJ2ID0gY2RsbF9sX2xsbGxsbGxsKC0xLCAtMiwgLTMsIC00LCAtNSwgLTYsIC03LCAtOCkKLWlmIHJ2ID09IC0zNjoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfTl9zc3Nzc3NzcycKLXByaW50ICdTaG91bGQgcHJpbnQgb25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4IHNldmVuIGVpZ2h0JwotcnYgPSBjZGxsX05fc3Nzc3Nzc3MoJ29uZScsICd0d28nLCAndGhyZWUnLCAnZm91cicsICdmaXZlJywgJ3NpeCcsICdzZXZlbicsICdlaWdodCcpCi1pZiBydiA9PSBOb25lOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQotcHJpbnQgJ1Rlc3QgY2RsbF9vX2woMCknCi1ydiA9IGNkbGxfb19sKDApCi1pZiBydiA9PSBOb25lOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdFcnJvciwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX29fbCgtMTAwKScKLXRyeToKLSAgICBydiA9IGNkbGxfb19sKC0xMDApCi0gICAgcHJpbnQgJ0Vycm9yLCBkaWQgbm90IHJhaXNlIGV4Y2VwdGlvbiwgcmV0dXJuZWQnLCBydgotZXhjZXB0IE1hY09TLkVycm9yLCBhcmc6Ci0gICAgaWYgYXJnWzBdID09IC0xMDA6Ci0gICAgICAgIHByaW50ICdvay4nCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgJ0Vycm9yLCByZXR1cm5lZCBpbmNvcnJlY3QgZXhjZXB0aW9uIGFyZzonLCBhcmdbMF0KLQotcHJpbnQgJ1Rlc3QgY2RsbF9OX3BwJwotcnYgPSBjZGxsX05fcHAoJ3Bhc2NhbCBzdHJpbmcnKQotaWYgcnYgPT0gJ1dhczogcGFzY2FsIHN0cmluZyc6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCByZXByKHJ2KQotCi1wcmludCAnVGVzdCBjZGxsX05fYmInCi1ydiA9IGNkbGxfTl9iYigtMTAwKQotaWYgcnYgPT0gLTEwMDoKLSAgICBwcmludCAnb2suJwotZWxzZToKLSAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0KLXByaW50ICdUZXN0IGNkbGxfTl9oaCcKLXJ2ID0gY2RsbF9OX2hoKC0xMDApCi1pZiBydiA9PSAtMTAwOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQotcHJpbnQgJ1Rlc3QgY2RsbF9OX2xsJwotcnYgPSBjZGxsX05fbGwoLTEwMCkKLWlmIHJ2ID09IC0xMDA6Ci0gICAgcHJpbnQgJ29rLicKLWVsc2U6Ci0gICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgotCi1wcmludCAnVGVzdCBjZGxsX05fc0gnCi1oID0gUmVzLlJlc291cmNlKCd4eXonKQotcnYgPSBjZGxsX05fc0goJ25ldyBkYXRhJywgaCkKLWlmIHJ2ID09IE5vbmUgYW5kIGguZGF0YSA9PSAnbmV3IGRhdGEnOgotICAgIHByaW50ICdvay4nCi1lbHNlOgotICAgIHByaW50ICdGYWlsZWQsIHJ2IGlzJywgcnYsICdhbmQgaGFuZGxlIGRhdGEgaXMnLCByZXByKHJ2LmRhdGEpCi1zeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vaW5kZXguaHRtbCBiL01hYy9EZW1vL2luZGV4Lmh0bWwKaW5kZXggNDQzY2NlOS4uOWUwMWU5ZiAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vaW5kZXguaHRtbAorKysgYi9NYWMvRGVtby9pbmRleC5odG1sCkBAIC0zLDE1ICszLDE2IEBACiA8SDE+PElNRyBTUkM9Imh0bWwuaWNvbnMvcHl0aG9uLmdpZiI+TWFjaW50b3NoIFB5dGhvbiBjcmFzaCBjb3Vyc2U8L0gxPgogPEhSPgogCi1UaGlzIHNldCBvZiBkb2N1bWVudHMgcHJvdmlkZXMgYW4gaW50cm9kdWN0aW9uIHRvIHZhcmlvdXMgYXNwZWN0cyBvZgorPHA+VGhpcyBzZXQgb2YgZG9jdW1lbnRzIHByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byB2YXJpb3VzIGFzcGVjdHMgb2YKIFB5dGhvbiBwcm9ncmFtbWluZyBvbiB0aGUgTWFjLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHJlYWRlciBpcwogYWxyZWFkeSBmYW1pbGlhciB3aXRoIFB5dGhvbiBhbmQsIHRvIHNvbWUgZXh0ZW50LCB3aXRoIE1hY09TIFRvb2xib3gKIHByb2dyYW1taW5nLiBPdGhlciByZWFkZXJzIG1heSBmaW5kIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoZXJlIHRvbywKLXlvdXIgbWlsZWFnZSBtYXkgdmFyeS4gPHA+Cit5b3VyIG1pbGVhZ2UgbWF5IHZhcnkuIDwvcD4KIAotVGhlcmUgaXMgYSBjb21wYW5pb24gZG9jdW1lbnQgPGEgaHJlZj0idXNpbmcuaHRtbCI+VXNpbmcgUHl0aG9uIG9uIHRoZSBNYWM8L2E+Ci13aGljaCB5b3Ugc2hvdWxkIHJlYWQgYmVmb3JlIHN0YXJ0aW5nIGhlcmU6IGl0IGV4cGxhaW5zIHRoZSBiYXNpY3Mgb2YgdXNpbmcKLXB5dGhvbiBvbiB0aGUgTWFjaW50b3NoLiA8cD4KKzxwPkFzIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggcmV2ZWFscyB0byB0aGUgY2FyZWZ1bCBvYnNlcnZlciB0aGVzZSBleGFtcGxlcworYXJlIGRhdGVkLCBtb3N0IG9mIHRoZW0gd2VyZSB3cml0dGluZyBiZWZvcmUgT1NYIGFuZCBoYXZlbid0IGJlZW4gdXBkYXRlZAorYWZ0ZXJ3YXJkcy4gVGhleSBzdGlsbCBzaG93IGhvdyB0byB1c2UgdGhlIENhcmJvbiB3cmFwcGVycyBidXQgYXJlbid0IAorbmVjZXNzYXJpbHkgdGhlIGJlc3Qgd2F5IHRvIHVzZSB0aGUgQ2FyYm9uIEFQSSdzIGluIE9TWC48L3A+CiAKIEFub3RoZXIgc2V0IG9mIE1hY2ludG9zaC1zYXZ2eSBleGFtcGxlcywgbW9yZSBhaW1lZCBhdCBiZWdpbm5lcnMsIGlzCiBtYWludGFpbmVkIGJ5IEpvc2VwaCBTdHJvdXQsIGF0IFB5dGhvbiBUaWRiaXRzIGluIDxBCkBAIC0yNywxMCArMjgsOSBAQAogaHJlZj0iaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8iPmRvY3VtZW50YXRpb248L2E+IHNlY3Rpb24gb24gdGhlCiB3ZWJzZXJ2ZXIuIDxwPgogCi1UaGUgVyB3aWRnZXQgc2V0IGJ5IEp1c3QgdmFuIFJvc3N1bSwgd2hpY2ggaXMgdXNlZCBieSB0aGUgUHl0aG9uIElERSwgZG9lcyBub3QKLWhhdmUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBhcyBvZiB0aGlzIHdyaXRpbmcsIGJ1dCBDb3JyYW4gV2Vic3RlciBoYXMKLWRvY3VtZW50ZWQgbW9zdCBvZiBpdCBvbiBoaXMKLTxBIEhSRUY9Imh0dHA6Ly93d3cubmV2YWRhLmVkdS9+Y3dlYnN0ZXIvUHl0aG9uLyI+UHl0aG9uIFBhZ2U8L0E+LiA8cD4KKzxwPlRoZSBXIHdpZGdldCBzZXQgYnkgSnVzdCB2YW4gUm9zc3VtLCBkb2VzIG5vdCBoYXZlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gYXMgCitvZiB0aGlzIHdyaXRpbmcsIGJ1dCBDb3JyYW4gV2Vic3RlciBoYXMgZG9jdW1lbnRlZCBtb3N0IG9mIGl0IG9uIGhpcworPEEgSFJFRj0iaHR0cDovL3d3dy5uZXZhZGEuZWR1L35jd2Vic3Rlci9QeXRob24vIj5QeXRob24gUGFnZTwvQT4uPC9wPgogCiBUaGVyZSBhcmUgYWxzbyBzb21lIGRvY3VtZW50YXRpb24gbGlua3MsIGFzIHdlbGwgYXMgb3RoZXIgTWFjUHl0aG9uLXJlbGF0ZWQKIHBhZ2VzLCBpbiB0aGUKZGlmZiAtLWdpdCBhL01hYy9JRExFL2NvbmZpZy1tYWluLmRlZiBiL01hYy9JRExFL2NvbmZpZy1tYWluLmRlZgppbmRleCAxY2RjMGM1Li40NjkxYTg1IDEwMDY0NAotLS0gYS9NYWMvSURMRS9jb25maWctbWFpbi5kZWYKKysrIGIvTWFjL0lETEUvY29uZmlnLW1haW4uZGVmCkBAIC03MSw3ICs3MSw3IEBACiAKIFtLZXlzXQogZGVmYXVsdD0gMQotbmFtZT0gSURMRSBDbGFzc2ljIE1hYworbmFtZT0gSURMRSBDbGFzc2ljIE9TWAogCiBbSGlzdG9yeV0KIGN5Y2xpYz0xCmRpZmYgLS1naXQgYS9NYWMvTWFrZWZpbGUuaW4gYi9NYWMvTWFrZWZpbGUuaW4KaW5kZXggODI1MTRiMi4uMTFmMTQzOCAxMDA2NDQKLS0tIGEvTWFjL01ha2VmaWxlLmluCisrKyBiL01hYy9NYWtlZmlsZS5pbgpAQCAtNSw3ICs1LDcgQEAKIFZFUlNJT049QFZFUlNJT05ACiBidWlsZGRpciA9IC4uCiBzcmNkaXI9QHNyY2RpckAKLXByZWZpeD0vTGlicmFyeS9GcmFtZXdvcmtzL1B5dGhvbi5mcmFtZXdvcmsvVmVyc2lvbnMvJChWRVJTSU9OKQorcHJlZml4PUBwcmVmaXhACiBMSUJERVNUPSQocHJlZml4KS9saWIvcHl0aG9uJChWRVJTSU9OKQogUlVOU0hBUkVEPUBSVU5TSEFSRURACiBCVUlMREVYRT1AQlVJTERFWEVFWFRACmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tYWNvc21vZHVsZS5jIGIvTWFjL01vZHVsZXMvTWFjT1MuYwpzaW1pbGFyaXR5IGluZGV4IDk5JQpyZW5hbWUgZnJvbSBNYWMvTW9kdWxlcy9tYWNvc21vZHVsZS5jCnJlbmFtZSB0byBNYWMvTW9kdWxlcy9NYWNPUy5jCmluZGV4IGVkODZmZDAuLjRlYWJiMzkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21hY29zbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvTWFjT1MuYwpAQCAtMzc1LDYgKzM3NSw3IEBACiAJCQkJLyogQW5kIHRyeSBhZ2Fpbi4uLiAqLwogCQkJCWggPSBHZXRSZXNvdXJjZSgnRXN0cicsIGVycik7CiAJCQl9CisJCQlQeV9ERUNSRUYobSk7CiAJCX0KIAl9CiAJLyoKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FlL19BRW1vZHVsZS5jIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKaW5kZXggNjhiZTNiZi4uZmQ2ZWJjYyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKKysrIGIvTWFjL01vZHVsZXMvYWUvX0FFbW9kdWxlLmMKQEAgLTgyOSwyMSArODI5LDE5IEBACiAKIHN0YXRpYyBQeU9iamVjdCAqQUVEZXNjX2dldF9kYXRhKEFFRGVzY09iamVjdCAqc2VsZiwgdm9pZCAqY2xvc3VyZSkKIHsKKwlQeU9iamVjdCAqcmVzOworCVNpemUgc2l6ZTsKKwljaGFyICpwdHI7CisJT1NFcnIgZXJyOwogCi0JICAgICAgICAgICAgUHlPYmplY3QgKnJlczsKLQkgICAgICAgICAgICBTaXplIHNpemU7Ci0JICAgICAgICAgICAgY2hhciAqcHRyOwotCSAgICAgICAgICAgIE9TRXJyIGVycjsKLQotCSAgICAgICAgICAgIHNpemUgPSBBRUdldERlc2NEYXRhU2l6ZSgmc2VsZi0+b2JfaXRzZWxmKTsKLQkgICAgICAgICAgICBpZiAoIChyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKSkgPT0gTlVMTCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQkgICAgICAgICAgICBpZiAoIChwdHIgPSBQeVN0cmluZ19Bc1N0cmluZyhyZXMpKSA9PSBOVUxMICkKLQkgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotCSAgICAgICAgICAgIGlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCi0JICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQkgICAgICAgICAgICByZXR1cm4gcmVzOwotCSAgICAgICAgICAgIAorCXNpemUgPSBBRUdldERlc2NEYXRhU2l6ZSgmc2VsZi0+b2JfaXRzZWxmKTsKKwlpZiAoIChyZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKSkgPT0gTlVMTCApCisJCXJldHVybiBOVUxMOworCWlmICggKHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykpID09IE5VTEwgKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoIChlcnI9QUVHZXREZXNjRGF0YSgmc2VsZi0+b2JfaXRzZWxmLCBwdHIsIHNpemUpKSA8IDAgKQorCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKKwlyZXR1cm4gcmVzOwogfQogCiAjZGVmaW5lIEFFRGVzY19zZXRfZGF0YSBOVUxMCkBAIC0xNDMxLDE0ICsxNDI5LDExIEBACiAJUHlPYmplY3QgKm07CiAJUHlPYmplY3QgKmQ7CiAKLQotCi0JICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKLQkgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ldyk7Ci0JICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKLQkgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKLQorICAgICAgICB1cHBfQUVJZGxlUHJvYyA9IE5ld0FFSWRsZVVQUChBRUlkbGVQcm9jKTsKKyAgICAgICAgdXBwX0dlbmVyaWNFdmVudEhhbmRsZXIgPSBOZXdBRUV2ZW50SGFuZGxlclVQUChHZW5lcmljRXZlbnRIYW5kbGVyKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhBRURlc2MgKiwgQUVEZXNjX05ld0JvcnJvd2VkKTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEFFRGVzYywgQUVEZXNjX0NvbnZlcnQpOwogCiAJbSA9IFB5X0luaXRNb2R1bGUoIl9BRSIsIEFFX21ldGhvZHMpOwogCWQgPSBQeU1vZHVsZV9HZXREaWN0KG0pOwpkaWZmIC0tZ2l0IGEvTWFjL1B5dGhvbkxhdW5jaGVyL0ZpbGVTZXR0aW5ncy5tIGIvTWFjL1B5dGhvbkxhdW5jaGVyL0ZpbGVTZXR0aW5ncy5tCmluZGV4IGZjMzkzN2IuLmJhMzc1YmEgMTAwNzU1Ci0tLSBhL01hYy9QeXRob25MYXVuY2hlci9GaWxlU2V0dGluZ3MubQorKysgYi9NYWMvUHl0aG9uTGF1bmNoZXIvRmlsZVNldHRpbmdzLm0KQEAgLTI0NSwxMiArMjQ1LDI2IEBACiAgICAgaWYgKHZhbHVlKSB3aXRoX3Rlcm1pbmFsID0gW3ZhbHVlIGJvb2xWYWx1ZV07CiB9CiAKKy0gKE5TU3RyaW5nKilfcmVwbGFjZVNpbmdsZVF1b3RlczogKE5TU3RyaW5nKilzdHJpbmcKK3sKKwkvKiBSZXBsYWNlIGFsbCBzaW5nbGUtcXVvdGVzIGJ5ICciJyInLCB0aGF0IHdheSBzaGVsbHF1b3Rpbmcgd2lsbAorCSAqIGJlIGNvcnJlY3Qgd2hlbiB0aGUgcmVzdWx0IHZhbHVlIGlzIGRlbGltaXRlZCAgdXNpbmcgc2luZ2xlIHF1b3Rlcy4KKwkgKi8KKwlOU0FycmF5KiBjb21wb25lbnRzID0gW3N0cmluZyBjb21wb25lbnRzU2VwYXJhdGVkQnlTdHJpbmc6QCInIl07CisKKwlyZXR1cm4gW2NvbXBvbmVudHMgY29tcG9uZW50c0pvaW5lZEJ5U3RyaW5nOkAiJ1wiJ1wiJyJdOworfQorCiAtIChOU1N0cmluZyAqKWNvbW1hbmRMaW5lRm9yU2NyaXB0OiAoTlNTdHJpbmcgKilzY3JpcHQKIHsKICAgICBOU1N0cmluZyAqY3VyX2ludGVycCA9IE5VTEw7CisgICAgTlNTdHJpbmcqIHNjcmlwdF9kaXIgPSBOVUxMOwogICAgIGNoYXIgaGFzaGJhbmdidWZbMTAyNF07CiAgICAgRklMRSAqZnA7CiAgICAgY2hhciAqcDsKKworICAgIHNjcmlwdF9kaXIgPSBbc2NyaXB0IHN1YnN0cmluZ1RvSW5kZXg6CisJICAgIFtzY3JpcHQgbGVuZ3RoXS1bW3NjcmlwdCBsYXN0UGF0aENvbXBvbmVudF0gbGVuZ3RoXV07CiAgICAgCiAgICAgaWYgKGhvbm91cmhhc2hiYW5nICYmCiAgICAgICAgKGZwPWZvcGVuKFtzY3JpcHQgY1N0cmluZ10sICJyIikpICYmCkBAIC0yNjYsOCArMjgwLDkgQEAKICAgICAgICAgY3VyX2ludGVycCA9IGludGVycHJldGVyOwogICAgICAgICAKICAgICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6Ci0gICAgICAgIEAiXCIlQFwiJXMlcyVzJXMlcyVzICVAIFwiJUBcIiAlQCAlcyIsCi0gICAgICAgIGN1cl9pbnRlcnAsCisgICAgICAgIEAiY2QgJyVAJyAmJiAnJUAnJXMlcyVzJXMlcyVzICVAICclQCcgJUAgJXMiLAorICAgIAlbc2VsZiBfcmVwbGFjZVNpbmdsZVF1b3RlczpzY3JpcHRfZGlyXSwKKyAgICAgICAgW3NlbGYgX3JlcGxhY2VTaW5nbGVRdW90ZXM6Y3VyX2ludGVycF0sCiAgICAgICAgIGRlYnVnPyIgLWQiOiIiLAogICAgICAgICB2ZXJib3NlPyIgLXYiOiIiLAogICAgICAgICBpbnNwZWN0PyIgLWkiOiIiLApAQCAtMjc1LDcgKzI5MCw3IEBACiAgICAgICAgIG5vc2l0ZT8iIC1TIjoiIiwKICAgICAgICAgdGFicz8iIC10IjoiIiwKICAgICAgICAgb3RoZXJzLAotICAgICAgICBzY3JpcHQsCisgICAgICAgIFtzZWxmIF9yZXBsYWNlU2luZ2xlUXVvdGVzOnNjcmlwdF0sCiAgICAgICAgIHNjcmlwdGFyZ3MsCiAgICAgICAgIHdpdGhfdGVybWluYWw/ICImJiBlY2hvIEV4aXQgc3RhdHVzOiAkPyAmJiBleGl0IDEiIDogIiAmIl07CiB9CmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvZml4YXBwbGVweXRob24yMy5weSBiL01hYy9Ub29scy9maXhhcHBsZXB5dGhvbjIzLnB5CmluZGV4IGVmMzUyY2UuLmZiODY0NWEgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9maXhhcHBsZXB5dGhvbjIzLnB5CisrKyBiL01hYy9Ub29scy9maXhhcHBsZXB5dGhvbjIzLnB5CkBAIC05NCw5ICs5NCwxOSBAQAogICAgIGVsc2U6CiAgICAgICAgIGRvX2FwcGx5ID0gVHJ1ZQogICAgICMgRmlyc3QgY2hlY2sgT1MgdmVyc2lvbgorICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gJ2xpdHRsZSc6CisgICAgICAgICMgQWxsIGludGVsIG1hY3MgYXJlIGZpbmUKKyAgICAgICAgcHJpbnQgImZpeGFwcGx5cHl0aG9uMjM6IG5vIGZpeCBpcyBuZWVkZWQgb24gTWFjT1NYIG9uIEludGVsIgorICAgICAgICBzeXMuZXhpdCgwKQorCiAgICAgaWYgZ2VzdGFsdC5nZXN0YWx0KCdzeXN2JykgPCAweDEwMzA6CiAgICAgICAgIHByaW50ICdmaXhhcHBsZXB5dGhvbjIzOiBubyBmaXggbmVlZGVkIG9uIE1hY09TWCA8IDEwLjMnCiAgICAgICAgIHN5cy5leGl0KDApCisKKyAgICBpZiBnZXN0YWx0Lmdlc3RhbHQoJ3N5c3YnKSA+PSAweDEwNDA6CisgICAgICAgIHByaW50ICdmaXhhcHBsZXB5dGhvbjIzOiBubyBmaXggbmVlZGVkIG9uIE1hY09TWCA+PSAxMC40JworICAgICAgICBzeXMuZXhpdCgwKQorCiAgICAgIyBUZXN0IHRoYXQgYSBmcmFtZXdvcmsgUHl0aG9uIGlzIGluZGVlZCBpbnN0YWxsZWQKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoTUFLRUZJTEUpOgogICAgICAgICBwcmludCAnZml4YXBwbGVweXRob24yMzogUHl0aG9uIGZyYW1ld29yayBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW5zdGFsbGVkICg/KSwgbm90aGluZyBmaXhlZCcKZGlmZiAtLWdpdCBhL01ha2VmaWxlLnByZS5pbiBiL01ha2VmaWxlLnByZS5pbgppbmRleCBmODIyODM4Li43NGNlOGE4IDEwMDY0NAotLS0gYS9NYWtlZmlsZS5wcmUuaW4KKysrIGIvTWFrZWZpbGUucHJlLmluCkBAIC0zMTgsNiArMzE4LDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIG9iamVjdHMgdGhhdCBnZXQgbGlua2VkIGludG8gdGhlIFB5dGhvbiBsaWJyYXJ5CiBMSUJSQVJZX09CSlM9CVwKKwkJTW9kdWxlcy9fdHlwZXNtb2R1bGUubyBcCiAJCU1vZHVsZXMvZ2V0YnVpbGRpbmZvLm8gXAogCQkkKFBBUlNFUl9PQkpTKSBcCiAJCSQoT0JKRUNUX09CSlMpIFwKQEAgLTM1NCw2ICszNTUsNyBAQAogJChMSUJSQVJZKTogJChMSUJSQVJZX09CSlMpCiAJLXJtIC1mICRACiAJJChBUikgY3IgJEAgTW9kdWxlcy9nZXRidWlsZGluZm8ubworCSQoQVIpIGNyICRAIE1vZHVsZXMvX3R5cGVzbW9kdWxlLm8KIAkkKEFSKSBjciAkQCAkKFBBUlNFUl9PQkpTKQogCSQoQVIpIGNyICRAICQoT0JKRUNUX09CSlMpCiAJJChBUikgY3IgJEAgJChQWVRIT05fT0JKUykKQEAgLTQ4Niw3ICs0ODgsNyBAQAogCiAkKEFTVF9DKTogJChBU1RfQVNETCkgJChBU0RMR0VOX0ZJTEVTKQogCSQoQVNETEdFTikgLWMgJChBU1RfQ19ESVIpICQoQVNUX0FTREwpCi0JCisKIFB5dGhvbi9jb21waWxlLm8gUHl0aG9uL3N5bXRhYmxlLm86ICQoR1JBTU1BUl9IKSAkKEFTVF9IKQogCiBQeXRob24vZ2V0cGxhdGZvcm0ubzogJChzcmNkaXIpL1B5dGhvbi9nZXRwbGF0Zm9ybS5jCkBAIC02NTEsMTYgKzY1MywxMSBAQAogCWVsc2UgdHJ1ZTsgXAogCWZpCiAJKGNkICQoREVTVERJUikkKEJJTkRJUik7ICQoTE4pIHB5dGhvbiQoVkVSU0lPTikkKEVYRSkgJChQWVRIT04pKQorCShjZCAkKERFU1RESVIpJChCSU5ESVIpOyAkKExOKSAtc2YgcHl0aG9uJChWRVJTSU9OKS1jb25maWcgcHl0aG9uLWNvbmZpZykKIAogIyBJbnN0YWxsIHRoZSBpbnRlcnByZXRlciB3aXRoICQoVkVSU0lPTikgYWZmaXhlZAogIyBUaGlzIGdvZXMgaW50byAkKGV4ZWNfcHJlZml4KQogYWx0YmluaW5zdGFsbDoJJChCVUlMRFBZVEhPTikKLQlAaWYgdGVzdCAiJChQWVRIT05GUkFNRVdPUktESVIpIiAhPSBuby1mcmFtZXdvcms7IHRoZW4gXAotCQlpZiB0ZXN0ICEgLWYgJChERVNURElSKSQoUFlUSE9ORlJBTUVXT1JLSU5TVEFMTERJUikvVmVyc2lvbnMvQ3VycmVudC9SZXNvdXJjZXMvSW5mby5wbGlzdDsgdGhlbiBcCi0JCQllY2hvICdGcmFtZXdvcmsgYnVpbGQ6IHVzZSAibWFrZSBmcmFtZXdvcmtpbnN0YWxsIiBpbiBzdGVhZCBvZiAibWFrZSBpbnN0YWxsIic7IFwKLQkJCWV4aXQgMTsgXAotCQlmaTsgXAotCWZpCiAJQGZvciBpIGluICQoQklORElSKSAkKExJQkRJUik7IFwKIAlkbyBcCiAJCWlmIHRlc3QgISAtZCAkKERFU1RESVIpJCRpOyB0aGVuIFwKQEAgLTcwMCw3ICs2OTcsNyBAQAogRVhUUkFQTEFURElSPSBARVhUUkFQTEFURElSQAogRVhUUkFNQUNIREVQUEFUSD1ARVhUUkFNQUNIREVQUEFUSEAKIE1BQ0hERVBTPQkkKFBMQVRESVIpICQoRVhUUkFQTEFURElSKQotWE1MTElCU1VCRElSUz0gIHhtbGNvcmUgeG1sY29yZS9kb20geG1sY29yZS9ldHJlZSB4bWxjb3JlL3BhcnNlcnMgeG1sY29yZS9zYXgKK1hNTExJQlNVQkRJUlM9ICB4bWwgeG1sL2RvbSB4bWwvZXRyZWUgeG1sL3BhcnNlcnMgeG1sL3NheAogUExBVE1BQ0RJUlM9IHBsYXQtbWFjIHBsYXQtbWFjL0NhcmJvbiBwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMgXAogCXBsYXQtbWFjL2xpYi1zY3JpcHRwYWNrYWdlcy9fYnVpbHRpblN1aXRlcyBcCiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL0NvZGVXYXJyaW9yIFwKQEAgLTcwOSwxNCArNzA2LDE0IEBACiAJcGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzL05ldHNjYXBlIFwKIAlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3RkU3VpdGVzIFwKIAlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvU3lzdGVtRXZlbnRzIFwKLQlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwKKwlwbGF0LW1hYy9saWItc2NyaXB0cGFja2FnZXMvVGVybWluYWwgCiBQTEFUTUFDUEFUSD06cGxhdC1tYWM6cGxhdC1tYWMvbGliLXNjcmlwdHBhY2thZ2VzCi1MSUJTVUJESVJTPQlsaWItb2xkIGxpYi10ayBzaXRlLXBhY2thZ2VzIHRlc3QgdGVzdC9vdXRwdXQgdGVzdC9kYXRhIFwKK0xJQlNVQkRJUlM9CWxpYi10ayBzaXRlLXBhY2thZ2VzIHRlc3QgdGVzdC9vdXRwdXQgdGVzdC9kYXRhIFwKIAkJdGVzdC9kZWNpbWFsdGVzdGRhdGEgXAogCQllbmNvZGluZ3MgY29tcGlsZXIgaG90c2hvdCBcCiAJCWVtYWlsIGVtYWlsL21pbWUgZW1haWwvdGVzdCBlbWFpbC90ZXN0L2RhdGEgXAogCQlzcWxpdGUzIHNxbGl0ZTMvdGVzdCBcCi0JCWxvZ2dpbmcgYnNkZGIgYnNkZGIvdGVzdCBjc3YgXAorCQlsb2dnaW5nIGJzZGRiIGJzZGRiL3Rlc3QgY3N2IHdzZ2lyZWYgXAogCQljdHlwZXMgY3R5cGVzL3Rlc3QgY3R5cGVzL21hY2hvbGliIGlkbGVsaWIgaWRsZWxpYi9JY29ucyBcCiAJCWRpc3R1dGlscyBkaXN0dXRpbHMvY29tbWFuZCBkaXN0dXRpbHMvdGVzdHMgJChYTUxMSUJTVUJESVJTKSBcCiAJCXNldHVwdG9vbHMgc2V0dXB0b29scy9jb21tYW5kIHNldHVwdG9vbHMvdGVzdHMgc2V0dXB0b29scy5lZ2ctaW5mbyBcCkBAIC03NDEsNyArNzM4LDcgQEAKIAkJZWxzZQl0cnVlOyBcCiAJCWZpOyBcCiAJZG9uZQotCUBmb3IgaSBpbiAkKHNyY2RpcikvTGliLyoucHkgJChzcmNkaXIpL0xpYi8qLmRvYzsgXAorCUBmb3IgaSBpbiAkKHNyY2RpcikvTGliLyoucHkgJChzcmNkaXIpL0xpYi8qLmRvYyAkKHNyY2RpcikvTGliLyouZWdnLWluZm8gOyBcCiAJZG8gXAogCQlpZiB0ZXN0IC14ICQkaTsgdGhlbiBcCiAJCQkkKElOU1RBTExfU0NSSVBUKSAkJGkgJChERVNURElSKSQoTElCREVTVCk7IFwKQEAgLTg1Nyw4ICs4NTQsOCBAQAogCSQoSU5TVEFMTF9TQ1JJUFQpICQoc3JjZGlyKS9pbnN0YWxsLXNoICQoREVTVERJUikkKExJQlBMKS9pbnN0YWxsLXNoCiAJIyBTdWJzdGl0dXRpb24gaGFwcGVucyBoZXJlLCBhcyB0aGUgY29tcGxldGVseS1leHBhbmRlZCBCSU5ESVIKIAkjIGlzIG5vdCBhdmFpbGFibGUgaW4gY29uZmlndXJlCi0Jc2VkIC1lICJzLEBCSU5ESVJALCQoQklORElSKSwiIDwgJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbiA+cHl0aG9uLWNvbmZpZwotCSQoSU5TVEFMTF9TQ1JJUFQpIHB5dGhvbi1jb25maWcgJChERVNURElSKSQoQklORElSKS9weXRob24tY29uZmlnCisJc2VkIC1lICJzLEBFWEVOQU1FQCwkKEJJTkRJUikvcHl0aG9uJChWRVJTSU9OKSQoRVhFKSwiIDwgJChzcmNkaXIpL01pc2MvcHl0aG9uLWNvbmZpZy5pbiA+cHl0aG9uLWNvbmZpZworCSQoSU5TVEFMTF9TQ1JJUFQpIHB5dGhvbi1jb25maWcgJChERVNURElSKSQoQklORElSKS9weXRob24kKFZFUlNJT04pLWNvbmZpZwogCXJtIHB5dGhvbi1jb25maWcKIAlAaWYgWyAtcyBNb2R1bGVzL3B5dGhvbi5leHAgLWEgXAogCQkiYGVjaG8gJChNQUNIREVQKSB8IHNlZCAncy9eXCguLi5cKS4qL1wxLydgIiA9ICJhaXgiIF07IHRoZW4gXApAQCAtOTM5LDcgKzkzNiwxMCBAQAogCSQoSU5TVEFMTF9TSEFSRUQpICQoTERMSUJSQVJZKSAkKERFU1RESVIpJChQWVRIT05GUkFNRVdPUktQUkVGSVgpLyQoTERMSUJSQVJZKQogCiAjIFRoaXMgaW5zdGFsbHMgTWFjL0xpYiBpbnRvIHRoZSBmcmFtZXdvcmsKKyMgSW5zdGFsbCBhIG51bWJlciBvZiBzeW1saW5rcyB0byBrZWVwIHNvZnR3YXJlIHRoYXQgZXhwZWN0cyBhIG5vcm1hbCB1bml4CisjIGluc3RhbGwgKHdoaWNoIGluY2x1ZGVzIHB5dGhvbi1jb25maWcpIGhhcHB5LgogZnJhbWV3b3JraW5zdGFsbG1hY2xpYjoKKwlsbiAtZnMgIi4uLy4uLy4uL1B5dGhvbiIgIiQoREVTVERJUikkKHByZWZpeCkvbGliL3B5dGhvbiQoVkVSU0lPTikvY29uZmlnL2xpYnB5dGhvbiQoVkVSU0lPTikuYSIKIAljZCBNYWMgJiYgJChNQUtFKSBpbnN0YWxsbWFjc3VidHJlZSBERVNURElSPSIkKERFU1RESVIpIgogCiAjIFRoaXMgaW5zdGFsbHMgdGhlIElERSwgdGhlIExhdW5jaGVyIGFuZCBvdGhlciBhcHBzIGludG8gL0FwcGxpY2F0aW9ucwpkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IGUzMGNjNjEuLmUxM2I1OTQgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTI0LDYgKzI0LDcgQEAKIEphc29uIEFzYmFocgogRGF2aWQgQXNjaGVyCiBQZXRlciDFc3RyYW5kCitDaHJpcyBBdExlZQogSm9obiBBeWNvY2sKIERvbm92YW4gQmFhcmRhCiBBdHRpbGEgQmFibwpAQCAtMjAyLDggKzIwMywxMCBAQAogUnVzc2VsbCBGaW5uCiBOaWxzIEZpc2NoYmVjawogRnJlZGVyaWsgRml4CitNYXR0IEZsZW1pbmcKIEhlcm7hbiBNYXJ07W5leiBGb2ZmYW5pCiBEb3VnIEZvcnQKK0pvaG4gRm91aHkKIE1hcnRpbiBGcmFua2xpbgogUm9iaW4gRnJpZWRyaWNoCiBJdmFuIEZyb2huZQpAQCAtNDMyLDYgKzQzNSw3IEBACiBUYWthaGlybyBOYWtheWFtYQogVHJhdmVycyBOYXJhbgogRnJlZHJpayBOZWhyCitUb255IE5lbHNvbgogQ2hhZCBOZXR6ZXIKIE1heCBOZXVuaPZmZmVyCiBHZW9yZ2UgTmV2aWxsZS1OZWlsCkBAIC01MjcsNiArNTMxLDcgQEAKIFNhc2tpYSB2YW4gUm9zc3VtCiBEb25hbGQgV2FsbGFjZSBSb3VzZSBJSQogTGlhbSBSb3V0dAorU2FtIFJ1YnkKIFBhdWwgUnViaW4KIEF1ZHVuIFMuIFJ1bmRlCiBKZWZmIFJ1c2gKQEAgLTYyMCw2ICs2MjUsNyBAQAogSm9obiBUcm9tcAogSmFzb24gVHJvd2JyaWRnZQogQW50aG9ueSBUdWluaW5nYQorQ2hyaXN0b3BoZXIgVHVyIExlc25pZXdza2ktTGFhcwogU3RlcGhlbiBUdXJuZXIKIEJpbGwgVHV0dAogRG9vYmVlIFIuIFR6ZWNrCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRS5jb3Zlcml0eSBiL01pc2MvUkVBRE1FLmNvdmVyaXR5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZTFiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9NaXNjL1JFQURNRS5jb3Zlcml0eQpAQCAtMCwwICsxLDIyIEBACisKK0NvdmVyaXR5IGhhcyBhIHN0YXRpYyBhbmFseXNpcyB0b29sIChQcmV2ZW50KSB3aGljaCBpcyBzaW1pbGFyIHRvIEtsb2N3b3JrLgorVGhleSBydW4gdGhlaXIgdG9vbCBvbiB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIChTVk4gaGVhZCkgb24gYSBkYWlseSBiYXNpcy4KK1RoZSByZXN1bHRzIGFyZSBhdmFpbGFibGUgYXQ6CisKKyAgICAgaHR0cDovL3NjYW4uY292ZXJpdHkuY29tLworCitBYm91dCAyMCBwZW9wbGUgaGF2ZSBhY2Nlc3MgdG8gdGhlIGFuYWx5c2lzIHJlcG9ydHMuICBPdGhlcgorcGVvcGxlIGNhbiBiZSBhZGRlZCBieSByZXF1ZXN0LgorCitQcmV2ZW50IHdhcyBmaXJzdCBydW4gb24gdGhlIFB5dGhvbiAyLjUgc291cmNlIGNvZGUgaW4gTWFyY2ggMjAwNi4KK1RoZXJlIHdlcmUgb3JpZ2luYWxseSBhYm91dCAxMDAgZGVmZWN0cyByZXBvcnRlZC4gIFNvbWUgb2YgdGhlc2UKK3dlcmUgZmFsc2UgcG9zaXRpdmVzLiAgT3ZlciA3MCBpc3N1ZXMgd2VyZSB1bmNvdmVyZWQuCisKK0VhY2ggd2FybmluZyBoYXMgYSB1bmlxdWUgaWQgYW5kIGNvbW1lbnRzIHRoYXQgY2FuIGJlIG1hZGUgb24gaXQuCitXaGVuIGNoZWNraW5nIGluIGNoYW5nZXMgZHVlIHRvIGEgd2FybmluZywgdGhlIHVuaXF1ZSBpZAorYXMgcmVwb3J0ZWQgYnkgdGhlIHRvb2wgd2FzIGFkZGVkIHRvIHRoZSBTVk4gY29tbWl0IG1lc3NhZ2UuCisKK0ZhbHNlIHBvc2l0aXZlcyB3ZXJlIGFubm90YXRlZCBzbyB0aGF0IHRoZSBjb21tZW50cyBjYW4KK2JlIHJldmlld2VkIGFuZCByZXZlcnNlZCBpZiB0aGUgYW5hbHlzaXMgd2FzIGluY29ycmVjdC4KKworQ29udGFjdCBweXRob24tZGV2QHB5dGhvbi5vcmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCmRpZmYgLS1naXQgYS9NaXNjL1JFQURNRS5rbG9jd29yayBiL01pc2MvUkVBRE1FLmtsb2N3b3JrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMjcxNWUKLS0tIC9kZXYvbnVsbAorKysgYi9NaXNjL1JFQURNRS5rbG9jd29yawpAQCAtMCwwICsxLDI2IEBACisKK0tsb2N3b3JrIGhhcyBhIHN0YXRpYyBhbmFseXNpcyB0b29sIChLNykgd2hpY2ggaXMgc2ltaWxhciB0byBDb3Zlcml0eS4KK1RoZXkgd2lsbCBydW4gdGhlaXIgdG9vbCBvbiB0aGUgUHl0aG9uIHNvdXJjZSBjb2RlIG9uIGRlbWFuZC4KK1RoZSByZXN1bHRzIGFyZSBhdmFpbGFibGUgYXQ6CisKKyAgICAgaHR0cHM6Ly9vcGVuc291cmNlLmtsb2N3b3JrLmNvbS8KKworQ3VycmVudGx5LCBvbmx5IE5lYWwgTm9yd2l0eiBoYXMgYWNjZXNzIHRvIHRoZSBhbmFseXNpcyByZXBvcnRzLiAgT3RoZXIKK3Blb3BsZSBjYW4gYmUgYWRkZWQgYnkgcmVxdWVzdC4KKworSzcgd2FzIGZpcnN0IHJ1biBvbiB0aGUgUHl0aG9uIDIuNSBzb3VyY2UgY29kZSBpbiBtaWQtSnVseSAyMDA2LgorVGhpcyBpcyBhZnRlciBDb3Zlcml0eSBoYWQgYmVlbiBtYWtpbmcgdGhlaXIgcmVzdWx0cyBhdmFpbGFibGUuCitUaGVyZSB3ZXJlIG9yaWdpbmFsbHkgMTc1IGRlZmVjdHMgcmVwb3J0ZWQuICBNb3N0IG9mIHRoZXNlCit3ZXJlIGZhbHNlIHBvc2l0aXZlcy4gIEhvd2V2ZXIsIHRoZXJlIHdlcmUgbnVtZXJvdXMgcmVhbCBpc3N1ZXMgCithbHNvIHVuY292ZXJlZC4KKworRWFjaCB3YXJuaW5nIGhhcyBhIHVuaXF1ZSBpZCBhbmQgY29tbWVudHMgdGhhdCBjYW4gYmUgbWFkZSBvbiBpdC4KK1doZW4gY2hlY2tpbmcgaW4gY2hhbmdlcyBkdWUgdG8gYSBLNyByZXBvcnQsIHRoZSB1bmlxdWUgaWQKK2FzIHJlcG9ydGVkIGJ5IHRoZSB0b29sIHdhcyBhZGRlZCB0byB0aGUgU1ZOIGNvbW1pdCBtZXNzYWdlLgorQSBjb21tZW50IHdhcyBhZGRlZCB0byB0aGUgSzcgd2FybmluZyBpbmRpY2F0aW5nIHRoZSBTVk4gcmV2aXNpb24KK2luIGFkZGl0aW9uIHRvIGFueSBhbmFseXNpcy4KKworRmFsc2UgcG9zaXRpdmVzIHdlcmUgYWxzbyBhbm5vdGF0ZWQgc28gdGhhdCB0aGUgY29tbWVudHMgY2FuCitiZSByZXZpZXdlZCBhbmQgcmV2ZXJzZWQgaWYgdGhlIGFuYWx5c2lzIHdhcyBpbmNvcnJlY3QuCisKK0NvbnRhY3QgcHl0aG9uLWRldkBweXRob24ub3JnIGZvciBtb3JlIGluZm9ybWF0aW9uLgpkaWZmIC0tZ2l0IGEvTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjIGIvTWlzYy9SUE0vcHl0aG9uLTIuNS5zcGVjCmluZGV4IGUwNTA0NTQuLmFmYmIwOWUgMTAwNjQ0Ci0tLSBhL01pc2MvUlBNL3B5dGhvbi0yLjUuc3BlYworKysgYi9NaXNjL1JQTS9weXRob24tMi41LnNwZWMKQEAgLTMzLDcgKzMzLDcgQEAKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiAlZGVmaW5lIG5hbWUgcHl0aG9uCi0lZGVmaW5lIHZlcnNpb24gMi41YTIKKyVkZWZpbmUgdmVyc2lvbiAyLjViMwogJWRlZmluZSBsaWJ2ZXJzIDIuNQogJWRlZmluZSByZWxlYXNlIDFweWRvdG9yZwogJWRlZmluZSBfX3ByZWZpeCAvdXNyCmRpZmYgLS1naXQgYS9NaXNjL1ZpbS9weXRob24udmltIGIvTWlzYy9WaW0vcHl0aG9uLnZpbQppbmRleCA5NzExMDc2Li5kODM1NzJhIDEwMDY0NAotLS0gYS9NaXNjL1ZpbS9weXRob24udmltCisrKyBiL01pc2MvVmltL3B5dGhvbi52aW0KQEAgLTg1LDcgKzg1LDcgQEAKICAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIExvb2t1cEVycm9yIE9TRXJyb3IgRGVwcmVjYXRpb25XYXJuaW5nCiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBVbmljb2RlRXJyb3IgVW5pY29kZUVuY29kZUVycm9yCiAgIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBGbG9hdGluZ1BvaW50RXJyb3IgUmVmZXJlbmNlRXJyb3IgTmFtZUVycm9yCi0gIHN5biBrZXl3b3JkIHB5dGhvbkV4Y2VwdGlvbiAgICBPdmVyZmxvd1dhcm5pbmcgSU9FcnJvciBTeW50YXhFcnJvcgorICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgSU9FcnJvciBTeW50YXhFcnJvcgogICBzeW4ga2V5d29yZCBweXRob25FeGNlcHRpb24gICAgRnV0dXJlV2FybmluZyBJbXBvcnRXYXJuaW5nIFN5c3RlbUV4aXQKICAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIEV4Y2VwdGlvbiBFT0ZFcnJvciBTdGFuZGFyZEVycm9yIFZhbHVlRXJyb3IKICAgc3luIGtleXdvcmQgcHl0aG9uRXhjZXB0aW9uICAgIFRhYkVycm9yIEtleUVycm9yIFplcm9EaXZpc2lvbkVycm9yIFN5c3RlbUVycm9yCmRpZmYgLS1naXQgYS9NaXNjL2J1aWxkLnNoIGIvTWlzYy9idWlsZC5zaAppbmRleCBkZTUxNTM5Li5mZjQ2YmJhIDEwMDc1NQotLS0gYS9NaXNjL2J1aWxkLnNoCisrKyBiL01pc2MvYnVpbGQuc2gKQEAgLTU0LDEzICs1NCwxOSBAQAogSU5TVEFMTF9ESVI9Ii90bXAvcHl0aG9uLXRlc3QvbG9jYWwiCiBSU1lOQ19PUFRTPSItYUMgLWUgc3NoIgogCisjIEFsd2F5cyBydW4gdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIFB5dGhvbi4KK1BZVEhPTj0kSU5TVEFMTF9ESVIvYmluL3B5dGhvbgorCisjIFB5dGhvbiBvcHRpb25zIGFuZCByZWdyZXNzaW9uIHRlc3QgcHJvZ3JhbSB0aGF0IHNob3VsZCBhbHdheXMgYmUgcnVuLgorUkVHUlRFU1RfQVJHUz0iLUUgLXR0ICRJTlNUQUxMX0RJUi9saWIvcHl0aG9uMi41L3Rlc3QvcmVncnRlc3QucHkiCisKIFJFRkxPRz0iYnVpbGQvcmVmbG9nLnR4dC5vdXQiCiAjIFRoZXNlIHRlc3RzIGFyZSBub3Qgc3RhYmxlIGFuZCBmYWxzZWx5IHJlcG9ydCBsZWFrcyBzb21ldGltZXMuCiAjIFRoZSBlbnRpcmUgbGVhayByZXBvcnQgd2lsbCBiZSBtYWlsZWQgaWYgYW55IHRlc3Qgbm90IGluIHRoaXMgbGlzdCBsZWFrcy4KICMgTm90ZTogdGVzdF9YWFggKG5vbmUgY3VycmVudGx5KSByZWFsbHkgbGVhaywgYnV0IGFyZSBkaXNhYmxlZAogIyBzbyB3ZSBkb24ndCBzZW5kIHNwYW0uICBBbnkgdGVzdCB3aGljaCByZWFsbHkgbGVha3Mgc2hvdWxkIG9ubHkgCiAjIGJlIGxpc3RlZCBoZXJlIGlmIHRoZXJlIGFyZSBhbHNvIHRlc3QgY2FzZXMgdW5kZXIgTGliL3Rlc3QvbGVha2Vycy4KLUxFQUtZX1RFU1RTPSJ0ZXN0XyhjdHlwZXN8ZmlsZWNtcHxzb2NrZXR8dGhyZWFkZWR0ZW1wZmlsZXx0aHJlYWRpbmd8dXJsbGliMikiCitMRUFLWV9URVNUUz0idGVzdF8oWFhYKSIgICMgQ3VycmVudGx5IG5vIHRlc3RzIHNob3VsZCByZXBvcnQgc3B1cmlvdXMgbGVha3MuCiAKICMgU2tpcCB0aGVzZSB0ZXN0cyBhbHRvZ2V0aGVyIHdoZW4gbG9va2luZyBmb3IgbGVha3MuICBUaGVzZSB0ZXN0cwogIyBkbyBub3QgbmVlZCB0byBiZSBzdG9yZWQgYWJvdmUgaW4gTEVBS1lfVEVTVFMgdG9vLgpAQCAtMTU1LDIxICsxNjEsMzEgQEAKICAgICAgICAgICAgIG1ha2UgaW5zdGFsbCA+JiBidWlsZC8kRgogICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiSW5zdGFsbGluZyIgIiRGIiAkc3RhcnQKIAorICAgICAgICAgICAgaWYgWyAhIC14ICRQWVRIT04gXTsgdGhlbgorICAgICAgICAgICAgICAgIGxuIC1zICR7UFlUSE9OfTIuKiAkUFlUSE9OCisgICAgICAgICAgICBmaQorCiAgICAgICAgICAgICAjIyBtYWtlIGFuZCBydW4gYmFzaWMgdGVzdHMKICAgICAgICAgICAgIEY9bWFrZS10ZXN0Lm91dAogICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKLSAgICAgICAgICAgIG1ha2UgdGVzdCA+JiBidWlsZC8kRgorICAgICAgICAgICAgJFBZVEhPTiAkUkVHUlRFU1RfQVJHUyA+JiBidWlsZC8kRgogICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBncmVwIC1pYyAiIGZhaWxlZDoiIGJ1aWxkLyRGYAogICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyBiYXNpY3MgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAotICAgICAgICAgICAgIyMgRklYTUU6IHNob3VsZCBtYWlsIHNpbmNlIC11YWxsIGJlbG93IHNob3VsZCBmaW5kIHNhbWUgcHJvYmxlbXMKICAgICAgICAgICAgIG1haWxfb25fZmFpbHVyZSAiYmFzaWNzIiBidWlsZC8kRgogCisgICAgICAgICAgICBGPW1ha2UtdGVzdC1vcHQub3V0CisgICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAorICAgICAgICAgICAgJFBZVEhPTiAtTyAkUkVHUlRFU1RfQVJHUyA+JiBidWlsZC8kRgorICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBncmVwIC1pYyAiIGZhaWxlZDoiIGJ1aWxkLyRGYAorICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyBvcHQgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAorICAgICAgICAgICAgbWFpbF9vbl9mYWlsdXJlICJvcHQiIGJ1aWxkLyRGCisKICAgICAgICAgICAgICMjIHJ1biB0aGUgdGVzdHMgbG9va2luZyBmb3IgbGVha3MKICAgICAgICAgICAgIEY9bWFrZS10ZXN0LXJlZmxlYWsub3V0CiAgICAgICAgICAgICBzdGFydD1gY3VycmVudF90aW1lYAogICAgICAgICAgICAgIyMgZW5zdXJlIHRoYXQgdGhlIHJlZmxvZyBleGlzdHMgc28gdGhlIGdyZXAgZG9lc24ndCBmYWlsCiAgICAgICAgICAgICB0b3VjaCAkUkVGTE9HCi0gICAgICAgICAgICAuL3B5dGhvbiAuL0xpYi90ZXN0L3JlZ3J0ZXN0LnB5IC1SIDQ6MzokUkVGTE9HIC11IG5ldHdvcmsgJExFQUtZX1NLSVBTID4mIGJ1aWxkLyRGCisgICAgICAgICAgICAkUFlUSE9OICRSRUdSVEVTVF9BUkdTIC1SIDQ6MzokUkVGTE9HIC11IG5ldHdvcmsgJExFQUtZX1NLSVBTID4mIGJ1aWxkLyRGCiAgICAgICAgICAgICBOVU1fRkFJTFVSRVM9YGVncmVwIC12YyAiJExFQUtZX1RFU1RTIiAkUkVGTE9HYAogICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyByZWZsZWFrcyAoJE5VTV9GQUlMVVJFUyBmYWlsdXJlcykiICIkRiIgJHN0YXJ0CiAgICAgICAgICAgICBtYWlsX29uX2ZhaWx1cmUgInJlZmxlYWsiICRSRUZMT0cKQEAgLTE3OSw3ICsxOTUsNyBAQAogICAgICAgICAgICAgc3RhcnQ9YGN1cnJlbnRfdGltZWAKICAgICAgICAgICAgICMjIHNraXAgY3Vyc2VzIHdoZW4gcnVubmluZyBmcm9tIGNyb24gc2luY2UgdGhlcmUncyBubyB0ZXJtaW5hbAogICAgICAgICAgICAgIyMgc2tpcCBzb3VuZCBzaW5jZSBpdCdzIG5vdCBzZXR1cCBvbiB0aGUgUFNGIGJveCAoL2Rldi9kc3ApCi0gICAgICAgICAgICAuL3B5dGhvbiAtRSAtdHQgLi9MaWIvdGVzdC9yZWdydGVzdC5weSAtdWFsbCAteCB0ZXN0X2N1cnNlcyB0ZXN0X2xpbnV4YXVkaW9kZXYgdGVzdF9vc3NhdWRpb2RldiA+JiBidWlsZC8kRgorICAgICAgICAgICAgJFBZVEhPTiAkUkVHUlRFU1RfQVJHUyAtdWFsbCAteCB0ZXN0X2N1cnNlcyB0ZXN0X2xpbnV4YXVkaW9kZXYgdGVzdF9vc3NhdWRpb2RldiA+JiBidWlsZC8kRgogICAgICAgICAgICAgTlVNX0ZBSUxVUkVTPWBncmVwIC1pYyAiIGZhaWxlZDoiIGJ1aWxkLyRGYAogICAgICAgICAgICAgdXBkYXRlX3N0YXR1cyAiVGVzdGluZyBhbGwgZXhjZXB0IGN1cnNlcyBhbmQgc291bmQgKCROVU1fRkFJTFVSRVMgZmFpbHVyZXMpIiAiJEYiICRzdGFydAogICAgICAgICAgICAgbWFpbF9vbl9mYWlsdXJlICJhbGwiIGJ1aWxkLyRGCkBAIC0xODksNyArMjA1LDcgQEAKIAogCiAjIyBtYWtlIGRvYwotY2QgRG9jCitjZCAkRElSL0RvYwogRj0ibWFrZS1kb2Mub3V0Igogc3RhcnQ9YGN1cnJlbnRfdGltZWAKIG1ha2UgPiYgLi4vYnVpbGQvJEYKZGlmZiAtLWdpdCBhL01pc2MvY2hlYXRzaGVldCBiL01pc2MvY2hlYXRzaGVldAppbmRleCAwMjQ1NDVkLi5iMGUxY2NlIDEwMDY0NAotLS0gYS9NaXNjL2NoZWF0c2hlZXQKKysrIGIvTWlzYy9jaGVhdHNoZWV0CkBAIC0xMTI1LDcgKzExMjUsNiBAQAogICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcKICAgICAgICAgICAgICAgUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZwogICAgICAgICAgICAgICBTeW50YXhXYXJuaW5nCi0gICAgICAgICAgICAgIE92ZXJmbG93V2FybmluZwogICAgICAgICAgICAgICBSdW50aW1lV2FybmluZwogICAgICAgICAgICAgICBGdXR1cmVXYXJuaW5nCiAKZGlmZiAtLWdpdCBhL01pc2MvcHl0aG9uLWNvbmZpZy5pbiBiL01pc2MvcHl0aG9uLWNvbmZpZy5pbgppbmRleCAyNGU2OTllLi5lMDIxNWEyIDEwMDY0NAotLS0gYS9NaXNjL3B5dGhvbi1jb25maWcuaW4KKysrIGIvTWlzYy9weXRob24tY29uZmlnLmluCkBAIC0xLDQgKzEsNCBAQAotIyFAQklORElSQC9weXRob24KKyMhQEVYRU5BTUVACiAKIGltcG9ydCBzeXMKIGltcG9ydCBvcwpAQCAtMzYsMTMgKzM2LDE0IEBACiAgICAgcHJpbnQgc3lzY29uZmlnLkVYRUNfUFJFRklYCiAKIGVsaWYgb3B0IGluICgnLS1pbmNsdWRlcycsICctLWNmbGFncycpOgotICAgIGZsYWdzID0gWyctSScrZGlyIGZvciBkaXIgaW4gZ2V0dmFyKCdJTkNMRElSU1RPTUFLRScpLnNwbGl0KCldCisgICAgZmxhZ3MgPSBbJy1JJyArIHN5c2NvbmZpZy5nZXRfcHl0aG9uX2luYygpLAorICAgICAgICAgICAgICctSScgKyBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz1UcnVlKV0KICAgICBpZiBvcHQgPT0gJy0tY2ZsYWdzJzoKICAgICAgICAgZmxhZ3MuZXh0ZW5kKGdldHZhcignQ0ZMQUdTJykuc3BsaXQoKSkKICAgICBwcmludCAnICcuam9pbihmbGFncykKIAogZWxpZiBvcHQgaW4gKCctLWxpYnMnLCAnLS1sZGZsYWdzJyk6Ci0gICAgbGlicyA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignTElCUycpLnNwbGl0KCkKKyAgICBsaWJzID0gZ2V0dmFyKCdMSUJTJykuc3BsaXQoKSArIGdldHZhcignU1lTTElCUycpLnNwbGl0KCkKICAgICBsaWJzLmFwcGVuZCgnLWxweXRob24nK3B5dmVyKQogICAgIGlmIG9wdCA9PSAnLS1sZGZsYWdzJzoKICAgICAgICAgbGlicy5pbnNlcnQoMCwgJy1MJyArIGdldHZhcignTElCUEwnKSkKZGlmZiAtLWdpdCBhL01pc2MvdmFsZ3JpbmQtcHl0aG9uLnN1cHAgYi9NaXNjL3ZhbGdyaW5kLXB5dGhvbi5zdXBwCmluZGV4IDI2ODhmNzkuLjRhNjcxMGUgMTAwNjQ0Ci0tLSBhL01pc2MvdmFsZ3JpbmQtcHl0aG9uLnN1cHAKKysrIGIvTWlzYy92YWxncmluZC1weXRob24uc3VwcApAQCAtMTM0LDYgKzEzNCwxNSBAQAogIyMjCiAKIHsKKyAgIEdlbmVyaWMgZ2VudG9vIGxkIHByb2JsZW1zCisgICBNZW1jaGVjazpDb25kCisgICBvYmo6L2xpYi9sZC0yLjMuNC5zbworICAgb2JqOi9saWIvbGQtMi4zLjQuc28KKyAgIG9iajovbGliL2xkLTIuMy40LnNvCisgICBvYmo6L2xpYi9sZC0yLjMuNC5zbworfQorCit7CiAgICBEQk0gcHJvYmxlbXMsIHNlZSB0ZXN0X2RibQogICAgTWVtY2hlY2s6UGFyYW0KICAgIHdyaXRlKGJ1ZikKZGlmZiAtLWdpdCBhL01vZHVsZXMvU2V0dXAuZGlzdCBiL01vZHVsZXMvU2V0dXAuZGlzdAppbmRleCAxYjI1MDJkLi40NmY0MjUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL1NldHVwLmRpc3QKKysrIGIvTW9kdWxlcy9TZXR1cC5kaXN0CkBAIC01OSw3ICs1OSw3IEBACiAjCiAjIEluIGFkZGl0aW9uLCAqc3RhdGljKiBleHBsaWNpdGx5IGRlY2xhcmVzIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyB0bwogIyBiZSBzdGF0aWMuICBMaW5lcyBjb250YWluaW5nICIqc3RhdGljKiIgYW5kICIqc2hhcmVkKiIgbWF5IHRodXMKLSMgYWx0ZXJuYXRlIHRob3VnaG91dCB0aGlzIGZpbGUuCisjIGFsdGVybmF0ZSB0aHJvdWdob3V0IHRoaXMgZmlsZS4KIAogIyBOT1RFOiBBcyBhIHN0YW5kYXJkIHBvbGljeSwgYXMgbWFueSBtb2R1bGVzIGFzIGNhbiBiZSBzdXBwb3J0ZWQgYnkgYQogIyBwbGF0Zm9ybSBzaG91bGQgYmUgcHJlc2VudC4gIFRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhbGwgbW9kdWxlcwpAQCAtMjM0LDE2ICsyMzQsMTkgQEAKICNyZ2JpbWcgcmdiaW1nbW9kdWxlLmMJIyBSZWFkIFNHSSBSR0IgaW1hZ2UgZmlsZXMgKGJ1dCBjb2RlZCBwb3J0YWJseSkKIAogCi0jIFRoZSBtZDUgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENQorIyBOb3RlIHRoYXQgdGhlIF9tZDUgYW5kIF9zaGEgbW9kdWxlcyBhcmUgbm9ybWFsbHkgb25seSBidWlsdCBpZiB0aGUKKyMgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlIE9wZW5TU0wgbGlicyBjb250YWluaW5nIGFuIG9wdGltaXplZCB2ZXJzaW9uLgorCisjIFRoZSBfbWQ1IG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBNRDUKICMgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtLCBkZXNjcmliZWQgaW4gUkZDIDEzMjEuICBUaGUgbmVjZXNzYXJ5IGZpbGVzCiAjIG1kNS5jIGFuZCBtZDUuaCBhcmUgaW5jbHVkZWQgaGVyZS4KIAotI21kNSBtZDVtb2R1bGUuYyBtZDUuYworI19tZDUgbWQ1bW9kdWxlLmMgbWQ1LmMKIAogCi0jIFRoZSBzaGEgbW9kdWxlIGltcGxlbWVudHMgdGhlIFNIQSBjaGVja3N1bSBhbGdvcml0aG0uCisjIFRoZSBfc2hhIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBTSEEgY2hlY2tzdW0gYWxnb3JpdGhtLgogIyAoTklTVCdzIFNlY3VyZSBIYXNoIEFsZ29yaXRobS4pCi0jc2hhIHNoYW1vZHVsZS5jCisjX3NoYSBzaGFtb2R1bGUuYwogCiAKICMgU0dJIElSSVggc3BlY2lmaWMgbW9kdWxlcyAtLSBvZmYgYnkgZGVmYXVsdC4KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2JzZGRiLmMgYi9Nb2R1bGVzL19ic2RkYi5jCmluZGV4IDkyMjA4NjYuLjJhM2FjNWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2JzZGRiLmMKKysrIGIvTW9kdWxlcy9fYnNkZGIuYwpAQCAtOTgsMTIgKzk4LDEyIEBACiAjZXJyb3IgImVlayEgREJWRVIgY2FuJ3QgaGFuZGxlIG1pbm9yIHZlcnNpb25zID4gOSIKICNlbmRpZgogCi0jZGVmaW5lIFBZX0JTRERCX1ZFUlNJT04gIjQuNC40IgorI2RlZmluZSBQWV9CU0REQl9WRVJTSU9OICI0LjQuNSIKIHN0YXRpYyBjaGFyICpyY3NfaWQgPSAiJElkJCI7CiAKIAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCi0jZGVmaW5lIFB5X3NzaXplX3QgICAgICBpbnQKK3R5cGVkZWYgaW50IFB5X3NzaXplX3Q7CiAjZW5kaWYKIAogI2lmZGVmIFdJVEhfVEhSRUFECkBAIC01MjgsNiArNTI4LDcgQEAKICAgICBQeU9iamVjdCAqZXJyT2JqID0gTlVMTDsKICAgICBQeU9iamVjdCAqZXJyVHVwbGUgPSBOVUxMOwogICAgIGludCBleGNlcHRpb25SYWlzZWQgPSAwOworICAgIHVuc2lnbmVkIGludCBieXRlc19sZWZ0OwogCiAgICAgc3dpdGNoIChlcnIpIHsKICAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgIC8qIHN1Y2Nlc3NmdWwsIG5vIGVycm9yICovICAgICAgYnJlYWs7CkBAIC01MzUsMTIgKzUzNiwxNSBAQAogI2lmIChEQlZFUiA8IDQxKQogICAgICAgICBjYXNlIERCX0lOQ09NUExFVEU6CiAjaWYgSU5DT01QTEVURV9JU19XQVJOSU5HCi0gICAgICAgICAgICBvdXJfc3RybGNweShlcnJUeHQsIGRiX3N0cmVycm9yKGVyciksIHNpemVvZihlcnJUeHQpKTsKLSAgICAgICAgICAgIGlmIChfZGJfZXJybXNnWzBdKSB7CisgICAgICAgICAgICBieXRlc19sZWZ0ID0gb3VyX3N0cmxjcHkoZXJyVHh0LCBkYl9zdHJlcnJvcihlcnIpLCBzaXplb2YoZXJyVHh0KSk7CisgICAgICAgICAgICAvKiBFbnN1cmUgdGhhdCBieXRlc19sZWZ0IG5ldmVyIGdvZXMgbmVnYXRpdmUgKi8KKyAgICAgICAgICAgIGlmIChfZGJfZXJybXNnWzBdICYmIGJ5dGVzX2xlZnQgPCAoc2l6ZW9mKGVyclR4dCkgLSA0KSkgeworICAgICAgICAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2YoZXJyVHh0KSAtIGJ5dGVzX2xlZnQgLSA0IC0gMTsKKwkJYXNzZXJ0KGJ5dGVzX2xlZnQgPj0gMCk7CiAgICAgICAgICAgICAgICAgc3RyY2F0KGVyclR4dCwgIiAtLSAiKTsKLSAgICAgICAgICAgICAgICBzdHJjYXQoZXJyVHh0LCBfZGJfZXJybXNnKTsKLSAgICAgICAgICAgICAgICBfZGJfZXJybXNnWzBdID0gMDsKKyAgICAgICAgICAgICAgICBzdHJuY2F0KGVyclR4dCwgX2RiX2Vycm1zZywgYnl0ZXNfbGVmdCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBfZGJfZXJybXNnWzBdID0gMDsKICNpZmRlZiBIQVZFX1dBUk5JTkdTCiAgICAgICAgICAgICBleGNlcHRpb25SYWlzZWQgPSBQeUVycl9XYXJuKFB5RXhjX1J1bnRpbWVXYXJuaW5nLCBlcnJUeHQpOwogI2Vsc2UKQEAgLTU4OCwxMiArNTkyLDE1IEBACiAgICAgfQogCiAgICAgaWYgKGVyck9iaiAhPSBOVUxMKSB7Ci0gICAgICAgIG91cl9zdHJsY3B5KGVyclR4dCwgZGJfc3RyZXJyb3IoZXJyKSwgc2l6ZW9mKGVyclR4dCkpOwotICAgICAgICBpZiAoX2RiX2Vycm1zZ1swXSkgeworICAgICAgICBieXRlc19sZWZ0ID0gb3VyX3N0cmxjcHkoZXJyVHh0LCBkYl9zdHJlcnJvcihlcnIpLCBzaXplb2YoZXJyVHh0KSk7CisgICAgICAgIC8qIEVuc3VyZSB0aGF0IGJ5dGVzX2xlZnQgbmV2ZXIgZ29lcyBuZWdhdGl2ZSAqLworICAgICAgICBpZiAoX2RiX2Vycm1zZ1swXSAmJiBieXRlc19sZWZ0IDwgKHNpemVvZihlcnJUeHQpIC0gNCkpIHsKKyAgICAgICAgICAgIGJ5dGVzX2xlZnQgPSBzaXplb2YoZXJyVHh0KSAtIGJ5dGVzX2xlZnQgLSA0IC0gMTsKKyAgICAgICAgICAgIGFzc2VydChieXRlc19sZWZ0ID49IDApOwogICAgICAgICAgICAgc3RyY2F0KGVyclR4dCwgIiAtLSAiKTsKLSAgICAgICAgICAgIHN0cmNhdChlcnJUeHQsIF9kYl9lcnJtc2cpOwotICAgICAgICAgICAgX2RiX2Vycm1zZ1swXSA9IDA7CisgICAgICAgICAgICBzdHJuY2F0KGVyclR4dCwgX2RiX2Vycm1zZywgYnl0ZXNfbGVmdCk7CiAgICAgICAgIH0KKyAgICAgICAgX2RiX2Vycm1zZ1swXSA9IDA7CiAKIAllcnJUdXBsZSA9IFB5X0J1aWxkVmFsdWUoIihpcykiLCBlcnIsIGVyclR4dCk7CiAgICAgICAgIFB5RXJyX1NldE9iamVjdChlcnJPYmosIGVyclR1cGxlKTsKQEAgLTc5OCwxMCArODA1LDEyIEBACiAKICAgICBNWURCX0JFR0lOX0FMTE9XX1RIUkVBRFM7CiAgICAgZXJyID0gZGJfY3JlYXRlKCZzZWxmLT5kYiwgZGJfZW52LCBmbGFncyk7Ci0gICAgc2VsZi0+ZGItPnNldF9lcnJjYWxsKHNlbGYtPmRiLCBfZGJfZXJyb3JDYWxsYmFjayk7CisgICAgaWYgKHNlbGYtPmRiICE9IE5VTEwpIHsKKyAgICAgICAgc2VsZi0+ZGItPnNldF9lcnJjYWxsKHNlbGYtPmRiLCBfZGJfZXJyb3JDYWxsYmFjayk7CiAjaWYgKERCVkVSID49IDMzKQotICAgIHNlbGYtPmRiLT5hcHBfcHJpdmF0ZSA9ICh2b2lkKilzZWxmOworICAgICAgICBzZWxmLT5kYi0+YXBwX3ByaXZhdGUgPSAodm9pZCopc2VsZjsKICNlbmRpZgorICAgIH0KICAgICBNWURCX0VORF9BTExPV19USFJFQURTOwogICAgIC8qIFRPRE8gYWRkIGEgd2Vha3JlZihzZWxmKSB0byB0aGUgc2VsZi0+bXllbnZvYmotPm9wZW5fY2hpbGRfd2Vha3JlZnMKICAgICAgKiBsaXN0IHNvIHRoYXQgYSBEQkVudiBjYW4gcmVmdXNlIHRvIGNsb3NlIHdpdGhvdXQgYWJvcnRpbmcgYW55IG9wZW4KQEAgLTI2ODEsMTIgKzI2OTAsMTMgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIC8qIE1hcHBpbmcgYW5kIERpY3Rpb25hcnktbGlrZSBhY2Nlc3Mgcm91dGluZXMgKi8KIAotUHlfc3NpemVfdCBEQl9sZW5ndGgoREJPYmplY3QqIHNlbGYpCitQeV9zc2l6ZV90IERCX2xlbmd0aChQeU9iamVjdCogX3NlbGYpCiB7CiAgICAgaW50IGVycjsKICAgICBQeV9zc2l6ZV90IHNpemUgPSAwOwogICAgIGludCBmbGFncyA9IDA7CiAgICAgdm9pZCogc3A7CisgICAgREJPYmplY3QqIHNlbGYgPSAoREJPYmplY3QqKV9zZWxmOwogCiAgICAgaWYgKHNlbGYtPmRiID09IE5VTEwpIHsKICAgICAgICAgUHlPYmplY3QgKnQgPSBQeV9CdWlsZFZhbHVlKCIoaXMpIiwgMCwgIkRCIG9iamVjdCBoYXMgYmVlbiBjbG9zZWQiKTsKQEAgLTI3MjAsNiArMjczMCw4IEBACiAgICAgICovCiAgICAgaWYgKHNpemUgPT0gMCAmJiAoZmxhZ3MgJiBEQl9GQVNUX1NUQVQpKSB7CiAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCFlcnIpCisgICAgICAgICAgICBmcmVlKHNwKTsKICAgICAgICAgZ290byByZWRvX3N0YXRfZm9yX2xlbmd0aDsKICAgICB9CiAKQEAgLTM4NjQsNyArMzg3Niw3IEBACiAgICAgc3RhdGljIGNoYXIqIGt3bmFtZXNbXSA9IHsgImZpbGUiLCAiZGF0YWJhc2UiLCAidHhuIiwgImZsYWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIH07CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzc3xPaTpkYnJlbW92ZSIsIGt3bmFtZXMsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3x6T2k6ZGJyZW1vdmUiLCBrd25hbWVzLAogCQkmZmlsZSwgJmRhdGFiYXNlLCAmdHhub2JqLCAmZmxhZ3MpKSB7CiAJcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMzg5Miw3ICszOTA0LDcgQEAKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAiZmlsZSIsICJkYXRhYmFzZSIsICJuZXduYW1lIiwgInR4biIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzIiwgTlVMTCB9OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAic3NzfE9pOmRicmVuYW1lIiwga3duYW1lcywKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2FyZ3MsICJzenN8T2k6ZGJyZW5hbWUiLCBrd25hbWVzLAogCQkmZmlsZSwgJmRhdGFiYXNlLCAmbmV3bmFtZSwgJnR4bm9iaiwgJmZsYWdzKSkgewogCXJldHVybiBOVUxMOwogICAgIH0KQEAgLTUxNTMsMTEgKzUxNjUsNyBAQAogCiAKIHN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIERCX21hcHBpbmcgPSB7Ci0jaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKLSAgICAgICAgKGlucXVpcnkpREJfbGVuZ3RoLCAgICAgICAgICAvKm1wX2xlbmd0aCovCi0jZWxzZQotICAgICAgICAobGVuZnVuYylEQl9sZW5ndGgsICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KLSNlbmRpZgorICAgICAgICBEQl9sZW5ndGgsICAgICAgICAgICAgICAgICAgIC8qbXBfbGVuZ3RoKi8KICAgICAgICAgKGJpbmFyeWZ1bmMpREJfc3Vic2NyaXB0LCAgICAvKm1wX3N1YnNjcmlwdCovCiAgICAgICAgIChvYmpvYmphcmdwcm9jKURCX2Fzc19zdWIsICAgLyptcF9hc3Nfc3Vic2NyaXB0Ki8KIH07CkBAIC01NTYwLDE1ICs1NTY4LDEzIEBACiBzdGF0aWMgUHlPYmplY3QqCiBEQlNlcXVlbmNlX2NvbnN0cnVjdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpCiB7Ci0gICAgUHlPYmplY3QqIGRib2JqID0gTlVMTDsKKyAgICBQeU9iamVjdCogZGJvYmo7CiAgICAgaW50IGZsYWdzID0gMDsKICAgICBzdGF0aWMgY2hhcioga3duYW1lc1tdID0geyAiZGIiLCAiZmxhZ3MiLCBOVUxMfTsKIAogICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgIk98aTpEQlNlcXVlbmNlIiwga3duYW1lcywgJmRib2JqLCAmZmxhZ3MpKQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoZGJvYmogPT0gUHlfTm9uZSkKLSAgICAgICAgZGJvYmogPSBOVUxMOwotICAgIGVsc2UgaWYgKGRib2JqICYmICFEQk9iamVjdF9DaGVjayhkYm9iaikpIHsKKyAgICBpZiAoIURCT2JqZWN0X0NoZWNrKGRib2JqKSkgewogICAgICAgICBtYWtlVHlwZUVycm9yKCJEQiIsIGRib2JqKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY29kZWNzbW9kdWxlLmMgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwppbmRleCAzMmZhODJmLi40MDVmZDdhIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYworKysgYi9Nb2R1bGVzL19jb2RlY3Ntb2R1bGUuYwpAQCAtNDc5LDE1ICs0NzksMjAgQEAKIAkgICAgUHlPYmplY3QgKmFyZ3MpCiB7CiAgICAgY29uc3QgY2hhciAqZGF0YTsKLSAgICBQeV9zc2l6ZV90IHNpemU7CisgICAgUHlfc3NpemVfdCBzaXplLCBjb25zdW1lZDsKICAgICBjb25zdCBjaGFyICplcnJvcnMgPSBOVUxMOworICAgIGludCBmaW5hbCA9IDA7CisgICAgUHlPYmplY3QgKmRlY29kZWQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjfHo6bWJjc19kZWNvZGUiLAotCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAidCN8emk6bWJjc19kZWNvZGUiLAorCQkJICAmZGF0YSwgJnNpemUsICZlcnJvcnMsICZmaW5hbCkpCiAJcmV0dXJuIE5VTEw7CiAKLSAgICByZXR1cm4gY29kZWNfdHVwbGUoUHlVbmljb2RlX0RlY29kZU1CQ1MoZGF0YSwgc2l6ZSwgZXJyb3JzKSwKLQkJICAgICAgIHNpemUpOworICAgIGRlY29kZWQgPSBQeVVuaWNvZGVfRGVjb2RlTUJDU1N0YXRlZnVsKAorCWRhdGEsIHNpemUsIGVycm9ycywgZmluYWwgPyBOVUxMIDogJmNvbnN1bWVkKTsKKyAgICBpZiAoIWRlY29kZWQpCisJcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIGNvZGVjX3R1cGxlKGRlY29kZWQsIGZpbmFsID8gc2l6ZSA6IGNvbnN1bWVkKTsKIH0KIAogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlcy5jCmluZGV4IGEwNzQ0ZmYuLjc2ZDg4ZGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXMuYwpAQCAtMSwzICsxLDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKIC8qCiAgIFRvRG86CiAKQEAgLTM0Miw2ICszNDcsMTQgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDRGF0YVR5cGVfcmVwZWF0KFB5T2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGxlbmd0aCkKIHsKKwlpZiAobGVuZ3RoIDwgMCkKKwkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCisJCQkJICAgICJBcnJheSBsZW5ndGggbXVzdCBiZSA+PSAwLCBub3QgJWQiLAorI2Vsc2UKKwkJCQkgICAgIkFycmF5IGxlbmd0aCBtdXN0IGJlID49IDAsIG5vdCAlemQiLAorI2VuZGlmCisJCQkJICAgIGxlbmd0aCk7CiAJcmV0dXJuIENyZWF0ZUFycmF5VHlwZShzZWxmLCBsZW5ndGgpOwogfQogCkBAIC0xMzcxLDEzICsxMzg0LDIwIEBACiAJCVB5X0RFQ1JFRihyZXN1bHQpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisJZm10ID0gZ2V0ZW50cnkoUHlTdHJpbmdfQVNfU1RSSU5HKHByb3RvKSk7CisJaWYgKGZtdCA9PSBOVUxMKSB7CisJCVB5X0RFQ1JFRihyZXN1bHQpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKKwkJCSAgICAgIl90eXBlXyAnJXMnIG5vdCBzdXBwb3J0ZWQiLAorCQkJICAgICBQeVN0cmluZ19BU19TVFJJTkcocHJvdG8pKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJc3RnZGljdCA9IChTdGdEaWN0T2JqZWN0ICopUHlPYmplY3RfQ2FsbE9iamVjdCgKIAkJKFB5T2JqZWN0ICopJlN0Z0RpY3RfVHlwZSwgTlVMTCk7CiAJaWYgKCFzdGdkaWN0KQogCQlyZXR1cm4gTlVMTDsKIAotCWZtdCA9IGdldGVudHJ5KFB5U3RyaW5nX0FTX1NUUklORyhwcm90bykpOwotCiAJc3RnZGljdC0+ZmZpX3R5cGVfcG9pbnRlciA9ICpmbXQtPnBmZmlfdHlwZTsKIAlzdGdkaWN0LT5hbGlnbiA9IGZtdC0+cGZmaV90eXBlLT5hbGlnbm1lbnQ7CiAJc3RnZGljdC0+bGVuZ3RoID0gMDsKQEAgLTE2MjAsOSArMTY0MCw4IEBACiAKIAlmb3IgKGkgPSAwOyBpIDwgbkFyZ3M7ICsraSkgewogCQlQeU9iamVjdCAqdHAgPSBQeVR1cGxlX0dFVF9JVEVNKG9iLCBpKTsKLQkJU3RnRGljdE9iamVjdCAqZGljdCA9IFB5VHlwZV9zdGdkaWN0KHRwKTsKIAkJUHlPYmplY3QgKmNudiA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcodHAsICJmcm9tX3BhcmFtIik7Ci0JCWlmICghZGljdCB8fCAhY252KQorCQlpZiAoIWNudikKIAkJCWdvdG8gYXJndHlwZXNfZXJyb3JfMTsKIAkJUHlUdXBsZV9TRVRfSVRFTShjb252ZXJ0ZXJzLCBpLCBjbnYpOwogCX0KQEAgLTE2MzMsNyArMTY1Miw3IEBACiAJUHlfWERFQ1JFRihjb252ZXJ0ZXJzKTsKIAlQeV9ERUNSRUYob2IpOwogCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0JCSAgICAgIml0ZW0gJWQgaW4gX2FyZ3R5cGVzXyBpcyBub3QgYSB2YWxpZCBDIHR5cGUiLCBpKzEpOworCQkgICAgICJpdGVtICVkIGluIF9hcmd0eXBlc18gaGFzIG5vIGZyb21fcGFyYW0gbWV0aG9kIiwgaSsxKTsKIAlyZXR1cm4gTlVMTDsKIH0KIApAQCAtMTgwOSwyMyArMTgyOCw1MyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotdW5pcXVlX2tleShDRGF0YU9iamVjdCAqdGFyZ2V0LCBpbnQgaW5kZXgpCit1bmlxdWVfa2V5KENEYXRhT2JqZWN0ICp0YXJnZXQsIFB5X3NzaXplX3QgaW5kZXgpCiB7Ci0JY2hhciBzdHJpbmdbMjU2XTsgLyogWFhYIGlzIHRoYXQgZW5vdWdoPyAqLworCWNoYXIgc3RyaW5nWzI1Nl07CiAJY2hhciAqY3AgPSBzdHJpbmc7Ci0JKmNwKysgPSBpbmRleCArICcwJzsKKwlzaXplX3QgYnl0ZXNfbGVmdDsKKworCWFzc2VydChzaXplb2Yoc3RyaW5nKSAtIDEgPiBzaXplb2YoUHlfc3NpemVfdCkgKiAyKTsKKyNpZiAoUFlfVkVSU0lPTl9IRVggPCAweDAyMDUwMDAwKQorCWNwICs9IHNwcmludGYoY3AsICIleCIsIGluZGV4KTsKKyNlbHNlCisJY3AgKz0gc3ByaW50ZihjcCwgIiV4IiwgUHlfU0FGRV9ET1dOQ0FTVChpbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CisjZW5kaWYKIAl3aGlsZSAodGFyZ2V0LT5iX2Jhc2UpIHsKLQkJKmNwKysgPSB0YXJnZXQtPmJfaW5kZXggKyAnMCc7CisJCWJ5dGVzX2xlZnQgPSBzaXplb2Yoc3RyaW5nKSAtIChjcCAtIHN0cmluZykgLSAxOworCQkvKiBIZXggZm9ybWF0IG5lZWRzIDIgY2hhcmFjdGVycyBwZXIgYnl0ZSAqLworCQlpZiAoYnl0ZXNfbGVmdCA8IHNpemVvZihQeV9zc2l6ZV90KSAqIDIpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLAorCQkJCQkiY3R5cGVzIG9iamVjdCBzdHJ1Y3R1cmUgdG9vIGRlZXAiKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKKwkJY3AgKz0gc3ByaW50ZihjcCwgIjoleCIsIChpbnQpdGFyZ2V0LT5iX2luZGV4KTsKKyNlbHNlCisJCWNwICs9IHNwcmludGYoY3AsICI6JXgiLCBQeV9TQUZFX0RPV05DQVNUKHRhcmdldC0+Yl9pbmRleCwgUHlfc3NpemVfdCwgaW50KSk7CisjZW5kaWYKIAkJdGFyZ2V0ID0gdGFyZ2V0LT5iX2Jhc2U7CiAJfQogCXJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHJpbmcsIGNwLXN0cmluZyk7CiB9Ci0vKiBLZWVwIGEgcmVmZXJlbmNlIHRvICdrZWVwJyBpbiB0aGUgJ3RhcmdldCcsIGF0IGluZGV4ICdpbmRleCcgKi8KKwogLyoKLSAqIEtlZXBSZWYgdHJhdmVscyB0aGUgdGFyZ2V0J3MgYl9iYXNlIHBvaW50ZXIgZG93biB0byB0aGUgcm9vdCwKLSAqIGJ1aWxkaW5nIGEgc2VxdWVuY2Ugb2YgaW5kZXhlcyBkdXJpbmcgdGhlIHBhdGguICBUaGUgaW5kZXhlcywgd2hpY2ggYXJlIGEKLSAqIGNvdXBsZSBvZiBzbWFsbCBpbnRlZ2VycywgYXJlIHVzZWQgdG8gYnVpbGQgYSBieXRlIHN0cmluZyB1c2FibGUgYXMKLSAqIGtleSBpbnQgdGhlIHJvb3Qgb2JqZWN0J3MgX29iamVjdHMgZGljdC4KKyAqIEtlZXAgYSByZWZlcmVuY2UgdG8gJ2tlZXAnIGluIHRoZSAndGFyZ2V0JywgYXQgaW5kZXggJ2luZGV4Jy4KKyAqCisgKiBJZiAna2VlcCcgaXMgTm9uZSwgZG8gbm90aGluZy4KKyAqCisgKiBPdGhlcndpc2UgY3JlYXRlIGEgZGljdGlvbmFyeSAoaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0KSBpZCB0aGUgcm9vdAorICogb2JqZWN0cyAnYl9vYmplY3RzJyBpdGVtLCB3aGljaCB3aWxsIHN0b3JlIHRoZSAna2VlcCcgb2JqZWN0IHVuZGVyIGEgdW5pcXVlCisgKiBrZXkuCisgKgorICogVGhlIHVuaXF1ZV9rZXkgaGVscGVyIHRyYXZlbHMgdGhlIHRhcmdldCdzIGJfYmFzZSBwb2ludGVyIGRvd24gdG8gdGhlIHJvb3QsCisgKiBidWlsZGluZyBhIHN0cmluZyBjb250YWluaW5nIGhleC1mb3JtYXR0ZWQgaW5kZXhlcyBmb3VuZCBkdXJpbmcgdHJhdmVyc2FsLAorICogc2VwYXJhdGVkIGJ5IGNvbG9ucy4KKyAqCisgKiBUaGUgaW5kZXggdHVwbGUgaXMgdXNlZCBhcyBhIGtleSBpbnRvIHRoZSByb290IG9iamVjdCdzIGJfb2JqZWN0cyBkaWN0LgorICoKKyAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gc3RlYWxzIGEgcmVmY291bnQgb2YgdGhlIHRoaXJkIGFyZ3VtZW50LCBldmVuIGlmIGl0CisgKiBmYWlscyEKICAqLwogc3RhdGljIGludAogS2VlcFJlZihDRGF0YU9iamVjdCAqdGFyZ2V0LCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCAqa2VlcCkKQEAgLTE4NDYsNiArMTg5NSwxMCBAQAogCQlyZXR1cm4gMDsKIAl9CiAJa2V5ID0gdW5pcXVlX2tleSh0YXJnZXQsIGluZGV4KTsKKwlpZiAoa2V5ID09IE5VTEwpIHsKKwkJUHlfREVDUkVGKGtlZXApOworCQlyZXR1cm4gLTE7CisJfQogCXJlc3VsdCA9IFB5RGljdF9TZXRJdGVtKG9iLT5iX29iamVjdHMsIGtleSwga2VlcCk7CiAJUHlfREVDUkVGKGtleSk7CiAJUHlfREVDUkVGKGtlZXApOwpAQCAtMjEzNCw3ICsyMTg3LDcgQEAKIAkJCVB5X0RFQ1JFRihvYik7CiAJCQlyZXR1cm4gcmVzdWx0OwogCQl9IGVsc2UgaWYgKHZhbHVlID09IFB5X05vbmUgJiYgUG9pbnRlclR5cGVPYmplY3RfQ2hlY2sodHlwZSkpIHsKLQkJCSoodm9pZCAqKilkc3QtPmJfcHRyID0gTlVMTDsKKwkJCSoodm9pZCAqKilwdHIgPSBOVUxMOwogCQkJUHlfSU5DUkVGKFB5X05vbmUpOwogCQkJcmV0dXJuIFB5X05vbmU7CiAJCX0gZWxzZSB7CkBAIC0yNjExLDExICsyNjY0LDExIEBACiAKIAkqKHZvaWQgKiopc2VsZi0+Yl9wdHIgPSBhZGRyZXNzOwogCisJUHlfSU5DUkVGKChQeU9iamVjdCAqKWRsbCk7IC8qIGZvciBLZWVwUmVmICovCiAJaWYgKC0xID09IEtlZXBSZWYoKENEYXRhT2JqZWN0ICopc2VsZiwgMCwgZGxsKSkgewogCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlQeV9JTkNSRUYoKFB5T2JqZWN0ICopZGxsKTsgLyogZm9yIEtlZXBSZWYgYWJvdmUgKi8KIAogCVB5X0lOQ1JFRihzZWxmKTsKIAlzZWxmLT5jYWxsYWJsZSA9IChQeU9iamVjdCAqKXNlbGY7CkBAIC0yNzUxLDExICsyODA0LDExIEBACiAJICAgY29ycmVjdGx5Li4uCiAJKi8KIAorCVB5X0lOQ1JFRigoUHlPYmplY3QgKilzZWxmKTsgLyogZm9yIEtlZXBSZWYgKi8KIAlpZiAoLTEgPT0gS2VlcFJlZigoQ0RhdGFPYmplY3QgKilzZWxmLCAwLCAoUHlPYmplY3QgKilzZWxmKSkgewogCQlQeV9ERUNSRUYoKFB5T2JqZWN0ICopc2VsZik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlQeV9JTkNSRUYoKFB5T2JqZWN0ICopc2VsZik7IC8qIGZvciBLZWVwUmVmIGFib3ZlICovCiAKIAlyZXR1cm4gKFB5T2JqZWN0ICopc2VsZjsKIH0KQEAgLTM1MjAsNiArMzU3Myw3IEBACiAJaW50IG9mZnNldCwgc2l6ZTsKIAlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OwogCisKIAlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNlbGYtPmJfbGVuZ3RoKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAogCQkJCSJpbnZhbGlkIGluZGV4Iik7CkBAIC00MDE5LDcgKzQwNzMsOCBAQAogUG9pbnRlcl9pdGVtKFB5T2JqZWN0ICpfc2VsZiwgUHlfc3NpemVfdCBpbmRleCkKIHsKIAlDRGF0YU9iamVjdCAqc2VsZiA9IChDRGF0YU9iamVjdCAqKV9zZWxmOwotCWludCBzaXplLCBvZmZzZXQ7CisJaW50IHNpemU7CisJUHlfc3NpemVfdCBvZmZzZXQ7CiAJU3RnRGljdE9iamVjdCAqc3RnZGljdCwgKml0ZW1kaWN0OwogCVB5T2JqZWN0ICpwcm90bzsKIApAQCAtNDAyOSw5ICs0MDg0LDkgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCi0KIAlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKIAlhc3NlcnQoc3RnZGljdCk7CisJYXNzZXJ0KHN0Z2RpY3QtPnByb3RvKTsKIAkKIAlwcm90byA9IHN0Z2RpY3QtPnByb3RvOwogCS8qIFhYWFhYWCBNQUtFIFNVUkUgUFJPVE8gSVMgTk9UIE5VTEwhICovCkBAIC00MDM5LDcgKzQwOTQsNyBAQAogCXNpemUgPSBpdGVtZGljdC0+c2l6ZTsKIAlvZmZzZXQgPSBpbmRleCAqIGl0ZW1kaWN0LT5zaXplOwogCi0JcmV0dXJuIENEYXRhX2dldChzdGdkaWN0LT5wcm90bywgc3RnZGljdC0+Z2V0ZnVuYywgKFB5T2JqZWN0ICopc2VsZiwKKwlyZXR1cm4gQ0RhdGFfZ2V0KHByb3RvLCBzdGdkaWN0LT5nZXRmdW5jLCAoUHlPYmplY3QgKilzZWxmLAogCQkJIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CiB9CiAKQEAgLTQwNDgsNyArNDEwMyw5IEBACiB7CiAJQ0RhdGFPYmplY3QgKnNlbGYgPSAoQ0RhdGFPYmplY3QgKilfc2VsZjsKIAlpbnQgc2l6ZTsKLQlTdGdEaWN0T2JqZWN0ICpzdGdkaWN0OworCVB5X3NzaXplX3Qgb2Zmc2V0OworCVN0Z0RpY3RPYmplY3QgKnN0Z2RpY3QsICppdGVtZGljdDsKKwlQeU9iamVjdCAqcHJvdG87CiAKIAlpZiAodmFsdWUgPT0gTlVMTCkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLApAQCAtNDA2MywxNiArNDEyMCwxNyBAQAogCX0KIAkKIAlzdGdkaWN0ID0gUHlPYmplY3Rfc3RnZGljdCgoUHlPYmplY3QgKilzZWxmKTsKLQlpZiAoaW5kZXggIT0gMCkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwKLQkJCQkiaW52YWxpZCBpbmRleCIpOwotCQlyZXR1cm4gLTE7Ci0JfQotCXNpemUgPSBzdGdkaWN0LT5zaXplIC8gc3RnZGljdC0+bGVuZ3RoOworCWFzc2VydChzdGdkaWN0KTsKKwlhc3NlcnQoc3RnZGljdC0+cHJvdG8pOwogCi0JLyogWFhYWFggTWFrZSBzdXJlIHByb3RvIGlzIE5PVCBOVUxMISAqLwotCXJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgc3RnZGljdC0+cHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAotCQkJIGluZGV4LCBzaXplLCAqKHZvaWQgKiopc2VsZi0+Yl9wdHIpOworCXByb3RvID0gc3RnZGljdC0+cHJvdG87CisJLyogWFhYWFhYIE1BS0UgU1VSRSBQUk9UTyBJUyBOT1QgTlVMTCEgKi8KKwlpdGVtZGljdCA9IFB5VHlwZV9zdGdkaWN0KHByb3RvKTsKKwlzaXplID0gaXRlbWRpY3QtPnNpemU7CisJb2Zmc2V0ID0gaW5kZXggKiBpdGVtZGljdC0+c2l6ZTsKKworCXJldHVybiBDRGF0YV9zZXQoKFB5T2JqZWN0ICopc2VsZiwgcHJvdG8sIHN0Z2RpY3QtPnNldGZ1bmMsIHZhbHVlLAorCQkJIGluZGV4LCBzaXplLCAoKihjaGFyICoqKXNlbGYtPmJfcHRyKSArIG9mZnNldCk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC00MDg5LDggKzQxNDcsOCBAQAogCXN0Z2RpY3QgPSBQeU9iamVjdF9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYpOwogCWFzc2VydChzdGdkaWN0KTsKIAlyZXR1cm4gQ0RhdGFfRnJvbUJhc2VPYmooc3RnZGljdC0+cHJvdG8sCi0JCQkJICAgKFB5T2JqZWN0ICopc2VsZiwgMCwKLQkJCQkgICAqKHZvaWQgKiopc2VsZi0+Yl9wdHIpOworCQkJCSAoUHlPYmplY3QgKilzZWxmLCAwLAorCQkJCSAqKHZvaWQgKiopc2VsZi0+Yl9wdHIpOwogfQogCiBzdGF0aWMgaW50CkBAIC00NDM3LDcgKzQ0OTUsNyBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgotY2FzdCh2b2lkICpwdHIsIFB5T2JqZWN0ICpjdHlwZSkKK2Nhc3Qodm9pZCAqcHRyLCBQeU9iamVjdCAqc3JjLCBQeU9iamVjdCAqY3R5cGUpCiB7CiAJQ0RhdGFPYmplY3QgKnJlc3VsdDsKIAlpZiAoMCA9PSBjYXN0X2NoZWNrX3BvaW50ZXJ0eXBlKGN0eXBlKSkKQEAgLTQ0NDUsOSArNDUwMyw0NiBAQAogCXJlc3VsdCA9IChDRGF0YU9iamVjdCAqKVB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoY3R5cGUsIE5VTEwpOwogCWlmIChyZXN1bHQgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAgVGhlIGNhc3RlZCBvYmplY3RzICdfb2JqZWN0cycgbWVtYmVyOgorCisJICBJdCBtdXN0IGNlcnRhaW5seSBjb250YWluIHRoZSBzb3VyY2Ugb2JqZWN0cyBvbmUuCisJICBJdCBtdXN0IGNvbnRhaW4gdGhlIHNvdXJjZSBvYmplY3QgaXRzZWxmLgorCSAqLworCWlmIChDRGF0YU9iamVjdF9DaGVjayhzcmMpKSB7CisJCUNEYXRhT2JqZWN0ICpvYmogPSAoQ0RhdGFPYmplY3QgKilzcmM7CisJCS8qIENEYXRhX0dldENvbnRhaW5lciB3aWxsIGluaXRpYWxpemUgc3JjLmJfb2JqZWN0cywgd2UgbmVlZAorCQkgICB0aGlzIHNvIGl0IGNhbiBiZSBzaGFyZWQgKi8KKwkJQ0RhdGFfR2V0Q29udGFpbmVyKG9iaik7CisJCS8qIEJ1dCB3ZSBuZWVkIGEgZGljdGlvbmFyeSEgKi8KKwkJaWYgKG9iai0+Yl9vYmplY3RzID09IFB5X05vbmUpIHsKKwkJCVB5X0RFQ1JFRihQeV9Ob25lKTsKKwkJCW9iai0+Yl9vYmplY3RzID0gUHlEaWN0X05ldygpOworCQkJaWYgKG9iai0+Yl9vYmplY3RzID09IE5VTEwpCisJCQkJZ290byBmYWlsZWQ7CisJCX0KKwkJcmVzdWx0LT5iX29iamVjdHMgPSBvYmotPmJfb2JqZWN0czsKKwkJaWYgKHJlc3VsdC0+Yl9vYmplY3RzKSB7CisJCQlQeU9iamVjdCAqaW5kZXg7CisJCQlpbnQgcmM7CisJCQlQeV9JTkNSRUYob2JqLT5iX29iamVjdHMpOworCQkJaW5kZXggPSBQeUxvbmdfRnJvbVZvaWRQdHIoKHZvaWQgKilzcmMpOworCQkJaWYgKGluZGV4ID09IE5VTEwpCisJCQkJZ290byBmYWlsZWQ7CisJCQlyYyA9IFB5RGljdF9TZXRJdGVtKHJlc3VsdC0+Yl9vYmplY3RzLCBpbmRleCwgc3JjKTsKKwkJCVB5X0RFQ1JFRihpbmRleCk7CisJCQlpZiAocmMgPT0gLTEpCisJCQkJZ290byBmYWlsZWQ7CisJCX0KKwl9CiAJLyogU2hvdWxkIHdlIGFzc2VydCB0aGF0IHJlc3VsdCBpcyBhIHBvaW50ZXIgdHlwZT8gKi8KIAltZW1jcHkocmVzdWx0LT5iX3B0ciwgJnB0ciwgc2l6ZW9mKHZvaWQgKikpOwogCXJldHVybiAoUHlPYmplY3QgKilyZXN1bHQ7CisKKyAgZmFpbGVkOgorCVB5X0RFQ1JFRihyZXN1bHQpOworCXJldHVybiBOVUxMOwogfQogCiAjaWZkZWYgQ1RZUEVTX1VOSUNPREUKQEAgLTQ0NjksNyArNDU2NCw5IEBACiAgICBvYl90eXBlIGlzIHRoZSBtZXRhdHlwZSAodGhlICd0eXBlJyksIGRlZmF1bHRzIHRvIFB5VHlwZV9UeXBlLAogICAgdHBfYmFzZSBpcyB0aGUgYmFzZSB0eXBlLCBkZWZhdWx0cyB0byAnb2JqZWN0JyBha2EgUHlCYXNlT2JqZWN0X1R5cGUuCiAqLworI2lmZGVmIFdJVEhfVEhSRUFECiAJUHlFdmFsX0luaXRUaHJlYWRzKCk7CisjZW5kaWYKIAltID0gUHlfSW5pdE1vZHVsZTMoIl9jdHlwZXMiLCBtb2R1bGVfbWV0aG9kcywgbW9kdWxlX2RvY3MpOwogCWlmICghbSkKIAkJcmV0dXJuOwpAQCAtNDU3OSw3ICs0Njc2LDcgQEAKICNlbmRpZgogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfQ0RFQ0wiLCBQeUludF9Gcm9tTG9uZyhGVU5DRkxBR19DREVDTCkpOwogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiRlVOQ0ZMQUdfUFlUSE9OQVBJIiwgUHlJbnRfRnJvbUxvbmcoRlVOQ0ZMQUdfUFlUSE9OQVBJKSk7Ci0JUHlNb2R1bGVfQWRkU3RyaW5nQ29uc3RhbnQobSwgIl9fdmVyc2lvbl9fIiwgIjAuOS45LjYiKTsKKwlQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudChtLCAiX192ZXJzaW9uX18iLCAiMS4wLjAiKTsKIAogCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiX21lbW1vdmVfYWRkciIsIFB5TG9uZ19Gcm9tVm9pZFB0cihtZW1tb3ZlKSk7CiAJUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJfbWVtc2V0X2FkZHIiLCBQeUxvbmdfRnJvbVZvaWRQdHIobWVtc2V0KSk7CkBAIC00NjE3LDEzICs0NzE0LDE0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogcmVwbGFjZW1lbnRzIGZvciBicm9rZW4gUHl0aG9uIGFwaSBmdW5jdGlvbnMKKyAqIHJlcGxhY2VtZW50cyBmb3IgYnJva2VuIFB5dGhvbiBhcGkgZnVuY3Rpb25zIChpbiBQeXRob24gMi4zKS4KKyAqIFNlZSAjMTA0NzI2OSBCdWZmZXIgb3ZlcndyaXRlIGluIFB5VW5pY29kZV9Bc1dpZGVDaGFyCiAgKi8KIAogI2lmZGVmIEhBVkVfV0NIQVJfSAogCiBQeU9iamVjdCAqTXlfUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihyZWdpc3RlciBjb25zdCB3Y2hhcl90ICp3LAotCQkJCSAgICBpbnQgc2l6ZSkKKwkJCQkgICAgUHlfc3NpemVfdCBzaXplKQogewogICAgIFB5VW5pY29kZU9iamVjdCAqdW5pY29kZTsKIApAQCAtNDY1NSw3ICs0NzUzLDcgQEAKIAogaW50IE15X1B5VW5pY29kZV9Bc1dpZGVDaGFyKFB5VW5pY29kZU9iamVjdCAqdW5pY29kZSwKIAkJCSAgICByZWdpc3RlciB3Y2hhcl90ICp3LAotCQkJICAgIGludCBzaXplKQorCQkJICAgIFB5X3NzaXplX3Qgc2l6ZSkKIHsKICAgICBpZiAodW5pY29kZSA9PSBOVUxMKSB7CiAJUHlFcnJfQmFkSW50ZXJuYWxDYWxsKCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMgYi9Nb2R1bGVzL19jdHlwZXMvX2N0eXBlc190ZXN0LmMKaW5kZXggYjEwZDZmZS4uOTljYzdhOSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL19jdHlwZXNfdGVzdC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9fY3R5cGVzX3Rlc3QuYwpAQCAtMSwzICsxLDggQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKICNpbmNsdWRlIDxQeXRob24uaD4KIAogLyoKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxsYmFja3MuYwppbmRleCA0YmFmM2FhLi5jMDkxZDg4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY2FsbGJhY2tzLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2NhbGxiYWNrcy5jCkBAIC0xLDMgKzEsNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKICNpbmNsdWRlICJQeXRob24uaCIKICNpbmNsdWRlICJjb21waWxlLmgiIC8qIHJlcXVpcmVkIG9ubHkgZm9yIDIuMywgYXMgaXQgc2VlbXMgKi8KICNpbmNsdWRlICJmcmFtZW9iamVjdC5oIgpAQCAtMTIzLDcgKzEyNyw5IEBACiAJUHlPYmplY3QgKnJlc3VsdDsKIAlQeU9iamVjdCAqYXJnbGlzdCA9IE5VTEw7CiAJaW50IG5BcmdzOworI2lmZGVmIFdJVEhfVEhSRUFECiAJUHlHSUxTdGF0ZV9TVEFURSBzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisjZW5kaWYKIAogCW5BcmdzID0gUHlTZXF1ZW5jZV9MZW5ndGgoY29udmVydGVycyk7CiAJLyogSG0uIFdoYXQgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZXJyb3I/CkBAIC0yMzEsOCArMjM3LDkgQEAKIAlQeV9YREVDUkVGKHJlc3VsdCk7CiAgIERvbmU6CiAJUHlfWERFQ1JFRihhcmdsaXN0KTsKLQkKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CisjZW5kaWYKIH0KIAogc3RhdGljIHZvaWQgY2xvc3VyZV9mY24oZmZpX2NpZiAqY2lmLApAQCAtMzQxLDcgKzM0OCw5IEBACiBzdGF0aWMgdm9pZCBMb2FkUHl0aG9uKHZvaWQpCiB7CiAJaWYgKCFQeV9Jc0luaXRpYWxpemVkKCkpIHsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCQlQeUV2YWxfSW5pdFRocmVhZHMoKTsKKyNlbmRpZgogCQlQeV9Jbml0aWFsaXplKCk7CiAJfQogfQpAQCAtMzkzLDEyICs0MDIsMTggQEAKIAkJCSBMUFZPSUQgKnBwdikKIHsKIAlsb25nIHJlc3VsdDsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfU1RBVEUgc3RhdGU7CisjZW5kaWYKIAogCUxvYWRQeXRob24oKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCXN0YXRlID0gUHlHSUxTdGF0ZV9FbnN1cmUoKTsKKyNlbmRpZgogCXJlc3VsdCA9IENhbGxfR2V0Q2xhc3NPYmplY3QocmNsc2lkLCByaWlkLCBwcHYpOworI2lmZGVmIFdJVEhfVEhSRUFECiAJUHlHSUxTdGF0ZV9SZWxlYXNlKHN0YXRlKTsKKyNlbmRpZgogCXJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTQ1MCw5ICs0NjUsMTMgQEAKIFNUREFQSSBEbGxDYW5VbmxvYWROb3codm9pZCkKIHsKIAlsb25nIHJlc3VsdDsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfU1RBVEUgc3RhdGUgPSBQeUdJTFN0YXRlX0Vuc3VyZSgpOworI2VuZGlmCiAJcmVzdWx0ID0gQ2FsbF9DYW5VbmxvYWROb3coKTsKKyNpZmRlZiBXSVRIX1RIUkVBRAogCVB5R0lMU3RhdGVfUmVsZWFzZShzdGF0ZSk7CisjZW5kaWYKIAlyZXR1cm4gcmVzdWx0OwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2FsbHByb2MuYyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCmluZGV4IDgxMDg0OTguLmQ2Zjg3NWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jYWxscHJvYy5jCkBAIC0xLDMgKzEsOCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgIFRoaXMgZmlsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgc2VlIFBFUCAyOTEuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKwogLyoKICAqIEhpc3Rvcnk6IEZpcnN0IHZlcnNpb24gZGF0ZWQgZnJvbSAzLzk3LCBkZXJpdmVkIGZyb20gbXkgU0NNTElCIHZlcnNpb24KICAqIGZvciB3aW4xNi4KQEAgLTYxMiw3ICs2MTcsOSBAQAogCQkJCSAgdm9pZCAqcmVzbWVtLAogCQkJCSAgaW50IGFyZ2NvdW50KQogeworI2lmZGVmIFdJVEhfVEhSRUFECiAJUHlUaHJlYWRTdGF0ZSAqX3NhdmUgPSBOVUxMOyAvKiBGb3IgUHlfQkxPQ0tfVEhSRUFEUyBhbmQgUHlfVU5CTE9DS19USFJFQURTICovCisjZW5kaWYKIAlmZmlfY2lmIGNpZjsKIAlpbnQgY2M7CiAjaWZkZWYgTVNfV0lOMzIKQEAgLTY0NCw4ICs2NTEsMTAgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAorI2lmZGVmIFdJVEhfVEhSRUFECiAJaWYgKChmbGFncyAmIEZVTkNGTEFHX1BZVEhPTkFQSSkgPT0gMCkKIAkJUHlfVU5CTE9DS19USFJFQURTCisjZW5kaWYKICNpZmRlZiBNU19XSU4zMgogI2lmbmRlZiBET05UX1VTRV9TRUgKIAlfX3RyeSB7CkBAIC02NjIsOCArNjcxLDEwIEBACiAJfQogI2VuZGlmCiAjZW5kaWYKKyNpZmRlZiBXSVRIX1RIUkVBRAogCWlmICgoZmxhZ3MgJiBGVU5DRkxBR19QWVRIT05BUEkpID09IDApCiAJCVB5X0JMT0NLX1RIUkVBRFMKKyNlbmRpZgogI2lmZGVmIE1TX1dJTjMyCiAjaWZuZGVmIERPTlRfVVNFX1NFSAogCWlmIChkd0V4Y2VwdGlvbkNvZGUpIHsKQEAgLTgwNCwxNCArODE1LDIyIEBACiAJUHlPYmplY3QgKm9iajsKIAlUQ0hBUiAqdGV4dDsKIAorCS8qIFdlIGFic29sdXRlbHkgaGF2ZSB0byByZWxlYXNlIHRoZSBHSUwgZHVyaW5nIENPTSBtZXRob2QgY2FsbHMsCisJICAgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYSBkZWFkbG9jayEKKwkqLworI2lmZGVmIFdJVEhfVEhSRUFECisJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworI2VuZGlmCisKIAlociA9IHBJdW5rLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHBJdW5rLCAmSUlEX0lTdXBwb3J0RXJyb3JJbmZvLCAodm9pZCAqKikmcHNlaSk7CiAJaWYgKEZBSUxFRChocikpCiAJCWdvdG8gZmFpbGVkOworCiAJaHIgPSBwc2VpLT5scFZ0YmwtPkludGVyZmFjZVN1cHBvcnRzRXJyb3JJbmZvKHBzZWksIHJpaWQpOwogCXBzZWktPmxwVnRibC0+UmVsZWFzZShwc2VpKTsKLQogCWlmIChGQUlMRUQoaHIpKQogCQlnb3RvIGZhaWxlZDsKKwogCWhyID0gR2V0RXJyb3JJbmZvKDAsICZwZWkpOwogCWlmIChociAhPSBTX09LKQogCQlnb3RvIGZhaWxlZDsKQEAgLTgyMiwyNCArODQxLDI3IEBACiAJcGVpLT5scFZ0YmwtPkdldEhlbHBGaWxlKHBlaSwgJmhlbHBmaWxlKTsKIAlwZWktPmxwVnRibC0+R2V0U291cmNlKHBlaSwgJnNvdXJjZSk7CiAKKwlwZWktPmxwVnRibC0+UmVsZWFzZShwZWkpOworCiAgIGZhaWxlZDoKLQlpZiAocGVpKQotCQlwZWktPmxwVnRibC0+UmVsZWFzZShwZWkpOworI2lmZGVmIFdJVEhfVEhSRUFECisJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKyNlbmRpZgogCiAJcHJvZ2lkID0gTlVMTDsKIAlQcm9nSURGcm9tQ0xTSUQoJmd1aWQsICZwcm9naWQpOwogCi0vKiBYWFggSXMgQ09NRXJyb3IgZGVyaXZlZCBmcm9tIFdpbmRvd3NFcnJvciBvciBub3Q/ICovCiAJdGV4dCA9IEZvcm1hdEVycm9yKGVycmNvZGUpOworCW9iaiA9IFB5X0J1aWxkVmFsdWUoCiAjaWZkZWYgX1VOSUNPREUKLQlvYmogPSBQeV9CdWlsZFZhbHVlKCJpdSh1dXVpdSkiLAorCQkiaXUodXV1aXUpIiwKICNlbHNlCi0Jb2JqID0gUHlfQnVpbGRWYWx1ZSgiaXModXV1aXUpIiwKKwkJImlzKHV1dWl1KSIsCiAjZW5kaWYKLQkJCSAgICBlcnJjb2RlLAotCQkJICAgIHRleHQsCi0JCQkgICAgZGVzY3IsIHNvdXJjZSwgaGVscGZpbGUsIGhlbHBjb250ZXh0LAotCQkJICAgIHByb2dpZCk7CisJCWVycmNvZGUsCisJCXRleHQsCisJCWRlc2NyLCBzb3VyY2UsIGhlbHBmaWxlLCBoZWxwY29udGV4dCwKKwkJcHJvZ2lkKTsKIAlpZiAob2JqKSB7CiAJCVB5RXJyX1NldE9iamVjdChDb21FcnJvciwgb2JqKTsKIAkJUHlfREVDUkVGKG9iaik7CkBAIC0xMTM4LDcgKzExNjAsNyBAQAogfQogCiBzdGF0aWMgY2hhciBjb3B5X2NvbV9wb2ludGVyX2RvY1tdID0KLSJDb3B5Q29tUG9pbnRlcihhLCBiKSAtPiBpbnRlZ2VyXG4iOworIkNvcHlDb21Qb2ludGVyKHNyYywgZHN0KSAtPiBIUkVTVUxUIHZhbHVlXG4iOwogCiBzdGF0aWMgUHlPYmplY3QgKgogY29weV9jb21fcG9pbnRlcihQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC0xNDQ0LDcgKzE0NjYsNzIgQEAKIH0KICNlbmRpZgogCitzdGF0aWMgUHlPYmplY3QgKgorcmVzaXplKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlDRGF0YU9iamVjdCAqb2JqOworCVN0Z0RpY3RPYmplY3QgKmRpY3Q7CisJUHlfc3NpemVfdCBzaXplOworCisJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsCisjaWYgKFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMCkKKwkJCSAgICAgICJPaTpyZXNpemUiLAorI2Vsc2UKKwkJCSAgICAgICJPbjpyZXNpemUiLAorI2VuZGlmCisJCQkgICAgICAoUHlPYmplY3QgKikmb2JqLCAmc2l6ZSkpCisJCXJldHVybiBOVUxMOworCisJZGljdCA9IFB5T2JqZWN0X3N0Z2RpY3QoKFB5T2JqZWN0ICopb2JqKTsKKwlpZiAoZGljdCA9PSBOVUxMKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisJCQkJImV4Y2VwdGVkIGN0eXBlcyBpbnN0YW5jZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHNpemUgPCBkaWN0LT5zaXplKSB7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMjA1MDAwMAorCQkJICAgICAibWluaW11bSBzaXplIGlzICVkIiwKKyNlbHNlCisJCQkgICAgICJtaW5pbXVtIHNpemUgaXMgJXpkIiwKKyNlbmRpZgorCQkJICAgICBkaWN0LT5zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChvYmotPmJfbmVlZHNmcmVlID09IDApIHsKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkgICAgICJNZW1vcnkgY2Fubm90IGJlIHJlc2l6ZWQgYmVjYXVzZSB0aGlzIG9iamVjdCBkb2Vzbid0IG93biBpdCIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJaWYgKHNpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKwkJLyogaW50ZXJuYWwgZGVmYXVsdCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoICovCisJCW9iai0+Yl9zaXplID0gc2l6ZTsKKwkJZ290byBkb25lOworCX0KKwlpZiAob2JqLT5iX3NpemUgPD0gc2l6ZW9mKG9iai0+Yl92YWx1ZSkpIHsKKwkJLyogV2UgYXJlIGN1cnJlbnRseSB1c2luZyB0aGUgb2JqZWN0cyBkZWZhdWx0IGJ1ZmZlciwgYnV0IGl0CisJCSAgIGlzbid0IGxhcmdlIGVub3VnaCBhbnkgbW9yZS4gKi8KKwkJdm9pZCAqcHRyID0gUHlNZW1fTWFsbG9jKHNpemUpOworCQlpZiAocHRyID09IE5VTEwpCisJCQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKwkJbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CisJCW1lbW1vdmUocHRyLCBvYmotPmJfcHRyLCBvYmotPmJfc2l6ZSk7CisJCW9iai0+Yl9wdHIgPSBwdHI7CisJCW9iai0+Yl9zaXplID0gc2l6ZTsKKwl9IGVsc2UgeworCQl2b2lkICogcHRyID0gUHlNZW1fUmVhbGxvYyhvYmotPmJfcHRyLCBzaXplKTsKKwkJaWYgKHB0ciA9PSBOVUxMKQorCQkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisJCW9iai0+Yl9wdHIgPSBwdHI7CisJCW9iai0+Yl9zaXplID0gc2l6ZTsKKwl9CisgIGRvbmU6CisJUHlfSU5DUkVGKFB5X05vbmUpOworCXJldHVybiBQeV9Ob25lOworfQorCiBQeU1ldGhvZERlZiBtb2R1bGVfbWV0aG9kc1tdID0geworCXsicmVzaXplIiwgcmVzaXplLCBNRVRIX1ZBUkFSR1MsICJSZXNpemUgdGhlIG1lbW9yeSBidWZmZXIgb2YgYSBjdHlwZXMgaW5zdGFuY2UifSwKICNpZmRlZiBDVFlQRVNfVU5JQ09ERQogCXsic2V0X2NvbnZlcnNpb25fbW9kZSIsIHNldF9jb252ZXJzaW9uX21vZGUsIE1FVEhfVkFSQVJHUywgc2V0X2NvbnZlcnNpb25fbW9kZV9kb2N9LAogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMgYi9Nb2R1bGVzL19jdHlwZXMvY2ZpZWxkLmMKaW5kZXggYWUwMjkwZi4uMzU5NWIwNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2NmaWVsZC5jCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jZmllbGQuYwpAQCAtMSwzICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAKICNpbmNsdWRlIDxmZmkuaD4KQEAgLTYxLDEwICs2NSwxMCBAQAogCX0KIAlpZiAoYml0c2l6ZSAvKiB0aGlzIGlzIGEgYml0ZmllbGQgcmVxdWVzdCAqLwogCSAgICAmJiAqcGZpZWxkX3NpemUgLyogd2UgaGF2ZSBhIGJpdGZpZWxkIG9wZW4gKi8KLSNpZmRlZiBNU19XSU4zMgorI2lmIGRlZmluZWQoTVNfV0lOMzIpICYmICFkZWZpbmVkKF9fTUlOR1czMl9fKQogCSAgICAmJiBkaWN0LT5zaXplICogOCA9PSAqcGZpZWxkX3NpemUgLyogTVNWQyAqLwogI2Vsc2UKLQkgICAgJiYgZGljdC0+c2l6ZSAqIDggPD0gKnBmaWVsZF9zaXplIC8qIEdDQyAqLworCSAgICAmJiBkaWN0LT5zaXplICogOCA8PSAqcGZpZWxkX3NpemUgLyogR0NDLCBNSU5HVyAqLwogI2VuZGlmCiAJICAgICYmICgqcGJpdG9mcyArIGJpdHNpemUpIDw9ICpwZmllbGRfc2l6ZSkgewogCQkvKiBjb250aW51ZSBiaXQgZmllbGQgKi8KQEAgLTEyMCw3ICsxMjQsNyBAQAogCXNlbGYtPmdldGZ1bmMgPSBnZXRmdW5jOwogCXNlbGYtPmluZGV4ID0gaW5kZXg7CiAKLQlQeV9YSU5DUkVGKHByb3RvKTsKKwlQeV9JTkNSRUYocHJvdG8pOwogCXNlbGYtPnByb3RvID0gcHJvdG87CiAKIAlzd2l0Y2ggKGZpZWxkdHlwZSkgewpAQCAtMTQ4MiwxNiArMTQ4NiwyNyBAQAogCQkqKHZvaWQgKiopcHRyID0gTlVMTDsKIAkJX1JFVCh2YWx1ZSk7CiAJfQotCQotCXYgPSBQeUxvbmdfQXNWb2lkUHRyKHZhbHVlKTsKLQlpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotCQkvKiBwcmV2ZW50IHRoZSBTeXN0ZW1FcnJvcjogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uICovCi0JCWlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiY2Fubm90IGJlIGNvbnZlcnRlZCB0byBwb2ludGVyIik7Ci0JCX0KKworCWlmICghUHlJbnRfQ2hlY2sodmFsdWUpICYmICFQeUxvbmdfQ2hlY2sodmFsdWUpKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCisJCQkJImNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gcG9pbnRlciIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CisKKyNpZiBTSVpFT0ZfVk9JRF9QIDw9IFNJWkVPRl9MT05HCisJdiA9ICh2b2lkICopUHlJbnRfQXNVbnNpZ25lZExvbmdNYXNrKHZhbHVlKTsKKyNlbHNlCisjaWZuZGVmIEhBVkVfTE9OR19MT05HCisjICAgZXJyb3IgIlB5TG9uZ19Bc1ZvaWRQdHI6IHNpemVvZih2b2lkKikgPiBzaXplb2YobG9uZyksIGJ1dCBubyBsb25nIGxvbmciCisjZWxpZiBTSVpFT0ZfTE9OR19MT05HIDwgU0laRU9GX1ZPSURfUAorIyAgIGVycm9yICJQeUxvbmdfQXNWb2lkUHRyOiBzaXplb2YoUFlfTE9OR19MT05HKSA8IHNpemVvZih2b2lkKikiCisjZW5kaWYKKwl2ID0gKHZvaWQgKilQeUludF9Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrKHZhbHVlKTsKKyNlbmRpZgorCisJaWYgKFB5RXJyX09jY3VycmVkKCkpCisJCXJldHVybiBOVUxMOworCiAJKih2b2lkICoqKXB0ciA9IHY7CiAJX1JFVCh2YWx1ZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmggYi9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzLmgKaW5kZXggNzk4ODU5NS4uMzAzZWRhMyAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2N0eXBlcy5oCisrKyBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXMuaApAQCAtMSw0ICsxLDYgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgVGhpcyBmaWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBzZWUgUEVQIDI5MS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogI2lmIChQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDApCiB0eXBlZGVmIGludCBQeV9zc2l6ZV90OwpAQCAtNTksNyArNjEsNyBAQAogCVB5X3NzaXplX3QgYl9sZW5ndGg7CS8qIG51bWJlciBvZiByZWZlcmVuY2VzIHdlIG5lZWQgKi8KIAlQeV9zc2l6ZV90IGJfaW5kZXg7CS8qIGluZGV4IG9mIHRoaXMgb2JqZWN0IGludG8gYmFzZSdzCiAJCQkJICAgYl9vYmplY3QgbGlzdCAqLwotCVB5T2JqZWN0ICpiX29iamVjdHM7CS8qIGxpc3Qgb2YgcmVmZXJlbmNlcyB3ZSBuZWVkIHRvIGtlZXAgKi8KKwlQeU9iamVjdCAqYl9vYmplY3RzOwkvKiBkaWN0aW9uYXJ5IG9mIHJlZmVyZW5jZXMgd2UgbmVlZCB0byBrZWVwLCBvciBQeV9Ob25lICovCiAJdW5pb24gdmFsdWUgYl92YWx1ZTsKIH07CiAKQEAgLTE4MSw2ICsxODMsNyBAQAogCVB5T2JqZWN0ICpwcm90bzsJCS8qIGEgdHlwZSBvciBOVUxMICovCiAJR0VURlVOQyBnZXRmdW5jOwkJLyogZ2V0dGVyIGZ1bmN0aW9uIGlmIHByb3RvIGlzIE5VTEwgKi8KIAlTRVRGVU5DIHNldGZ1bmM7CQkvKiBzZXR0ZXIgZnVuY3Rpb24gaWYgcHJvdG8gaXMgTlVMTCAqLworCWludCBhbm9ueW1vdXM7CiB9IENGaWVsZE9iamVjdDsKIAogLyogQSBzdWJjbGFzcyBvZiBQeURpY3RPYmplY3QsIHVzZWQgYXMgdGhlIGluc3RhbmNlIGRpY3Rpb25hcnkgb2YgY3R5cGVzCkBAIC0zNzQsOCArMzc3LDggQEAKICMgIHVuZGVmIFB5VW5pY29kZV9Bc1dpZGVDaGFyCiAjICBkZWZpbmUgUHlVbmljb2RlX0FzV2lkZUNoYXIgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIKIAotZXh0ZXJuIFB5T2JqZWN0ICpNeV9QeVVuaWNvZGVfRnJvbVdpZGVDaGFyKGNvbnN0IHdjaGFyX3QgKiwgaW50KTsKLWV4dGVybiBpbnQgTXlfUHlVbmljb2RlX0FzV2lkZUNoYXIoUHlVbmljb2RlT2JqZWN0ICosIHdjaGFyX3QgKiwgaW50KTsKK2V4dGVybiBQeU9iamVjdCAqTXlfUHlVbmljb2RlX0Zyb21XaWRlQ2hhcihjb25zdCB3Y2hhcl90ICosIFB5X3NzaXplX3QpOworZXh0ZXJuIGludCBNeV9QeVVuaWNvZGVfQXNXaWRlQ2hhcihQeVVuaWNvZGVPYmplY3QgKiwgd2NoYXJfdCAqLCBQeV9zc2l6ZV90KTsKIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9jdHlwZXNfZGxmY24uaCBiL01vZHVsZXMvX2N0eXBlcy9jdHlwZXNfZGxmY24uaAppbmRleCA3ZjYzMmM1Li5kOGJmOTA0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvY3R5cGVzX2RsZmNuLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2N0eXBlc19kbGZjbi5oCkBAIC0xLDQgKzEsNiBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZuZGVmIF9DVFlQRVNfRExGQ05fSF8KICNkZWZpbmUgX0NUWVBFU19ETEZDTl9IXwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQppbmRleCA5ZmRkNjU0Li45ZWRlZDVhIDEwMDc1NQotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZQpAQCAtOTM0LDcgKzkzNCw3IEBACiAgICAgZWxzZQogICAgICAgZWNobyAiJGFzX21lOiBXQVJOSU5HOiBubyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGluICRhY19kaXIiID4mMgogICAgIGZpCi0gICAgY2QgJGFjX3BvcGRpcgorICAgIGNkICIkYWNfcG9wZGlyIgogICBkb25lCiBmaQogCkBAIC0xOTczLDggKzE5NzMsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMDMyLDggKzIwMzEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMTQ5LDggKzIxNDcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMjA0LDggKzIyMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMjUwLDggKzIyNDYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yMjk1LDggKzIyOTAsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yNjIzLDggKzI2MTcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yNzk0LDggKzI3ODcsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0yODYyLDggKzI4NTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0zMDQ3LDggKzMwMzgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0zMTExLDggKzMxMDEsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0zMjkwLDggKzMyNzksNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0zNDA4LDggKzMzOTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC0zNDgzLDYgKzM0NzAsMTIgQEAKIAogVEFSR0VURElSPSJ1bmtub3duIgogY2FzZSAiJGhvc3QiIGluCittaXBzKi0qLW9wZW5ic2QqKSBUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHM7Oworc3BhcmMtKi1vcGVuYnNkKikgVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmM7Oworc3BhcmM2NC0qLW9wZW5ic2QqKSBUQVJHRVQ9U1BBUkM7IFRBUkdFVERJUj1zcGFyYzs7CithbHBoYSotKi1vcGVuYnNkKikgVEFSR0VUPUFMUEhBOyBUQVJHRVRESVI9YWxwaGE7OworbTY4ay0qLW9wZW5ic2QqKSBUQVJHRVQ9TTY4SzsgVEFSR0VURElSPW02OGs7OworcG93ZXJwYy0qLW9wZW5ic2QqKSBUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGM7OwogaSo4Ni0qLWRhcndpbiopIFRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1saW51eCopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWdudSopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwpAQCAtMzU3NSw4ICszNTY4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzc3Nyw4ICszNzY5LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzg0MSw4ICszODMyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtMzkyMyw4ICszOTEzLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDA2NSw4ICs0MDU0LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDIwMiw4ICs0MTkwLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDI2NSw4ICs0MjUyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDMwNiw4ICs0MjkyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDM2Myw4ICs0MzQ4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDQwNCw4ICs0Mzg4LDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDQ2OSw4ICs0NDUyLDcgQEAKICAgY2F0IGNvbmZ0ZXN0LmVyciA+JjUKICAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQogICAoZXhpdCAkYWNfc3RhdHVzKTsgfSAmJgotCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCi0JCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJwogICB7IChldmFsIGVjaG8gIiRhc19tZTokTElORU5POiBcIiRhY190cnlcIiIpID4mNQogICAoZXZhbCAkYWNfdHJ5KSAyPiY1CiAgIGFjX3N0YXR1cz0kPwpAQCAtNDUwMSwxMCArNDQ4Myw4IEBACiBlc2FjCiBlbHNlCiAgIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCi0gIHsgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogZXJyb3I6IGNhbm5vdCBydW4gdGVzdCBwcm9ncmFtIHdoaWxlIGNyb3NzIGNvbXBpbGluZwotU2VlIFxgY29uZmlnLmxvZycgZm9yIG1vcmUgZGV0YWlscy4iID4mNQotZWNobyAiJGFzX21lOiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiYyO30KKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mNQorZWNobyAiJGFzX21lOiBlcnJvcjogaW50ZXJuYWwgZXJyb3I6IG5vdCByZWFjaGVkIGluIGNyb3NzLWNvbXBpbGUiID4mMjt9CiAgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KIGVsc2UKICAgY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC00NjE2LDggKzQ1OTYsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00Njc5LDggKzQ2NTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00NzIwLDggKzQ2OTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00Nzc3LDggKzQ3NTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00ODE4LDggKzQ3OTQsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00ODgzLDggKzQ4NTgsNyBAQAogICBjYXQgY29uZnRlc3QuZXJyID4mNQogICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CiAgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCi0JIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIKLQkJCSB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworCSB7IGFjX3RyeT0ndGVzdCAteiAiJGFjX2Nfd2Vycm9yX2ZsYWciCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCiAgIHsgKGV2YWwgZWNobyAiJGFzX21lOiRMSU5FTk86IFwiJGFjX3RyeVwiIikgPiY1CiAgIChldmFsICRhY190cnkpIDI+JjUKICAgYWNfc3RhdHVzPSQ/CkBAIC00OTE1LDEwICs0ODg5LDggQEAKIGVzYWMKIGVsc2UKICAgaWYgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXM7IHRoZW4KLSAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IHJ1biB0ZXN0IHByb2dyYW0gd2hpbGUgY3Jvc3MgY29tcGlsaW5nCi1TZWUgXGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLiIgPiY1Ci1lY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgcnVuIHRlc3QgcHJvZ3JhbSB3aGlsZSBjcm9zcyBjb21waWxpbmcKLVNlZSBcYGNvbmZpZy5sb2cnIGZvciBtb3JlIGRldGFpbHMuIiA+JjI7fQorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBpbnRlcm5hbCBlcnJvcjogbm90IHJlYWNoZWQgaW4gY3Jvc3MtY29tcGlsZSIgPiYyO30KICAgIHsgKGV4aXQgMSk7IGV4aXQgMTsgfTsgfQogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTUwNDgsOCArNTAyMCw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUwOTEsOCArNTA2Miw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUxNDksOCArNTExOSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUyODIsOCArNTI1MSw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTUzNDksOCArNTMxNyw3IEBACiAgIGNhdCBjb25mdGVzdC5lcnIgPiY1CiAgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKICAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKLQkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIgotCQkJIHx8IHRlc3QgISAtcyBjb25mdGVzdC5lcnInCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIJCQkgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKICAgeyAoZXZhbCBlY2hvICIkYXNfbWU6JExJTkVOTzogXCIkYWNfdHJ5XCIiKSA+JjUKICAgKGV2YWwgJGFjX3RyeSkgMj4mNQogICBhY19zdGF0dXM9JD8KQEAgLTYzMDksMTEgKzYyNzYsNiBAQAogCiAKIAotICBpZiB0ZXN0IHgiJGFjX2ZpbGUiICE9IHgtOyB0aGVuCi0gICAgeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNQotZWNobyAiJGFzX21lOiBjcmVhdGluZyAkYWNfZmlsZSIgPiY2O30KLSAgICBybSAtZiAiJGFjX2ZpbGUiCi0gIGZpCiAgICMgTGV0J3Mgc3RpbGwgcHJldGVuZCBpdCBpcyBgY29uZmlndXJlJyB3aGljaCBpbnN0YW50aWF0ZXMgKGkuZS4sIGRvbid0CiAgICMgdXNlICRhc19tZSksIHBlb3BsZSB3b3VsZCBiZSBzdXJwcmlzZWQgdG8gcmVhZDoKICAgIyAgICAvKiBjb25maWcuaC4gIEdlbmVyYXRlZCBieSBjb25maWcuc3RhdHVzLiAgKi8KQEAgLTYzNTIsNiArNjMxNCwxMiBAQAogCSBmaTs7CiAgICAgICBlc2FjCiAgICAgZG9uZWAgfHwgeyAoZXhpdCAxKTsgZXhpdCAxOyB9CisKKyAgaWYgdGVzdCB4IiRhY19maWxlIiAhPSB4LTsgdGhlbgorICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNyZWF0aW5nICRhY19maWxlIiA+JjUKK2VjaG8gIiRhc19tZTogY3JlYXRpbmcgJGFjX2ZpbGUiID4mNjt9CisgICAgcm0gLWYgIiRhY19maWxlIgorICBmaQogX0FDRU9GCiBjYXQgPj4kQ09ORklHX1NUQVRVUyA8PF9BQ0VPRgogICBzZWQgIiRhY192cHN1YgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9jb25maWd1cmUuYWMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYwppbmRleCBhMGQ3NTEzLi4zODQ5NTllIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL2NvbmZpZ3VyZS5hYwpAQCAtMjEsNiArMjEsMTIgQEAKIAogVEFSR0VURElSPSJ1bmtub3duIgogY2FzZSAiJGhvc3QiIGluCittaXBzKi0qLW9wZW5ic2QqKSBUQVJHRVQ9TUlQUzsgVEFSR0VURElSPW1pcHM7Oworc3BhcmMtKi1vcGVuYnNkKikgVEFSR0VUPVNQQVJDOyBUQVJHRVRESVI9c3BhcmM7Oworc3BhcmM2NC0qLW9wZW5ic2QqKSBUQVJHRVQ9U1BBUkM7IFRBUkdFVERJUj1zcGFyYzs7CithbHBoYSotKi1vcGVuYnNkKikgVEFSR0VUPUFMUEhBOyBUQVJHRVRESVI9YWxwaGE7OworbTY4ay0qLW9wZW5ic2QqKSBUQVJHRVQ9TTY4SzsgVEFSR0VURElSPW02OGs7OworcG93ZXJwYy0qLW9wZW5ic2QqKSBUQVJHRVQ9UE9XRVJQQzsgVEFSR0VURElSPXBvd2VycGM7OwogaSo4Ni0qLWRhcndpbiopIFRBUkdFVD1YODZfREFSV0lOOyBUQVJHRVRESVI9eDg2OzsKIGkqODYtKi1saW51eCopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwogaSo4Ni0qLWdudSopIFRBUkdFVD1YODY7IFRBUkdFVERJUj14ODY7OwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2Rhcndpbi5TIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2Rhcndpbi5TCmluZGV4IGM1ZTU1YjUuLmQ5MWJkYzAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9kYXJ3aW4uUworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZGFyd2luLlMKQEAgLTM1LDYgKzM1LDEzIEBACiAjaW5jbHVkZSA8ZmZpY29uZmlnLmg+CiAjaW5jbHVkZSA8ZmZpLmg+CiAKKyNpZmRlZiBQeU9iakNfU1RSSUNUX0RFQlVHR0lORworICAvKiBYWFg6IERlYnVnZ2luZyBvZiBzdGFjayBhbGlnbm1lbnQsIHRvIGJlIHJlbW92ZWQgKi8KKyNkZWZpbmUgQVNTRVJUX1NUQUNLX0FMSUdORUQgbW92ZHFhIC0xNiglZXNwKSwgJXhtbTAKKyNlbHNlCisjZGVmaW5lIEFTU0VSVF9TVEFDS19BTElHTkVEIAorI2VuZGlmCisKIC50ZXh0CiAKIC5nbG9ibCBfZmZpX3ByZXBfYXJncwpAQCAtNDcsMzAgKzU0LDQxIEBACiAgICAgICAgIHB1c2hsICVlYnAKIC5MQ0ZJMDoKICAgICAgICAgbW92bCAgJWVzcCwlZWJwCisJc3VibCAgJDgsJWVzcAorCUFTU0VSVF9TVEFDS19BTElHTkVECiAuTENGSTE6CiAJLyogTWFrZSByb29tIGZvciBhbGwgb2YgdGhlIG5ldyBhcmdzLiAgKi8KIAltb3ZsICAxNiglZWJwKSwlZWN4CiAJc3VibCAgJWVjeCwlZXNwCiAKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAorCiAJbW92bCAgJWVzcCwlZWF4CiAKIAkvKiBQbGFjZSBhbGwgb2YgdGhlIGZmaV9wcmVwX2FyZ3MgaW4gcG9zaXRpb24gICovCisJc3VibCAgJDgsJWVzcAogCXB1c2hsIDEyKCVlYnApCiAJcHVzaGwgJWVheAogCWNhbGwgICo4KCVlYnApCiAKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAorCiAJLyogUmV0dXJuIHN0YWNrIHRvIHByZXZpb3VzIHN0YXRlIGFuZCBjYWxsIHRoZSBmdW5jdGlvbiAgKi8KLQlhZGRsICAkOCwlZXNwCQorCWFkZGwgICQxNiwlZXNwCisKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAogCiAJY2FsbCAgKjI4KCVlYnApCi0KLQkvKiBSZW1vdmUgdGhlIHNwYWNlIHdlIHB1c2hlZCBmb3IgdGhlIGFyZ3MgICovCisJCisJLyogWFhYOiByZXR1cm4gcmV0dXJucyByZXR1cm4gd2l0aCAncmV0ICQ0JywgdGhhdCB1cHNldHMgdGhlIHN0YWNrISAqLwogCW1vdmwgIDE2KCVlYnApLCVlY3gKIAlhZGRsICAlZWN4LCVlc3AKIAorCiAJLyogTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUgICovCiAJbW92bCAgMjAoJWVicCksJWVjeAkKIAorCiAJLyogSWYgdGhlIHJldHVybiB2YWx1ZSBwb2ludGVyIGlzIE5VTEwsIGFzc3VtZSBubyByZXR1cm4gdmFsdWUuICAqLwogCWNtcGwgICQwLDI0KCVlYnApCiAJam5lICAgcmV0aW50CkBAIC0xMTcsMTcgKzEzNSw0NyBAQAogCQogcmV0aW50NjQ6CQogCWNtcGwgICRGRklfVFlQRV9TSU5UNjQsJWVjeAotICAgICAgICBqbmUgICByZXRzdHJ1Y3QKKyAgICAgICAgam5lICAgcmV0c3RydWN0MWIKIAkvKiBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlICAqLwogCW1vdmwgIDI0KCVlYnApLCVlY3gJCiAJbW92bCAgJWVheCwwKCVlY3gpCiAJbW92bCAgJWVkeCw0KCVlY3gpCisJam1wICAgZXBpbG9ndWUKKworcmV0c3RydWN0MWI6CisgICBjbXBsICRGRklfVFlQRV9TSU5UOCwlZWN4CisgICBqbmUgIHJldHN0cnVjdDJiCisgICBtb3ZsIDI0KCVlYnApLCVlY3gKKyAgIG1vdmIgICVhbCwwKCVlY3gpCisgICBqbXAgIGVwaWxvZ3VlCisKK3JldHN0cnVjdDJiOgorICAgY21wbCAkRkZJX1RZUEVfU0lOVDE2LCVlY3gKKyAgIGpuZSAgcmV0c3RydWN0CisgICBtb3ZsIDI0KCVlYnApLCVlY3gKKyAgIG1vdncgJWF4LDAoJWVjeCkKKyAgIGptcCAgZXBpbG9ndWUKIAkKIHJldHN0cnVjdDoKKyAgIGNtcGwgJEZGSV9UWVBFX1NUUlVDVCwlZWN4CisgICBqbmUgIG5vcmV0dmFsCiAJLyogTm90aGluZyB0byBkbyEgICovCiAKKwlzdWJsICQ0LCVlc3AKKworCUFTU0VSVF9TVEFDS19BTElHTkVECisKKwlhZGRsICQ4LCVlc3AKKwltb3ZsICVlYnAsICVlc3AKKwlwb3BsICVlYnAKKwlyZXQKKwogbm9yZXR2YWw6CiBlcGlsb2d1ZToKKwlBU1NFUlRfU1RBQ0tfQUxJR05FRAorCWFkZGwgJDgsICVlc3AKKworCiAgICAgICAgIG1vdmwgJWVicCwlZXNwCiAgICAgICAgIHBvcGwgJWVicAogICAgICAgICByZXQKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmlfZGFyd2luLmMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpL3NyYy94ODYvZmZpX2Rhcndpbi5jCmluZGV4IDRmODJiM2EuLmM5NzQyZDggMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmkvc3JjL3g4Ni9mZmlfZGFyd2luLmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaS9zcmMveDg2L2ZmaV9kYXJ3aW4uYwpAQCAtMTQwLDcgKzE0MCw3IEBACiAgIHN3aXRjaCAoY2lmLT5ydHlwZS0+dHlwZSkKICAgICB7CiAgICAgY2FzZSBGRklfVFlQRV9WT0lEOgotI2lmICFkZWZpbmVkKFg4Nl9XSU4zMikgCisjaWYgIWRlZmluZWQoWDg2X1dJTjMyKSAgJiYgIWRlZmluZWQoWDg2X0RBUldJTikKICAgICBjYXNlIEZGSV9UWVBFX1NUUlVDVDoKICNlbmRpZgogICAgIGNhc2UgRkZJX1RZUEVfU0lOVDY0OgpAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgICBjaWYtPmZsYWdzID0gRkZJX1RZUEVfU0lOVDY0OwogICAgICAgYnJlYWs7CiAKLSNpZiBkZWZpbmVkIFg4Nl9XSU4zMiAgCisjaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X0RBUldJTikKIAogICAgIGNhc2UgRkZJX1RZUEVfU1RSVUNUOgogICAgICAgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMSkKQEAgLTE4NiwxMCArMTg2LDExIEBACiAgICAgfQogCiAgIC8qIERhcndpbjogVGhlIHN0YWNrIG5lZWRzIHRvIGJlIGFsaWduZWQgdG8gYSBtdWx0aXBsZSBvZiAxNiBieXRlcyAqLwotI2lmIDAKKyNpZiAxCiAgIGNpZi0+Ynl0ZXMgPSAoY2lmLT5ieXRlcyArIDE1KSAmIH4weEY7CiAjZW5kaWYKIAorCiAgIHJldHVybiBGRklfT0s7CiB9CiAKQEAgLTIyMSw3ICsyMjIsNiBAQAogCSAgICAgIC8qQGRlcGVuZGVudEAqLyB2b2lkICoqYXZhbHVlKQogewogICBleHRlbmRlZF9jaWYgZWNpZjsKLSAgaW50IGZsYWdzOwogCiAgIGVjaWYuY2lmID0gY2lmOwogICBlY2lmLmF2YWx1ZSA9IGF2YWx1ZTsKQEAgLTIzOCwyMCArMjM4LDYgQEAKICAgZWxzZQogICAgIGVjaWYucnZhbHVlID0gcnZhbHVlOwogCi0gIGZsYWdzID0gY2lmLT5mbGFnczsKLSAgaWYgKGZsYWdzID09IEZGSV9UWVBFX1NUUlVDVCkgewotICAgIGlmIChjaWYtPnJ0eXBlLT5zaXplID09IDgpIHsKLQlmbGFncyA9IEZGSV9UWVBFX1NJTlQ2NDsKLSAgICB9IGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gNCkgewotICAgICAgICBmbGFncyA9IEZGSV9UWVBFX0lOVDsKLSAgICB9IGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMikgewotICAgICAgICBmbGFncyA9IEZGSV9UWVBFX0lOVDsKLSAgICB9IGVsc2UgaWYgKGNpZi0+cnR5cGUtPnNpemUgPT0gMSkgewotICAgICAgICBmbGFncyA9IEZGSV9UWVBFX0lOVDsKLSAgICB9Ci0gIH0KLQotICAKICAgc3dpdGNoIChjaWYtPmFiaSkgCiAgICAgewogICAgIGNhc2UgRkZJX1NZU1Y6CkBAIC0yNjAsOCArMjQ2LDggQEAKICAgICAgICAqIGJsb2NrIGlzIGEgbXVsdGlwbGUgb2YgMTYuIFRoZW4gYWRkIDggdG8gY29tcGVuc2F0ZSBmb3IgbG9jYWwgdmFyaWFibGVzCiAgICAgICAgKiBpbiBmZmlfY2FsbF9TWVNWLgogICAgICAgICovCi0gICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBBTElHTihjaWYtPmJ5dGVzLCAxNikgKzgsIAotCQkgICAgZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CisgICAgICBmZmlfY2FsbF9TWVNWKGZmaV9wcmVwX2FyZ3MsICZlY2lmLCBjaWYtPmJ5dGVzLCAKKwkJICAgIGNpZi0+ZmxhZ3MsIGVjaWYucnZhbHVlLCBmbik7CiAgICAgICAvKkA9dXNlZGVmQCovCiAgICAgICBicmVhazsKICNpZmRlZiBYODZfV0lOMzIKQEAgLTI4MSw4ICsyNjcsNiBAQAogCiAvKiogcHJpdmF0ZSBtZW1iZXJzICoqLwogCi1zdGF0aWMgdm9pZCBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YgKGNoYXIgKnN0YWNrLCB2b2lkICoqcmV0LAotCQkJCQkgdm9pZCoqIGFyZ3MsIGZmaV9jaWYqIGNpZik7CiBzdGF0aWMgdm9pZCBmZmlfY2xvc3VyZV9TWVNWIChmZmlfY2xvc3VyZSAqKQogICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwogI2lmICFGRklfTk9fUkFXX0FQSQpAQCAtMjkwLDgzICsyNzQsOCBAQAogICAgICBfX2F0dHJpYnV0ZV9fICgocmVncGFybSgxKSkpOwogI2VuZGlmCiAKLS8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCi0KLXN0YXRpYyB2b2lkCi1mZmlfY2xvc3VyZV9TWVNWIChjbG9zdXJlKQotICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKLXsKLSAgLy8gdGhpcyBpcyBvdXIgcmV0dXJuIHZhbHVlIHN0b3JhZ2UKLSAgbG9uZyBkb3VibGUgIHJlczsKLQotICAvLyBvdXIgdmFyaW91cyB0aGluZ3MuLi4KLSAgZmZpX2NpZiAgICAgICAqY2lmOwotICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKLSAgdW5zaWduZWQgc2hvcnQgcnR5cGU7Ci0gIHZvaWQgICAgICAgICAgKnJlc3AgPSAodm9pZCopJnJlczsKLSAgdm9pZCAqYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7Ci0KLSAgY2lmICAgICAgICAgPSBjbG9zdXJlLT5jaWY7Ci0gIGFyZ19hcmVhICAgID0gKHZvaWQqKikgYWxsb2NhIChjaWYtPm5hcmdzICogc2l6ZW9mICh2b2lkKikpOyAgCi0KLSAgLyogdGhpcyBjYWxsIHdpbGwgaW5pdGlhbGl6ZSBBUkdfQVJFQSwgc3VjaCB0aGF0IGVhY2gKLSAgICogZWxlbWVudCBpbiB0aGF0IGFycmF5IHBvaW50cyB0byB0aGUgY29ycmVzcG9uZGluZyAKLSAgICogdmFsdWUgb24gdGhlIHN0YWNrOyBhbmQgaWYgdGhlIGZ1bmN0aW9uIHJldHVybnMKLSAgICogYSBzdHJ1Y3R1cmUsIGl0IHdpbGwgcmUtc2V0IFJFU1AgdG8gcG9pbnQgdG8gdGhlCi0gICAqIHN0cnVjdHVyZSByZXR1cm4gYWRkcmVzcy4gICovCi0KLSAgZmZpX3ByZXBfaW5jb21pbmdfYXJnc19TWVNWKGFyZ3MsICh2b2lkKiopJnJlc3AsIGFyZ19hcmVhLCBjaWYpOwotICAKLSAgKGNsb3N1cmUtPmZ1bikgKGNpZiwgcmVzcCwgYXJnX2FyZWEsIGNsb3N1cmUtPnVzZXJfZGF0YSk7Ci0KLSAgcnR5cGUgPSBjaWYtPmZsYWdzOwotCi0gIGlmICghcmV0dmFsX29uX3N0YWNrKGNpZi0+cnR5cGUpICYmIGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfU1RSVUNUKSB7Ci0gICAgICBpZiAoY2lmLT5ydHlwZS0+c2l6ZSA9PSA4KSB7Ci0gICAgICAgICBydHlwZSA9IEZGSV9UWVBFX1NJTlQ2NDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgICBydHlwZSA9IEZGSV9UWVBFX0lOVDsKLSAgICAgIH0KLSAgfQotCi0gIC8qIG5vdywgZG8gYSBnZW5lcmljIHJldHVybiBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgcnR5cGUgKi8KLSAgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0lOVCkKLSAgICB7Ci0gICAgICBhc20gKCJtb3ZsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOwotICAgIH0KLSAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfRkxPQVQpCi0gICAgewotICAgICAgYXNtICgiZmxkcyAoJTApIiA6IDogInIiIChyZXNwKSA6ICJzdCIgKTsKLSAgICB9Ci0gIGVsc2UgaWYgKHJ0eXBlID09IEZGSV9UWVBFX0RPVUJMRSkKLSAgICB7Ci0gICAgICBhc20gKCJmbGRsICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOwotICAgIH0KLSAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfTE9OR0RPVUJMRSkKLSAgICB7Ci0gICAgICBhc20gKCJmbGR0ICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOwotICAgIH0KLSAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDY0KQotICAgIHsKLSAgICAgIGFzbSAoIm1vdmwgMCglMCksJSVlYXg7IgotCSAgICJtb3ZsIDQoJTApLCUlZWR4IiAKLQkgICA6IDogInIiKHJlc3ApCi0JICAgOiAiZWF4IiwgImVkeCIpOwotICAgIH0KLSNpZmRlZiBYODZfV0lOMzIKLSAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDgpIC8qIDEtYnl0ZSBzdHJ1Y3QgICovCi0gICAgewotICAgICAgYXNtICgibW92c2JsICglMCksJSVlYXgiIDogOiAiciIgKHJlc3ApIDogImVheCIpOwotICAgIH0KLSAgZWxzZSBpZiAocnR5cGUgPT0gRkZJX1RZUEVfU0lOVDE2KSAvKiAyLWJ5dGVzIHN0cnVjdCAqLwotICAgIHsKLSAgICAgIGFzbSAoIm1vdnN3bCAoJTApLCUlZWF4IiA6IDogInIiIChyZXNwKSA6ICJlYXgiKTsKLSAgICB9Ci0jZW5kaWYKLX0KLQogLypALWV4cG9ydGhlYWRlckAqLwotc3RhdGljIHZvaWQgCitzdGF0aWMgaW5saW5lIHZvaWQgCiBmZmlfcHJlcF9pbmNvbWluZ19hcmdzX1NZU1YoY2hhciAqc3RhY2ssIHZvaWQgKipydmFsdWUsCiAJCQkgICAgdm9pZCAqKmF2YWx1ZSwgZmZpX2NpZiAqY2lmKQogLypAPWV4cG9ydGhlYWRlckAqLwpAQCAtNDA3LDYgKzMxNiw4MSBAQAogICByZXR1cm47CiB9CiAKKy8qIFRoaXMgZnVuY3Rpb24gaXMganVtcGVkIHRvIGJ5IHRoZSB0cmFtcG9saW5lICovCisKK3N0YXRpYyB2b2lkCitmZmlfY2xvc3VyZV9TWVNWIChjbG9zdXJlKQorICAgICBmZmlfY2xvc3VyZSAqY2xvc3VyZTsKK3sKKyAgLy8gdGhpcyBpcyBvdXIgcmV0dXJuIHZhbHVlIHN0b3JhZ2UKKyAgbG9uZyBkb3VibGUgIHJlczsKKworICAvLyBvdXIgdmFyaW91cyB0aGluZ3MuLi4KKyAgZmZpX2NpZiAgICAgICAqY2lmOworICB2b2lkICAgICAgICAgKiphcmdfYXJlYTsKKyAgdm9pZCAgICAgICAgICAqcmVzcCA9ICh2b2lkKikmcmVzOworICB2b2lkICphcmdzID0gX19idWlsdGluX2R3YXJmX2NmYSAoKTsKKworCisgIGNpZiAgICAgICAgID0gY2xvc3VyZS0+Y2lmOworICBhcmdfYXJlYSAgICA9ICh2b2lkKiopIGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCopKTsgIAorCisgIC8qIHRoaXMgY2FsbCB3aWxsIGluaXRpYWxpemUgQVJHX0FSRUEsIHN1Y2ggdGhhdCBlYWNoCisgICAqIGVsZW1lbnQgaW4gdGhhdCBhcnJheSBwb2ludHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgCisgICAqIHZhbHVlIG9uIHRoZSBzdGFjazsgYW5kIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgICAqIGEgc3RydWN0dXJlLCBpdCB3aWxsIHJlLXNldCBSRVNQIHRvIHBvaW50IHRvIHRoZQorICAgKiBzdHJ1Y3R1cmUgcmV0dXJuIGFkZHJlc3MuICAqLworCisgIGZmaV9wcmVwX2luY29taW5nX2FyZ3NfU1lTVihhcmdzLCAodm9pZCoqKSZyZXNwLCBhcmdfYXJlYSwgY2lmKTsKKyAgCisgIChjbG9zdXJlLT5mdW4pIChjaWYsIHJlc3AsIGFyZ19hcmVhLCBjbG9zdXJlLT51c2VyX2RhdGEpOworCisgIC8qIG5vdywgZG8gYSBnZW5lcmljIHJldHVybiBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgcnR5cGUgKi8KKyAgaWYgKGNpZi0+ZmxhZ3MgPT0gRkZJX1RZUEVfSU5UKQorICAgIHsKKyAgICAgIGFzbSAoIm1vdmwgKCUwKSwlJWVheCIgOiA6ICJyIiAocmVzcCkgOiAiZWF4Iik7CisgICAgfQorICBlbHNlIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX0ZMT0FUKQorICAgIHsKKyAgICAgIGFzbSAoImZsZHMgKCUwKSIgOiA6ICJyIiAocmVzcCkgOiAic3QiICk7CisgICAgfQorICBlbHNlIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX0RPVUJMRSkKKyAgICB7CisgICAgICBhc20gKCJmbGRsICglMCkiIDogOiAiciIgKHJlc3ApIDogInN0IiwgInN0KDEpIiApOworICAgIH0KKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9MT05HRE9VQkxFKQorICAgIHsKKyAgICAgIGFzbSAoImZsZHQgKCUwKSIgOiA6ICJyIiAocmVzcCkgOiAic3QiLCAic3QoMSkiICk7CisgICAgfQorICBlbHNlIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NJTlQ2NCkKKyAgICB7CisgICAgICBhc20gKCJtb3ZsIDAoJTApLCUlZWF4OyIKKwkgICAibW92bCA0KCUwKSwlJWVkeCIgCisJICAgOiA6ICJyIihyZXNwKQorCSAgIDogImVheCIsICJlZHgiKTsKKyAgICB9CisjaWYgZGVmaW5lZChYODZfV0lOMzIpIHx8IGRlZmluZWQoWDg2X0RBUldJTikKKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TSU5UOCkgLyogMS1ieXRlIHN0cnVjdCAgKi8KKyAgICB7CisgICAgICBhc20gKCJtb3ZzYmwgKCUwKSwlJWVheCIgOiA6ICJyIiAocmVzcCkgOiAiZWF4Iik7CisgICAgfQorICBlbHNlIGlmIChjaWYtPmZsYWdzID09IEZGSV9UWVBFX1NJTlQxNikgLyogMi1ieXRlcyBzdHJ1Y3QgKi8KKyAgICB7CisgICAgICBhc20gKCJtb3Zzd2wgKCUwKSwlJWVheCIgOiA6ICJyIiAocmVzcCkgOiAiZWF4Iik7CisgICAgfQorI2VuZGlmCisKKyAgZWxzZSBpZiAoY2lmLT5mbGFncyA9PSBGRklfVFlQRV9TVFJVQ1QpCisgICAgeworICAgICAgYXNtICgibGVhIC04KCVlYnApLCVlc3A7IgorCSAgICJwb3AgJWVzaTsiCisJICAgInBvcCAlZWRpOyIKKwkgICAicG9wICVlYnA7IgorCSAgICJyZXQgJDQiKTsgCisgICAgfQorfQorCisKIC8qIEhvdyB0byBtYWtlIGEgdHJhbXBvbGluZS4gIERlcml2ZWQgZnJvbSBnY2MvY29uZmlnL2kzODYvaTM4Ni5jLiAqLwogCiAjZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOLENUWCkgXApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaS5jCmluZGV4IGU1NjAwYjIuLjlhZjZiNzEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmkuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpLmMKQEAgLTIyNywxMSArMjI3LDcgQEAKICAgdm9pZCAgICAgICAgICoqYXJnX2FyZWE7CiAgIHVuc2lnbmVkIHNob3J0IHJ0eXBlOwogICB2b2lkICAgICAgICAgICpyZXNwID0gKHZvaWQqKSZyZXM7Ci0vLyNpZmRlZiBfTVNDX1ZFUgogICB2b2lkICphcmdzID0gJmFyZ3BbMV07Ci0vLyNlbHNlCi0vLyAgdm9pZCAqYXJncyA9IF9fYnVpbHRpbl9kd2FyZl9jZmEgKCk7Ci0vLyNlbmRpZgogCiAgIGNpZiAgICAgICAgID0gY2xvc3VyZS0+Y2lmOwogICBhcmdfYXJlYSAgICA9ICh2b2lkKiopIGFsbG9jYSAoY2lmLT5uYXJncyAqIHNpemVvZiAodm9pZCopKTsgIApAQCAtMzUzLDEwICszNDksNiBAQAogCiAvKiBIb3cgdG8gbWFrZSBhIHRyYW1wb2xpbmUuICBEZXJpdmVkIGZyb20gZ2NjL2NvbmZpZy9pMzg2L2kzODYuYy4gKi8KIAotLyogTU9WIEVEWCwgRVNQIGlzIDB4OGIgMHhkNCAqLwotCi0vLyNpZmRlZiBfTVNDX1ZFUgotCiAjZGVmaW5lIEZGSV9JTklUX1RSQU1QT0xJTkUoVFJBTVAsRlVOLENUWCxCWVRFUykgXAogeyB1bnNpZ25lZCBjaGFyICpfX3RyYW1wID0gKHVuc2lnbmVkIGNoYXIqKShUUkFNUCk7IFwKICAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCkBAIC0zNjUsMjYgKzM1NywxMyBAQAogICAgKih1bnNpZ25lZCBjaGFyKikgICZfX3RyYW1wWzBdID0gMHhiOTsgXAogICAgKih1bnNpZ25lZCBpbnQqKSAgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdiBlY3gsIF9fY3R4ICovIFwKICAgICoodW5zaWduZWQgY2hhciopICAmX190cmFtcFs1XSA9IDB4OGI7IFwKLSAgICoodW5zaWduZWQgY2hhciopICAmX190cmFtcFs2XSA9IDB4ZDQ7IFwKKyAgICoodW5zaWduZWQgY2hhciopICAmX190cmFtcFs2XSA9IDB4ZDQ7IC8qIG1vdiBlZHgsIGVzcCAqLyBcCiAgICAqKHVuc2lnbmVkIGNoYXIqKSAgJl9fdHJhbXBbN10gPSAweGU4OyBcCiAgICAqKHVuc2lnbmVkIGludCopICAgJl9fdHJhbXBbOF0gPSBfX2RpczsgLyogY2FsbCBfX2Z1biAgKi8gXAogICAgKih1bnNpZ25lZCBjaGFyKikgICZfX3RyYW1wWzEyXSA9IDB4QzI7IC8qIHJldCBCWVRFUyAqLyBcCiAgICAqKHVuc2lnbmVkIHNob3J0KikgJl9fdHJhbXBbMTNdID0gQllURVM7IFwKICB9CiAKLS8vI2Vsc2UKLS8vI2RlZmluZSBGRklfSU5JVF9UUkFNUE9MSU5FKFRSQU1QLEZVTixDVFgsQllURVMpIFwKLS8vKHsgdW5zaWduZWQgY2hhciAqX190cmFtcCA9ICh1bnNpZ25lZCBjaGFyKikoVFJBTVApOyBcCi0vLyAgIHVuc2lnbmVkIGludCAgX19mdW4gPSAodW5zaWduZWQgaW50KShGVU4pOyBcCi0vLyAgIHVuc2lnbmVkIGludCAgX19jdHggPSAodW5zaWduZWQgaW50KShDVFgpOyBcCi0vLyAgIHVuc2lnbmVkIGludCAgX19kaXMgPSBfX2Z1biAtICgodW5zaWduZWQgaW50KSBfX3RyYW1wICsgRkZJX1RSQU1QT0xJTkVfU0laRSk7IFwKLS8vICAgKih1bnNpZ25lZCBjaGFyKikgJl9fdHJhbXBbMF0gPSAweGI4OyBcCi0vLyAgICoodW5zaWduZWQgaW50KikgICZfX3RyYW1wWzFdID0gX19jdHg7IC8qIG1vdmwgX19jdHgsICVlYXggKi8gXAotLy8gICAqKHVuc2lnbmVkIGNoYXIgKikgICZfX3RyYW1wWzVdID0gMHhlOTsgXAotLy8gICAqKHVuc2lnbmVkIGludCopICAmX190cmFtcFs2XSA9IF9fZGlzOyAvKiBqbXAgX19mdW4gICovIFwKLS8vIH0pCi0vLyNlbmRpZgotCiAvKiB0aGUgY2lmIG11c3QgYWxyZWFkeSBiZSBwcmVwJ2VkICovCiAKIGZmaV9zdGF0dXMKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmljb25maWcuaCBiL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZmljb25maWcuaAppbmRleCAyNWI2MzA1Li5jMTRmNjUzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpY29uZmlnLmgKKysrIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaWNvbmZpZy5oCkBAIC0zLDggKzMsMTAgQEAKIC8qIGZmaWNvbmZpZy5oLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgYnkgY29uZmlndXJlLiAgKi8KIC8qIGZmaWNvbmZpZy5oLmluLiAgR2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkgZnJvbSBjb25maWd1cmUuaW4gYnkgYXV0b2hlYWRlci4gICovCiAKLS8qIERlZmluZXMgZm9yIE1TVkMgKi8KKy8qIERlZmluZSB0aGlzIGZvciBNU1ZDLCBidXQgbm90IGZvciBtaW5ndzMyISAqLworI2lmZGVmIF9NU0NfVkVSCiAjZGVmaW5lIF9fYXR0cmlidXRlX18oeCkgLyogKi8KKyNlbmRpZgogI2RlZmluZSBhbGxvY2EgX2FsbG9jYQogCiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oIGIvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL2ZmaXRhcmdldC5oCmluZGV4IDU3ZDI3NWIuLjc4YzBjMzcgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9saWJmZmlfbXN2Yy9mZml0YXJnZXQuaAorKysgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvZmZpdGFyZ2V0LmgKQEAgLTcxLDExICs3MSw3IEBACiAjZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMjQKICNkZWZpbmUgRkZJX05BVElWRV9SQVdfQVBJIDAKICNlbHNlCi0jaWZkZWYgX01TQ19WRVIKLSMgZGVmaW5lIEZGSV9UUkFNUE9MSU5FX1NJWkUgMTUKLSNlbHNlCi0jIGRlZmluZSBGRklfVFJBTVBPTElORV9TSVpFIDEwCi0jZW5kaWYKKyNkZWZpbmUgRkZJX1RSQU1QT0xJTkVfU0laRSAxNQogI2RlZmluZSBGRklfTkFUSVZFX1JBV19BUEkgMQkvKiB4ODYgaGFzIG5hdGl2ZSByYXcgYXBpIHN1cHBvcnQgKi8KICNlbmRpZgogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvbWluZ3dpbjMyLlMgYi9Nb2R1bGVzL19jdHlwZXMvbGliZmZpX21zdmMvbWluZ3dpbjMyLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWYyYjIuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9fY3R5cGVzL2xpYmZmaV9tc3ZjL21pbmd3aW4zMi5TCisrKyAvZGV2L251bGwKQEAgLTEsMjI4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICB3aW4zMi5TIC0gQ29weXJpZ2h0IChjKSAxOTk2LCAxOTk4LCAyMDAxLCAyMDAyICBSZWQgSGF0LCBJbmMuCi0JICAgICBDb3B5cmlnaHQgKGMpIDIwMDEgIEpvaG4gQmVuaXRvbgotCSAgICAgQ29weXJpZ2h0IChjKSAyMDAyICBSYW5qaXQgTWF0aGV3Ci0JCQkKLSAKLSAgIFg4NiBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQotIAotICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCi0gICBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKLSAgIGBgU29mdHdhcmUnJyksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwotICAgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAotICAgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCi0gICBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KLSAgIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAKLSAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCi0gICBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KLSAKLSAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKLSAgIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKLSAgIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSAgIElOIE5PIEVWRU5UIFNIQUxMIENZR05VUyBTT0xVVElPTlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAgIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICAgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gICBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwotIAotI2RlZmluZSBMSUJGRklfQVNNCi0jaW5jbHVkZSA8ZmZpY29uZmlnLmg+Ci0jaW5jbHVkZSA8ZmZpLmg+Ci0gCi0udGV4dAotIAotLmdsb2JsIGZmaV9wcmVwX2FyZ3MKLSAKLSAgICAgICAgIyBUaGlzIGFzc3VtZXMgd2UgYXJlIHVzaW5nIGdhcy4KLSAgICAgICAgLmJhbGlnbiAxNgotLmdsb2JsIF9mZmlfY2FsbF9TWVNWCi0gCi1fZmZpX2NhbGxfU1lTVjoKLSAgICAgICAgcHVzaGwgJWVicAotICAgICAgICBtb3ZsICAlZXNwLCVlYnAKLSAKLSAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCi0gICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBzdWJsICAlZWN4LCVlc3AKLSAKLSAgICAgICAgbW92bCAgJWVzcCwlZWF4Ci0gCi0gICAgICAgICMgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCi0gICAgICAgIHB1c2hsIDEyKCVlYnApCi0gICAgICAgIHB1c2hsICVlYXgKLSAgICAgICAgY2FsbCAgKjgoJWVicCkKLSAKLSAgICAgICAgIyBSZXR1cm4gc3RhY2sgdG8gcHJldmlvdXMgc3RhdGUgYW5kIGNhbGwgdGhlIGZ1bmN0aW9uCi0gICAgICAgIGFkZGwgICQ4LCVlc3AKLSAKLSAgICAgICAgIyBGSVhNRTogQWxpZ24gdGhlIHN0YWNrIHRvIGEgMTI4LWJpdCBib3VuZGFyeSB0byBhdm9pZAotICAgICAgICAjIHBvdGVudGlhbCBwZXJmb3JtYW5jZSBoaXRzLgotCi0JY2FsbCAgKjI4KCVlYnApCi0gCi0gICAgICAgICMgUmVtb3ZlIHRoZSBzcGFjZSB3ZSBwdXNoZWQgZm9yIHRoZSBhcmdzCi0gICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3gKLSAgICAgICAgYWRkbCAgJWVjeCwlZXNwCi0gCi0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHJldHVybiB0eXBlIGNvZGUKLSAgICAgICAgbW92bCAgMjAoJWVicCksJWVjeAotIAotICAgICAgICAjIElmIHRoZSByZXR1cm4gdmFsdWUgcG9pbnRlciBpcyBOVUxMLCBhc3N1bWUgbm8gcmV0dXJuIHZhbHVlLgotICAgICAgICBjbXBsICAkMCwyNCglZWJwKQotICAgICAgICBqbmUgICByZXRpbnQKLSAKLSAgICAgICAgIyBFdmVuIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLCB3ZSBhcmUKLSAgICAgICAgIyBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gICAgICAgIGNtcGwgICQyLCVlY3ggICMgRmxvYXRfdHlwZQotICAgICAgICBqbmUgICBub3JldHZhbAotICAgICAgICBmc3RwICAlc3QoMCkKLSAKLSAgICAgICAgam1wICAgZXBpbG9ndWUKLSAKLXJldGludDoKLSAgICAgICAgY21wbCAgJDEsJWVjeCAgICAjIEludF90eXBlCi0gICAgICAgIGpuZSAgIHJldGZsb2F0Ci0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIG1vdmwgICVlYXgsMCglZWN4KQotICAgICAgICBqbXAgICBlcGlsb2d1ZQotIAotcmV0ZmxvYXQ6Ci0gICAgICAgIGNtcGwgICQyLCVlY3ggICAjIEZsb2F0X3R5cGUKLSAgICAgICAgam5lICAgcmV0ZG91YmxlICAgCi0gICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBmc3RwcyAoJWVjeCkKLSAgICAgICAgam1wICAgZXBpbG9ndWUKLSAKLXJldGRvdWJsZToKLSAgICAgICAgY21wbCAgJDMsJWVjeCAgICAgIyBEb3VibGVfdHlwZQotICAgICAgICBqbmUgICByZXRsb25nZG91YmxlCi0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIGZzdHBsICglZWN4KQotICAgICAgICBqbXAgICBlcGlsb2d1ZQotIAotcmV0bG9uZ2RvdWJsZToKLSAgICAgICAgY21wbCAgJDQsJWVjeCAgICAgIyBMb25nZG91YmxlX3R5cGUKLSAgICAgICAgam5lICAgcmV0aW50NjQKLSAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKLSAgICAgICAgZnN0cHQgKCVlY3gpCi0gICAgICAgIGptcCAgIGVwaWxvZ3VlCi0gCi1yZXRpbnQ2NDoKLSAgICAgICAgY21wbCAgJDEyLCVlY3ggICAgICAjIFNJTlQ2NF90eXBlCi0gICAgICAgIGpuZSAgIHJldHN0cnVjdAotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKLSAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCi0gCi1yZXRzdHJ1Y3Q6Ci0gICAgICAgICMgTm90aGluZyB0byBkbyEKLSAKLW5vcmV0dmFsOgotZXBpbG9ndWU6Ci0gICAgICAgIG1vdmwgJWVicCwlZXNwCi0gICAgICAgIHBvcGwgJWVicAotICAgICAgICByZXQKLSAKLS5mZmlfY2FsbF9TWVNWX2VuZDoKLQotICAgICAgICAjIFRoaXMgYXNzdW1lcyB3ZSBhcmUgdXNpbmcgZ2FzLgotICAgICAgICAuYmFsaWduIDE2Ci0uZ2xvYmwgX2ZmaV9jYWxsX1NURENBTEwKLQotX2ZmaV9jYWxsX1NURENBTEw6Ci0gICAgICAgIHB1c2hsICVlYnAKLSAgICAgICAgbW92bCAgJWVzcCwlZWJwCi0KLSAgICAgICAgIyBNYWtlIHJvb20gZm9yIGFsbCBvZiB0aGUgbmV3IGFyZ3MuCi0gICAgICAgIG1vdmwgIDE2KCVlYnApLCVlY3ggCi0gICAgICAgIHN1YmwgICVlY3gsJWVzcAotCi0gICAgICAgIG1vdmwgICVlc3AsJWVheAotCi0gICAgICAgICMgUGxhY2UgYWxsIG9mIHRoZSBmZmlfcHJlcF9hcmdzIGluIHBvc2l0aW9uCi0gICAgICAgIHB1c2hsIDEyKCVlYnApCi0gICAgICAgIHB1c2hsICVlYXgKLSAgICAgICAgY2FsbCAgKjgoJWVicCkKLQotICAgICAgICAjIFJldHVybiBzdGFjayB0byBwcmV2aW91cyBzdGF0ZSBhbmQgY2FsbCB0aGUgZnVuY3Rpb24KLSAgICAgICAgYWRkbCAgJDgsJWVzcAotCi0gICAgICAgICMgRklYTUU6IEFsaWduIHRoZSBzdGFjayB0byBhIDEyOC1iaXQgYm91bmRhcnkgdG8gYXZvaWQKLSAgICAgICAgIyBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgaGl0cy4KLQotICAgICAgICBjYWxsICAqMjgoJWVicCkKLQotICAgICAgICAjIHN0ZGNhbGwgZnVuY3Rpb25zIHBvcCBhcmd1bWVudHMgb2ZmIHRoZSBzdGFjayB0aGVtc2VsdmVzCi0KLSAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcmV0dXJuIHR5cGUgY29kZQotICAgICAgICBtb3ZsICAyMCglZWJwKSwlZWN4Ci0KLSAgICAgICAgIyBJZiB0aGUgcmV0dXJuIHZhbHVlIHBvaW50ZXIgaXMgTlVMTCwgYXNzdW1lIG5vIHJldHVybiB2YWx1ZS4KLSAgICAgICAgY21wbCAgJDAsMjQoJWVicCkKLSAgICAgICAgam5lICAgc2NfcmV0aW50Ci0KLSAgICAgICAgIyBFdmVuIGlmIHRoZXJlIGlzIG5vIHNwYWNlIGZvciB0aGUgcmV0dXJuIHZhbHVlLCB3ZSBhcmUKLSAgICAgICAgIyBvYmxpZ2VkIHRvIGhhbmRsZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gICAgICAgIGNtcGwgICQyLCVlY3ggICAgICAjIEZsb2F0X3R5cGUKLSAgICAgICAgam5lICAgc2Nfbm9yZXR2YWwKLSAgICAgICAgZnN0cCAgJXN0KDApCi0KLSAgICAgICAgam1wICAgc2NfZXBpbG9ndWUKLQotc2NfcmV0aW50OgotICAgICAgICBjbXBsICAkMSwlZWN4ICAgICAgICMgSW50X3R5cGUKLSAgICAgICAgam5lICAgc2NfcmV0ZmxvYXQKLSAgICAgICAgIyBMb2FkICVlY3ggd2l0aCB0aGUgcG9pbnRlciB0byBzdG9yYWdlIGZvciB0aGUgcmV0dXJuIHZhbHVlCi0gICAgICAgIG1vdmwgIDI0KCVlYnApLCVlY3gKLSAgICAgICAgbW92bCAgJWVheCwwKCVlY3gpCi0gICAgICAgIGptcCAgIHNjX2VwaWxvZ3VlCi0KLXNjX3JldGZsb2F0OgotICAgICAgICBjbXBsICAkMiwlZWN4ICAgICAgICMgRmxvYXRfdHlwZQotICAgICAgICBqbmUgICBzY19yZXRkb3VibGUKLSAgICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIGZzdHBzICglZWN4KQotICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQotCi1zY19yZXRkb3VibGU6Ci0gICAgICAgIGNtcGwgICQyLCVlY3ggICAgICAgIyBEb3VibGVfdHlwZQotICAgICAgICBqbmUgICBzY19yZXRsb25nZG91YmxlCi0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIGZzdHBsICglZWN4KQotICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQotCi1zY19yZXRsb25nZG91YmxlOgotICAgICAgICBjbXBsICAkNCwlZWN4ICAgICAgIyBMb25nZG91YmxlX3R5cGUgCi0gICAgICAgIGpuZSAgIHNjX3JldGludDY0Ci0gICAgICAgICMgTG9hZCAlZWN4IHdpdGggdGhlIHBvaW50ZXIgdG8gc3RvcmFnZSBmb3IgdGhlIHJldHVybiB2YWx1ZQotICAgICAgICBtb3ZsICAyNCglZWJwKSwlZWN4Ci0gICAgICAgIGZzdHB0ICglZWN4KQotICAgICAgICBqbXAgICBzY19lcGlsb2d1ZQotCi1zY19yZXRpbnQ2NDoKLSAgICAgICAgY21wbCAgJDEyLCVlY3ggICAgICAjIFNJTlQ2NF9UeXBlCi0gICAgICAgIGpuZSAgIHNjX3JldHN0cnVjdAotICAgICAgICAjIExvYWQgJWVjeCB3aXRoIHRoZSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIHRoZSByZXR1cm4gdmFsdWUKLSAgICAgICAgbW92bCAgMjQoJWVicCksJWVjeAotICAgICAgICBtb3ZsICAlZWF4LDAoJWVjeCkKLSAgICAgICAgbW92bCAgJWVkeCw0KCVlY3gpCi0KLXNjX3JldHN0cnVjdDoKLSAgICAgICAgIyBOb3RoaW5nIHRvIGRvIQotCi1zY19ub3JldHZhbDoKLXNjX2VwaWxvZ3VlOgotICAgICAgICBtb3ZsICVlYnAsJWVzcAotICAgICAgICBwb3BsICVlYnAKLSAgICAgICAgcmV0Ci0KLS5mZmlfY2FsbF9TVERDQUxMX2VuZDoKLQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fY3R5cGVzL21hbGxvY19jbG9zdXJlLmMgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwppbmRleCAyOWU5ZjRjLi40Y2Q1ZGQ2IDEwMDY0NAotLS0gYS9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYworKysgYi9Nb2R1bGVzL19jdHlwZXMvbWFsbG9jX2Nsb3N1cmUuYwpAQCAtMSwzICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSA8UHl0aG9uLmg+CiAjaW5jbHVkZSA8ZmZpLmg+CiAjaWZkZWYgTVNfV0lOMzIKZGlmZiAtLWdpdCBhL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMgYi9Nb2R1bGVzL19jdHlwZXMvc3RnZGljdC5jCmluZGV4IGMxYzMwZjEuLmI0ZDgxOTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N0eXBlcy9zdGdkaWN0LmMKKysrIGIvTW9kdWxlcy9fY3R5cGVzL3N0Z2RpY3QuYwpAQCAtMSwzICsxLDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBUaGlzIGZpbGUgc2hvdWxkIGJlIGtlcHQgY29tcGF0aWJsZSB3aXRoIFB5dGhvbiAyLjMsIHNlZSBQRVAgMjkxLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCiAjaW5jbHVkZSAiUHl0aG9uLmgiCiAjaW5jbHVkZSA8ZmZpLmg+CiAjaWZkZWYgTVNfV0lOMzIKQEAgLTEyOCw0MiArMTMyLDE0OCBAQAogCWlmICghUHlUeXBlX0NoZWNrKG9iaikpCiAJCXJldHVybiBOVUxMOwogCXR5cGUgPSAoUHlUeXBlT2JqZWN0ICopb2JqOwotCWlmICghdHlwZS0+dHBfZGljdCB8fCAhU3RnRGljdF9DaGVjayh0eXBlLT50cF9kaWN0KSkKKwlpZiAoIXR5cGUtPnRwX2RpY3QgfHwgIVN0Z0RpY3RfQ2hlY2tFeGFjdCh0eXBlLT50cF9kaWN0KSkKIAkJcmV0dXJuIE5VTEw7CiAJcmV0dXJuIChTdGdEaWN0T2JqZWN0ICopdHlwZS0+dHBfZGljdDsKIH0KIAogLyogTWF5IHJldHVybiBOVUxMLCBidXQgZG9lcyBub3Qgc2V0IGFuIGV4Y2VwdGlvbiEgKi8KKy8qCisgIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGFzIGZhc3QgYXMgcG9zc2libGUsIHNvIHdlIGRvbid0IGNhbGwgUHlUeXBlX3N0Z2RpY3QKKyAgYWJvdmUgYnV0IGlubGluZSB0aGUgY29kZSwgYW5kIGF2b2lkIHRoZSBQeVR5cGVfQ2hlY2soKS4KKyovCiBTdGdEaWN0T2JqZWN0ICoKIFB5T2JqZWN0X3N0Z2RpY3QoUHlPYmplY3QgKnNlbGYpCiB7Ci0JcmV0dXJuIFB5VHlwZV9zdGdkaWN0KChQeU9iamVjdCAqKXNlbGYtPm9iX3R5cGUpOworCVB5VHlwZU9iamVjdCAqdHlwZSA9IHNlbGYtPm9iX3R5cGU7CisJaWYgKCF0eXBlLT50cF9kaWN0IHx8ICFTdGdEaWN0X0NoZWNrRXhhY3QodHlwZS0+dHBfZGljdCkpCisJCXJldHVybiBOVUxMOworCXJldHVybiAoU3RnRGljdE9iamVjdCAqKXR5cGUtPnRwX2RpY3Q7CiB9CiAKLSNpZiAwCi0vKiB3b3JrIGluIHByb2dyZXNzOiBhbm9ueW1vdXMgc3RydWN0dXJlIGZpZWxkcyAqLwotaW50Ci1HZXRGaWVsZHMoUHlPYmplY3QgKmRlc2MsIGludCAqcGluZGV4LCBpbnQgKnBzaXplLCBpbnQgKnBvZmZzZXQsIGludCAqcGFsaWduLCBpbnQgcGFjayk7Ci0KKy8qIGRlc2NyIGlzIHRoZSBkZXNjcmlwdG9yIGZvciBhIGZpZWxkIG1hcmtlZCBhcyBhbm9ueW1vdXMuICBHZXQgYWxsIHRoZQorIF9maWVsZHNfIGRlc2NyaXB0b3JzIGZyb20gZGVzY3ItPnByb3RvLCBjcmVhdGUgbmV3IGRlc2NyaXB0b3JzIHdpdGggb2Zmc2V0CisgYW5kIGluZGV4IGFkanVzdGVkLCBhbmQgc3R1ZmYgdGhlbSBpbnRvIHR5cGUuCisgKi8KK3N0YXRpYyBpbnQKK01ha2VGaWVsZHMoUHlPYmplY3QgKnR5cGUsIENGaWVsZE9iamVjdCAqZGVzY3IsCisJICAgUHlfc3NpemVfdCBpbmRleCwgUHlfc3NpemVfdCBvZmZzZXQpCiB7Ci0JaW50IGk7Ci0JUHlPYmplY3QgKnR1cGxlcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGVzYywgIl9maWVsZHNfIik7Ci0JaWYgKHR1cGxlcyA9PSBOVUxMKQorCVB5X3NzaXplX3QgaTsKKwlQeU9iamVjdCAqZmllbGRzOworCVB5T2JqZWN0ICpmaWVsZGxpc3Q7CisKKwlmaWVsZHMgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGRlc2NyLT5wcm90bywgIl9maWVsZHNfIik7CisJaWYgKGZpZWxkcyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCFQeVR1cGxlX0NoZWNrKHR1cGxlcykpCi0JCXJldHVybiAtMTsgLyogbGVhayAqLwotCWZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHR1cGxlcyk7ICsraSkgewotCQljaGFyICpmbmFtZTsKLQkJUHlPYmplY3QgKmR1bW15OwotCQlDRmllbGRPYmplY3QgKmZpZWxkOwotCQlQeU9iamVjdCAqcGFpciA9IFB5VHVwbGVfR0VUX0lURU0odHVwbGVzLCBpKTsKLQkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJzTyIsICZmbmFtZSwgJmR1bW15KSkKLQkJCXJldHVybiAtMTsgLyogbGVhayAqLwotCQlmaWVsZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZGVzYywgZm5hbWUpOwotCQlQeV9ERUNSRUYoZmllbGQpOworCWZpZWxkbGlzdCA9IFB5U2VxdWVuY2VfRmFzdChmaWVsZHMsICJfZmllbGRzXyBtdXN0IGJlIGEgc2VxdWVuY2UiKTsKKwlQeV9ERUNSRUYoZmllbGRzKTsKKwlpZiAoZmllbGRsaXN0ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBQeVNlcXVlbmNlX0Zhc3RfR0VUX1NJWkUoZmllbGRsaXN0KTsgKytpKSB7CisJCVB5T2JqZWN0ICpwYWlyID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGZpZWxkbGlzdCwgaSk7IC8qIGJvcnJvd2VkICovCisJCVB5T2JqZWN0ICpmbmFtZSwgKmZ0eXBlOworCQlDRmllbGRPYmplY3QgKmZkZXNjcjsKKwkJQ0ZpZWxkT2JqZWN0ICpuZXdfZGVzY3I7CisJCS8qIENvbnZlcnQgdG8gUHlBcmdfVW5wYWNrVHVwbGUuLi4gKi8KKwkJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKHBhaXIsICJPTyIsICZmbmFtZSwgJmZ0eXBlKSkgeworCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJZmRlc2NyID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0dldEF0dHIoZGVzY3ItPnByb3RvLCBmbmFtZSk7CisJCWlmIChmZGVzY3IgPT0gTlVMTCkgeworCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGZkZXNjci0+b2JfdHlwZSAhPSAmQ0ZpZWxkX1R5cGUpIHsKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ1bmV4cGVjdGVkIHR5cGUiKTsKKwkJCVB5X0RFQ1JFRihmZGVzY3IpOworCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaWYgKGZkZXNjci0+YW5vbnltb3VzKSB7CisJCQlpbnQgcmMgPSBNYWtlRmllbGRzKHR5cGUsIGZkZXNjciwKKwkJCQkJICAgIGluZGV4ICsgZmRlc2NyLT5pbmRleCwKKwkJCQkJICAgIG9mZnNldCArIGZkZXNjci0+b2Zmc2V0KTsKKwkJCVB5X0RFQ1JFRihmZGVzY3IpOworCQkJaWYgKHJjID09IC0xKSB7CisJCQkJUHlfREVDUkVGKGZpZWxkbGlzdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJY29udGludWU7CisJCX0KKyAJCW5ld19kZXNjciA9IChDRmllbGRPYmplY3QgKilQeU9iamVjdF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKSZDRmllbGRfVHlwZSwgTlVMTCk7CisJCWFzc2VydChuZXdfZGVzY3ItPm9iX3R5cGUgPT0gJkNGaWVsZF9UeXBlKTsKKwkJaWYgKG5ld19kZXNjciA9PSBOVUxMKSB7CisJCQlQeV9ERUNSRUYoZmRlc2NyKTsKKwkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisgCQluZXdfZGVzY3ItPnNpemUgPSBmZGVzY3ItPnNpemU7CisgCQluZXdfZGVzY3ItPm9mZnNldCA9IGZkZXNjci0+b2Zmc2V0ICsgb2Zmc2V0OworIAkJbmV3X2Rlc2NyLT5pbmRleCA9IGZkZXNjci0+aW5kZXggKyBpbmRleDsKKyAJCW5ld19kZXNjci0+cHJvdG8gPSBmZGVzY3ItPnByb3RvOworIAkJUHlfWElOQ1JFRihuZXdfZGVzY3ItPnByb3RvKTsKKyAJCW5ld19kZXNjci0+Z2V0ZnVuYyA9IGZkZXNjci0+Z2V0ZnVuYzsKKyAJCW5ld19kZXNjci0+c2V0ZnVuYyA9IGZkZXNjci0+c2V0ZnVuYzsKKworICAJCVB5X0RFQ1JFRihmZGVzY3IpOworCQkKKwkJaWYgKC0xID09IFB5T2JqZWN0X1NldEF0dHIodHlwZSwgZm5hbWUsIChQeU9iamVjdCAqKW5ld19kZXNjcikpIHsKKwkJCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCQkJUHlfREVDUkVGKG5ld19kZXNjcik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJUHlfREVDUkVGKG5ld19kZXNjcik7CiAJfQorCVB5X0RFQ1JFRihmaWVsZGxpc3QpOworCXJldHVybiAwOwogfQotI2VuZGlmCisKKy8qIEl0ZXJhdGUgb3ZlciB0aGUgbmFtZXMgaW4gdGhlIHR5cGUncyBfYW5vbnltb3VzXyBhdHRyaWJ1dGUsIGlmIHByZXNlbnQsCisgKi8KK3N0YXRpYyBpbnQKK01ha2VBbm9uRmllbGRzKFB5T2JqZWN0ICp0eXBlKQoreworCVB5T2JqZWN0ICphbm9uOworCVB5T2JqZWN0ICphbm9uX25hbWVzOworCVB5X3NzaXplX3QgaTsKKworCWFub24gPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHR5cGUsICJfYW5vbnltb3VzXyIpOworCWlmIChhbm9uID09IE5VTEwpIHsKKwkJUHlFcnJfQ2xlYXIoKTsKKwkJcmV0dXJuIDA7CisJfQorCWFub25fbmFtZXMgPSBQeVNlcXVlbmNlX0Zhc3QoYW5vbiwgIl9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZSIpOworCVB5X0RFQ1JFRihhbm9uKTsKKwlpZiAoYW5vbl9uYW1lcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgUHlTZXF1ZW5jZV9GYXN0X0dFVF9TSVpFKGFub25fbmFtZXMpOyArK2kpIHsKKwkJUHlPYmplY3QgKmZuYW1lID0gUHlTZXF1ZW5jZV9GYXN0X0dFVF9JVEVNKGFub25fbmFtZXMsIGkpOyAvKiBib3Jyb3dlZCAqLworCQlDRmllbGRPYmplY3QgKmRlc2NyID0gKENGaWVsZE9iamVjdCAqKVB5T2JqZWN0X0dldEF0dHIodHlwZSwgZm5hbWUpOworCQlpZiAoZGVzY3IgPT0gTlVMTCkgeworCQkJUHlfREVDUkVGKGFub25fbmFtZXMpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWFzc2VydChkZXNjci0+b2JfdHlwZSA9PSAmQ0ZpZWxkX1R5cGUpOworCQlkZXNjci0+YW5vbnltb3VzID0gMTsKKworCQkvKiBkZXNjciBpcyBpbiB0aGUgZmllbGQgZGVzY3JpcHRvci4gKi8KKwkJaWYgKC0xID09IE1ha2VGaWVsZHModHlwZSwgKENGaWVsZE9iamVjdCAqKWRlc2NyLAorCQkJCSAgICAgKChDRmllbGRPYmplY3QgKilkZXNjciktPmluZGV4LAorCQkJCSAgICAgKChDRmllbGRPYmplY3QgKilkZXNjciktPm9mZnNldCkpIHsKKwkJCVB5X0RFQ1JFRihkZXNjcik7CisJCQlQeV9ERUNSRUYoYW5vbl9uYW1lcyk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJUHlfREVDUkVGKGRlc2NyKTsKKwl9CisKKwlQeV9ERUNSRUYoYW5vbl9uYW1lcyk7CisJcmV0dXJuIDA7Cit9CiAKIC8qCiAgIFJldHJpdmUgdGhlIChvcHRpb25hbCkgX3BhY2tfIGF0dHJpYnV0ZSBmcm9tIGEgdHlwZSwgdGhlIF9maWVsZHNfIGF0dHJpYnV0ZSwKQEAgLTM2Niw1ICs0NzYsNSBAQAogCXN0Z2RpY3QtPnNpemUgPSBzaXplOwogCXN0Z2RpY3QtPmFsaWduID0gdG90YWxfYWxpZ247CiAJc3RnZGljdC0+bGVuZ3RoID0gbGVuOwkvKiBBREQgZmZpX29mcz8gKi8KLQlyZXR1cm4gMDsKKwlyZXR1cm4gTWFrZUFub25GaWVsZHModHlwZSk7CiB9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL19jdXJzZXNtb2R1bGUuYyBiL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCmluZGV4IDcxZDdhNjkuLmVjNTVjOGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCisrKyBiL01vZHVsZXMvX2N1cnNlc21vZHVsZS5jCkBAIC00Myw4ICs0Myw4IEBACiAJZGVsX2N1cnRlcm0gZGVsc2NyZWVuIGR1cHdpbiBpbmNobnN0ciBpbmNoc3RyIGlubnN0ciBrZXlvawogCW1jcHJpbnQgbXZhZGRjaG5zdHIgbXZhZGRjaHN0ciBtdmNoZ2F0IG12Y3VyIG12aW5jaG5zdHIKIAltdmluY2hzdHIgbXZpbm5zdHIgbW12d2FkZGNobnN0ciBtdndhZGRjaHN0ciBtdndjaGdhdAotCW12d2dldG5zdHIgbXZ3aW5jaG5zdHIgbXZ3aW5jaHN0ciBtdndpbm5zdHIgbmV3dGVybQotCXJlc2l6ZXRlcm0gcmVzdGFydHRlcm0gcmlwb2ZmbGluZSBzY3JfZHVtcAorCW12d2luY2huc3RyIG12d2luY2hzdHIgbXZ3aW5uc3RyIG5ld3Rlcm0KKwlyZXN0YXJ0dGVybSByaXBvZmZsaW5lIHNjcl9kdW1wCiAJc2NyX2luaXQgc2NyX3Jlc3RvcmUgc2NyX3NldCBzY3JsIHNldF9jdXJ0ZXJtIHNldF90ZXJtIHNldHRlcm0KIAl0Z2V0ZW50IHRnZXRmbGFnIHRnZXRudW0gdGdldHN0ciB0Z290byB0aW1lb3V0IHRwdXRzCiAJdmlkYXR0ciB2aWRwdXRzIHdhZGRjaG5zdHIgd2FkZGNoc3RyIHdjaGdhdApAQCAtODE5LDE0ICs4MTksMTcgQEAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiaWk7eSx4IiwmeSwmeCkpCiAgICAgICByZXR1cm4gTlVMTDsKICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCisjaWZkZWYgU1RSSUNUX1NZU1ZfQ1VSU0VTCisgICAgcnRuMiA9IHdtb3ZlKHNlbGYtPndpbix5LHgpPT1FUlIgPyBFUlIgOiB3Z2V0bnN0cihzZWxmLT53aW4sIHJ0biwgMTAyMyk7CisjZWxzZQogICAgIHJ0bjIgPSBtdndnZXRuc3RyKHNlbGYtPndpbix5LHgscnRuLCAxMDIzKTsKKyNlbmRpZgogICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgYnJlYWs7CiAgIGNhc2UgMzoKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiaWlpO3kseCxuIiwgJnksICZ4LCAmbikpCiAgICAgICByZXR1cm4gTlVMTDsKICNpZmRlZiBTVFJJQ1RfU1lTVl9DVVJTRVMKLSAvKiBVbnRlc3RlZCAqLwogICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICBydG4yID0gd21vdmUoc2VsZi0+d2luLHkseCk9PUVSUiA/IEVSUiA6CiAgICAgICB3Z2V0bnN0cihzZWxmLT53aW4sIHJ0biwgTUlOKG4sIDEwMjMpKTsKQEAgLTgzOCw3ICs4NDEsNyBAQAogI2VuZGlmCiAgICAgYnJlYWs7CiAgIGRlZmF1bHQ6Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdldHN0ciByZXF1aXJlcyAwIHRvIDIgYXJndW1lbnRzIik7CisgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImdldHN0ciByZXF1aXJlcyAwIHRvIDMgYXJndW1lbnRzIik7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KICAgaWYgKHJ0bjIgPT0gRVJSKQpAQCAtMTk1MCw2ICsxOTUzLDI5IEBACiAgIHJldHVybiBQeUN1cnNlc0NoZWNrRVJSKGludHJmbHVzaChOVUxMLGNoKSwgImludHJmbHVzaCIpOwogfQogCisjaWZkZWYgSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVECitzdGF0aWMgUHlPYmplY3QgKgorUHlDdXJzZXNfSXNfVGVybV9SZXNpemVkKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKyAgaW50IGxpbmVzOworICBpbnQgY29sdW1uczsKKyAgaW50IHJlc3VsdDsKKworICBQeUN1cnNlc0luaXRpYWxpc2VkCisKKyAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsImlpOmlzX3Rlcm1fcmVzaXplZCIsICZsaW5lcywgJmNvbHVtbnMpKQorICAgIHJldHVybiBOVUxMOworICByZXN1bHQgPSBpc190ZXJtX3Jlc2l6ZWQobGluZXMsIGNvbHVtbnMpOworICBpZiAocmVzdWx0ID09IFRSVUUpIHsKKyAgICBQeV9JTkNSRUYoUHlfVHJ1ZSk7CisgICAgcmV0dXJuIFB5X1RydWU7CisgIH0gZWxzZSB7CisgICAgUHlfSU5DUkVGKFB5X0ZhbHNlKTsKKyAgICByZXR1cm4gUHlfRmFsc2U7CisgIH0KK30KKyNlbmRpZiAvKiBIQVZFX0NVUlNFU19JU19URVJNX1JFU0laRUQgKi8KKwogI2lmICFkZWZpbmVkKF9fTmV0QlNEX18pCiBzdGF0aWMgUHlPYmplY3QgKgogUHlDdXJzZXNfS2V5TmFtZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCkBAIC0yMTcwLDYgKzIxOTYsMzkgQEAKICAgfQogfQogCisjaWZkZWYgSEFWRV9DVVJTRVNfUkVTSVpFVEVSTQorc3RhdGljIFB5T2JqZWN0ICoKK1B5Q3Vyc2VzX1Jlc2l6ZVRlcm0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICBpbnQgbGluZXM7CisgIGludCBjb2x1bW5zOworCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQKKworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiaWk6cmVzaXpldGVybSIsICZsaW5lcywgJmNvbHVtbnMpKQorICAgIHJldHVybiBOVUxMOworCisgIHJldHVybiBQeUN1cnNlc0NoZWNrRVJSKHJlc2l6ZXRlcm0obGluZXMsIGNvbHVtbnMpLCAicmVzaXpldGVybSIpOworfQorCisjZW5kaWYKKworI2lmZGVmIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNCitzdGF0aWMgUHlPYmplY3QgKgorUHlDdXJzZXNfUmVzaXplX1Rlcm0oUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQoreworICBpbnQgbGluZXM7CisgIGludCBjb2x1bW5zOworCisgIFB5Q3Vyc2VzSW5pdGlhbGlzZWQKKworICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywiaWk6cmVzaXplX3Rlcm0iLCAmbGluZXMsICZjb2x1bW5zKSkKKyAgICByZXR1cm4gTlVMTDsKKworICByZXR1cm4gUHlDdXJzZXNDaGVja0VSUihyZXNpemVfdGVybShsaW5lcywgY29sdW1ucyksICJyZXNpemVfdGVybSIpOworfQorI2VuZGlmIC8qIEhBVkVfQ1VSU0VTX1JFU0laRV9URVJNICovCisKIHN0YXRpYyBQeU9iamVjdCAqCiBQeUN1cnNlc19zZXRzeXgoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewpAQCAtMjQxNCw2ICsyNDczLDkgQEAKICAgeyJpbml0c2NyIiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX0luaXRTY3IsIE1FVEhfTk9BUkdTfSwKICAgeyJpbnRyZmx1c2giLCAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX0ludHJGbHVzaCwgTUVUSF9WQVJBUkdTfSwKICAgeyJpc2VuZHdpbiIsICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX2lzZW5kd2luLCBNRVRIX05PQVJHU30sCisjaWZkZWYgSEFWRV9DVVJTRVNfSVNfVEVSTV9SRVNJWkVECisgIHsiaXNfdGVybV9yZXNpemVkIiwgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19Jc19UZXJtX1Jlc2l6ZWQsIE1FVEhfVkFSQVJHU30sCisjZW5kaWYKICNpZiAhZGVmaW5lZChfX05ldEJTRF9fKQogICB7ImtleW5hbWUiLCAgICAgICAgICAgICAoUHlDRnVuY3Rpb24pUHlDdXJzZXNfS2V5TmFtZSwgTUVUSF9WQVJBUkdTfSwKICNlbmRpZgpAQCAtMjQ0MSw2ICsyNTAzLDEyIEBACiAgIHsicmVzZXRfcHJvZ19tb2RlIiwgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19yZXNldF9wcm9nX21vZGUsIE1FVEhfTk9BUkdTfSwKICAgeyJyZXNldF9zaGVsbF9tb2RlIiwgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX3Jlc2V0X3NoZWxsX21vZGUsIE1FVEhfTk9BUkdTfSwKICAgeyJyZXNldHR5IiwgICAgICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX3Jlc2V0dHksIE1FVEhfTk9BUkdTfSwKKyNpZmRlZiBIQVZFX0NVUlNFU19SRVNJWkVURVJNCisgIHsicmVzaXpldGVybSIsICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19SZXNpemVUZXJtLCBNRVRIX1ZBUkFSR1N9LAorI2VuZGlmCisjaWZkZWYgSEFWRV9DVVJTRVNfUkVTSVpFX1RFUk0KKyAgeyJyZXNpemVfdGVybSIsICAgICAgICAgKFB5Q0Z1bmN0aW9uKVB5Q3Vyc2VzX1Jlc2l6ZV9UZXJtLCBNRVRIX1ZBUkFSR1N9LAorI2VuZGlmCiAgIHsic2F2ZXR0eSIsICAgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19zYXZldHR5LCBNRVRIX05PQVJHU30sCiAgIHsic2V0c3l4IiwgICAgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19zZXRzeXgsIE1FVEhfVkFSQVJHU30sCiAgIHsic2V0dXB0ZXJtIiwgICAgICAgICAgIChQeUNGdW5jdGlvbilQeUN1cnNlc19zZXR1cHRlcm0sCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jIGIvTW9kdWxlcy9fZWxlbWVudHRyZWUuYwppbmRleCBkZGE1MDQyLi5mZTMwZjMwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19lbGVtZW50dHJlZS5jCisrKyBiL01vZHVsZXMvX2VsZW1lbnR0cmVlLmMKQEAgLTcxNyw3ICs3MTcsOCBAQAogTE9DQUwoaW50KQogY2hlY2twYXRoKFB5T2JqZWN0KiB0YWcpCiB7Ci0gICAgaW50IGksIGNoZWNrID0gMTsKKyAgICBQeV9zc2l6ZV90IGk7CisgICAgaW50IGNoZWNrID0gMTsKIAogICAgIC8qIGNoZWNrIGlmIGEgdGFnIGNvbnRhaW5zIGFuIHhwYXRoIGNoYXJhY3RlciAqLwogCkBAIC0xMTgwLDcgKzExODEsNyBAQAogZWxlbWVudF9zZXRzbGljZShQeU9iamVjdCogc2VsZl8sIFB5X3NzaXplX3Qgc3RhcnQsIFB5X3NzaXplX3QgZW5kLCBQeU9iamVjdCogaXRlbSkKIHsKICAgICBFbGVtZW50T2JqZWN0KiBzZWxmID0gKEVsZW1lbnRPYmplY3QqKSBzZWxmXzsKLSAgICBpbnQgaSwgbmV3LCBvbGQ7CisgICAgUHlfc3NpemVfdCBpLCBuZXcsIG9sZDsKICAgICBQeU9iamVjdCogcmVjeWNsZSA9IE5VTEw7CiAKICAgICBpZiAoIXNlbGYtPmV4dHJhKQpAQCAtMTQyNiw3ICsxNDI3LDcgQEAKICAgICBQeU9iamVjdCogZGF0YTsgLyogZGF0YSBjb2xsZWN0b3IgKHN0cmluZyBvciBsaXN0KSwgb3IgTlVMTCAqLwogCiAgICAgUHlPYmplY3QqIHN0YWNrOyAvKiBlbGVtZW50IHN0YWNrICovCi0gICAgaW50IGluZGV4OyAvKiBjdXJyZW50IHN0YWNrIHNpemUgKDA9ZW1wdHkpICovCisgICAgUHlfc3NpemVfdCBpbmRleDsgLyogY3VycmVudCBzdGFjayBzaXplICgwPWVtcHR5KSAqLwogCiAgICAgLyogZWxlbWVudCB0cmFjaW5nICovCiAgICAgUHlPYmplY3QqIGV2ZW50czsgLyogbGlzdCBvZiBldmVudHMsIG9yIE5VTEwgaWYgbm90IGNvbGxlY3RpbmcgKi8KQEAgLTE2MDYsNyArMTYwNyw3IEBACiAgICAgICAgICAgICBQeVN0cmluZ19DaGVja0V4YWN0KGRhdGEpICYmIFB5U3RyaW5nX0dFVF9TSVpFKGRhdGEpID09IDEpIHsKICAgICAgICAgICAgIC8qIGV4cGF0IG9mdGVuIGdlbmVyYXRlcyBzaW5nbGUgY2hhcmFjdGVyIGRhdGEgc2VjdGlvbnM7IGhhbmRsZQogICAgICAgICAgICAgICAgdGhlIG1vc3QgY29tbW9uIGNhc2UgYnkgcmVzaXppbmcgdGhlIGV4aXN0aW5nIHN0cmluZy4uLiAqLwotICAgICAgICAgICAgaW50IHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShzZWxmLT5kYXRhKTsKKyAgICAgICAgICAgIFB5X3NzaXplX3Qgc2l6ZSA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYtPmRhdGEpOwogICAgICAgICAgICAgaWYgKF9QeVN0cmluZ19SZXNpemUoJnNlbGYtPmRhdGEsIHNpemUgKyAxKSA8IDApCiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcoc2VsZi0+ZGF0YSlbc2l6ZV0gPSBQeVN0cmluZ19BU19TVFJJTkcoZGF0YSlbMF07CkBAIC0xOTg4LDcgKzE5ODksNyBAQAogICAgICAgICBQeV9YREVDUkVGKHJlcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgICAgUHlFeGNfU3ludGF4RXJyb3IsICJ1bmRlZmluZWQgZW50aXR5ICYlczs6IGxpbmUgJWQsIGNvbHVtbiAlZCIsCisgICAgICAgICAgICBQeUV4Y19TeW50YXhFcnJvciwgInVuZGVmaW5lZCBlbnRpdHkgJiVzOzogbGluZSAlbGQsIGNvbHVtbiAlbGQiLAogICAgICAgICAgICAgUHlTdHJpbmdfQVNfU1RSSU5HKGtleSksCiAgICAgICAgICAgICBFWFBBVChHZXRFcnJvckxpbmVOdW1iZXIpKHNlbGYtPnBhcnNlciksCiAgICAgICAgICAgICBFWFBBVChHZXRFcnJvckNvbHVtbk51bWJlcikoc2VsZi0+cGFyc2VyKQpAQCAtMjM0OSw3ICsyMzUwLDcgQEAKIAogICAgIGlmICghb2spIHsKICAgICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgICAgUHlFeGNfU3ludGF4RXJyb3IsICIlczogbGluZSAlZCwgY29sdW1uICVkIiwKKyAgICAgICAgICAgIFB5RXhjX1N5bnRheEVycm9yLCAiJXM6IGxpbmUgJWxkLCBjb2x1bW4gJWxkIiwKICAgICAgICAgICAgIEVYUEFUKEVycm9yU3RyaW5nKShFWFBBVChHZXRFcnJvckNvZGUpKHNlbGYtPnBhcnNlcikpLAogICAgICAgICAgICAgRVhQQVQoR2V0RXJyb3JMaW5lTnVtYmVyKShzZWxmLT5wYXJzZXIpLAogICAgICAgICAgICAgRVhQQVQoR2V0RXJyb3JDb2x1bW5OdW1iZXIpKHNlbGYtPnBhcnNlcikKQEAgLTI0NTYsNyArMjQ1Nyw3IEBACiB7CiAgICAgLyogYWN0aXZhdGUgZWxlbWVudCBldmVudCByZXBvcnRpbmcgKi8KIAotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKICAgICBUcmVlQnVpbGRlck9iamVjdCogdGFyZ2V0OwogCiAgICAgUHlPYmplY3QqIGV2ZW50czsgLyogZXZlbnQgY29sbGVjdG9yICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19ob3RzaG90LmMgYi9Nb2R1bGVzL19ob3RzaG90LmMKaW5kZXggNWE4MWJmYi4uNmQ5Nzc2ZiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9faG90c2hvdC5jCisrKyBiL01vZHVsZXMvX2hvdHNob3QuYwpAQCAtMTQsNyArMTQsMTEgQEAKICAqLwogI2lmZGVmIE1TX1dJTkRPV1MKICNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNpZmRlZiBIQVZFX0RJUkVDVF9ICiAjaW5jbHVkZSA8ZGlyZWN0Lmg+ICAgIC8qIGZvciBnZXRjd2QoKSAqLworI2VuZGlmCisKIHR5cGVkZWYgX19pbnQ2NCBoc190aW1lOwogI2RlZmluZSBHRVRUSU1FT0ZEQVkoUF9IU19USU1FKSBcCiAJeyBMQVJHRV9JTlRFR0VSIF90ZW1wOyBcCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19sb2NhbGVtb2R1bGUuYyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCmluZGV4IGMwMTZjZDcuLmFiZmNhNGUgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCisrKyBiL01vZHVsZXMvX2xvY2FsZW1vZHVsZS5jCkBAIC0xNiw3ICsxNiw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAotI2lmbmRlZiBET05UX0hBVkVfRVJSTk9fSAorI2lmZGVmIEhBVkVfRVJSTk9fSAogI2luY2x1ZGUgPGVycm5vLmg+CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYyBiL01vZHVsZXMvX3NxbGl0ZS9jb25uZWN0aW9uLmMKaW5kZXggNjRlNDNlYi4uNzAzYWYxNSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL2Nvbm5lY3Rpb24uYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY29ubmVjdGlvbi5jCkBAIC0zNCw2ICszNCwxOSBAQAogCiBzdGF0aWMgaW50IGNvbm5lY3Rpb25fc2V0X2lzb2xhdGlvbl9sZXZlbChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogaXNvbGF0aW9uX2xldmVsKTsKIAorCit2b2lkIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihzcWxpdGUzX2NvbnRleHQqIGN0eCwgY29uc3QgY2hhciogZXJybXNnLCBpbnQgbGVuKQoreworICAgIC8qIGluIG9sZGVyIFNRTGl0ZSB2ZXJzaW9ucywgY2FsbGluZyBzcWxpdGUzX3Jlc3VsdF9lcnJvciBpbiBjYWxsYmFja3MKKyAgICAgKiB0cmlnZ2VycyBhIGJ1ZyBpbiBTUUxpdGUgdGhhdCBsZWFkcyBlaXRoZXIgdG8gaXJyaXRhdGluZyByZXN1bHRzIG9yCisgICAgICogc2VnZmF1bHRzLCBkZXBlbmRpbmcgb24gdGhlIFNRTGl0ZSB2ZXJzaW9uICovCisjaWYgU1FMSVRFX1ZFUlNJT05fTlVNQkVSID49IDMwMDMwMDMKKyAgICBzcWxpdGUzX3Jlc3VsdF9lcnJvcihjdHgsIGVycm1zZywgbGVuKTsKKyNlbHNlCisgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsIGVycm1zZyk7CisjZW5kaWYKK30KKwogaW50IGNvbm5lY3Rpb25faW5pdChDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKIHsKICAgICBzdGF0aWMgY2hhciAqa3dsaXN0W10gPSB7ImRhdGFiYXNlIiwgInRpbWVvdXQiLCAiZGV0ZWN0X3R5cGVzIiwgImlzb2xhdGlvbl9sZXZlbCIsICJjaGVja19zYW1lX3RocmVhZCIsICJmYWN0b3J5IiwgImNhY2hlZF9zdGF0ZW1lbnRzIiwgTlVMTCwgTlVMTH07CkBAIC00MDUsOCArNDE4LDYgQEAKICAgICBQeU9iamVjdCogc3RyaW5ndmFsOwogCiAgICAgaWYgKCghcHlfdmFsKSB8fCBQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgIC8qIEVycm9ycyBpbiBjYWxsYmFja3MgYXJlIGlnbm9yZWQsIGFuZCB3ZSByZXR1cm4gTlVMTCAqLwotICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICBzcWxpdGUzX3Jlc3VsdF9udWxsKGNvbnRleHQpOwogICAgIH0gZWxzZSBpZiAocHlfdmFsID09IFB5X05vbmUpIHsKICAgICAgICAgc3FsaXRlM19yZXN1bHRfbnVsbChjb250ZXh0KTsKQEAgLTUxOSw4ICs1MzAsMTcgQEAKICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOwogICAgIH0KIAotICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIHB5X3JldHZhbCk7Ci0gICAgUHlfWERFQ1JFRihweV9yZXR2YWwpOworICAgIGlmIChweV9yZXR2YWwpIHsKKyAgICAgICAgX3NldF9yZXN1bHQoY29udGV4dCwgcHlfcmV0dmFsKTsKKyAgICAgICAgUHlfREVDUkVGKHB5X3JldHZhbCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgeworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgZnVuY3Rpb24gcmFpc2VkIGV4Y2VwdGlvbiIsIC0xKTsKKyAgICB9CiAKICAgICBQeUdJTFN0YXRlX1JlbGVhc2UodGhyZWFkc3RhdGUpOwogfQpAQCAtNTQ1LDggKzU2NSwxMyBAQAogICAgICAgICAqYWdncmVnYXRlX2luc3RhbmNlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKGFnZ3JlZ2F0ZV9jbGFzcywgIiIpOwogCiAgICAgICAgIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwogICAgICAgICAgICAgKmFnZ3JlZ2F0ZV9pbnN0YW5jZSA9IDA7CisgICAgICAgICAgICBpZiAoX2VuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzKSB7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdfX2luaXRfXycgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICB9CkBAIC01NjUsNyArNTkwLDEyIEBACiAgICAgUHlfREVDUkVGKGFyZ3MpOwogCiAgICAgaWYgKCFmdW5jdGlvbl9yZXN1bHQpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgeworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgX3NxbGl0ZTNfcmVzdWx0X2Vycm9yKGNvbnRleHQsICJ1c2VyLWRlZmluZWQgYWdncmVnYXRlJ3MgJ3N0ZXAnIG1ldGhvZCByYWlzZWQgZXJyb3IiLCAtMSk7CiAgICAgfQogCiBlcnJvcjoKQEAgLTU5NywxMyArNjI3LDE2IEBACiAKICAgICBmdW5jdGlvbl9yZXN1bHQgPSBQeU9iamVjdF9DYWxsTWV0aG9kKCphZ2dyZWdhdGVfaW5zdGFuY2UsICJmaW5hbGl6ZSIsICIiKTsKICAgICBpZiAoIWZ1bmN0aW9uX3Jlc3VsdCkgewotICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7Ci0gICAgICAgIGZ1bmN0aW9uX3Jlc3VsdCA9IFB5X05vbmU7CisgICAgICAgIGlmIChfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpIHsKKyAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICB9CisgICAgICAgIF9zcWxpdGUzX3Jlc3VsdF9lcnJvcihjb250ZXh0LCAidXNlci1kZWZpbmVkIGFnZ3JlZ2F0ZSdzICdmaW5hbGl6ZScgbWV0aG9kIHJhaXNlZCBlcnJvciIsIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfc2V0X3Jlc3VsdChjb250ZXh0LCBmdW5jdGlvbl9yZXN1bHQpOwogICAgIH0KIAotICAgIF9zZXRfcmVzdWx0KGNvbnRleHQsIGZ1bmN0aW9uX3Jlc3VsdCk7Ci0KIGVycm9yOgogICAgIFB5X1hERUNSRUYoKmFnZ3JlZ2F0ZV9pbnN0YW5jZSk7CiAgICAgUHlfWERFQ1JFRihmdW5jdGlvbl9yZXN1bHQpOwpAQCAtNjMxLDcgKzY2NCw3IEBACiAKICAgICBmb3IgKGkgPSAwOyBpIDwgUHlMaXN0X1NpemUoc2VsZi0+c3RhdGVtZW50cyk7IGkrKykgewogICAgICAgICB3ZWFrcmVmID0gUHlMaXN0X0dldEl0ZW0oc2VsZi0+c3RhdGVtZW50cywgaSk7Ci0gICAgICAgIGlmICh3ZWFrcmVmICE9IFB5X05vbmUpIHsKKyAgICAgICAgaWYgKFB5V2Vha3JlZl9HZXRPYmplY3Qod2Vha3JlZikgIT0gUHlfTm9uZSkgewogICAgICAgICAgICAgaWYgKFB5TGlzdF9BcHBlbmQobmV3X2xpc3QsIHdlYWtyZWYpICE9IDApIHsKICAgICAgICAgICAgICAgICBQeV9ERUNSRUYobmV3X2xpc3QpOwogICAgICAgICAgICAgICAgIHJldHVybjsKQEAgLTY5OSw2ICs3MzIsNjEgQEAKICAgICB9CiB9CiAKK2ludCBfYXV0aG9yaXplcl9jYWxsYmFjayh2b2lkKiB1c2VyX2FyZywgaW50IGFjdGlvbiwgY29uc3QgY2hhciogYXJnMSwgY29uc3QgY2hhciogYXJnMiAsIGNvbnN0IGNoYXIqIGRibmFtZSwgY29uc3QgY2hhciogYWNjZXNzX2F0dGVtcHRfc291cmNlKQoreworICAgIFB5T2JqZWN0ICpyZXQ7CisgICAgaW50IHJjOworICAgIFB5R0lMU3RhdGVfU1RBVEUgZ2lsc3RhdGU7CisKKyAgICBnaWxzdGF0ZSA9IFB5R0lMU3RhdGVfRW5zdXJlKCk7CisgICAgcmV0ID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCopdXNlcl9hcmcsICJpc3NzcyIsIGFjdGlvbiwgYXJnMSwgYXJnMiwgZGJuYW1lLCBhY2Nlc3NfYXR0ZW1wdF9zb3VyY2UpOworCisgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgeworICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICByYyA9IFNRTElURV9ERU5ZOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChQeUludF9DaGVjayhyZXQpKSB7CisgICAgICAgICAgICByYyA9IChpbnQpUHlJbnRfQXNMb25nKHJldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByYyA9IFNRTElURV9ERU5ZOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyZXQpOworICAgIH0KKworICAgIFB5R0lMU3RhdGVfUmVsZWFzZShnaWxzdGF0ZSk7CisgICAgcmV0dXJuIHJjOworfQorCitQeU9iamVjdCogY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplcihDb25uZWN0aW9uKiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykKK3sKKyAgICBQeU9iamVjdCogYXV0aG9yaXplcl9jYjsKKworICAgIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsgImF1dGhvcml6ZXJfY2FsbGJhY2siLCBOVUxMIH07CisgICAgaW50IHJjOworCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAiTzpzZXRfYXV0aG9yaXplciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt3bGlzdCwgJmF1dGhvcml6ZXJfY2IpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHJjID0gc3FsaXRlM19zZXRfYXV0aG9yaXplcihzZWxmLT5kYiwgX2F1dGhvcml6ZXJfY2FsbGJhY2ssICh2b2lkKilhdXRob3JpemVyX2NiKTsKKworICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKE9wZXJhdGlvbmFsRXJyb3IsICJFcnJvciBzZXR0aW5nIGF1dGhvcml6ZXIgY2FsbGJhY2siKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+ZnVuY3Rpb25fcGluYm9hcmQsIGF1dGhvcml6ZXJfY2IsIFB5X05vbmUpOworCisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgfQorfQorCiBpbnQgY2hlY2tfdGhyZWFkKENvbm5lY3Rpb24qIHNlbGYpCiB7CiAgICAgaWYgKHNlbGYtPmNoZWNrX3NhbWVfdGhyZWFkKSB7CkBAIC05NzUsNiArMTA2MywyNCBAQAogfQogCiBzdGF0aWMgUHlPYmplY3QgKgorY29ubmVjdGlvbl9pbnRlcnJ1cHQoQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCit7CisgICAgUHlPYmplY3QqIHJldHZhbCA9IE5VTEw7CisKKyAgICBpZiAoIWNoZWNrX2Nvbm5lY3Rpb24oc2VsZikpIHsKKyAgICAgICAgZ290byBmaW5hbGx5OworICAgIH0KKworICAgIHNxbGl0ZTNfaW50ZXJydXB0KHNlbGYtPmRiKTsKKworICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICByZXR2YWwgPSBQeV9Ob25lOworCitmaW5hbGx5OgorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCAqCiBjb25uZWN0aW9uX2NyZWF0ZV9jb2xsYXRpb24oQ29ubmVjdGlvbiogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7CiAgICAgUHlPYmplY3QqIGNhbGxhYmxlOwpAQCAtMTA2Nyw2ICsxMTczLDggQEAKICAgICAgICAgUHlEb2NfU1RSKCJDcmVhdGVzIGEgbmV3IGZ1bmN0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiY3JlYXRlX2FnZ3JlZ2F0ZSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2NyZWF0ZV9hZ2dyZWdhdGUsIE1FVEhfVkFSQVJHU3xNRVRIX0tFWVdPUkRTLAogICAgICAgICBQeURvY19TVFIoIkNyZWF0ZXMgYSBuZXcgYWdncmVnYXRlLiBOb24tc3RhbmRhcmQuIil9LAorICAgIHsic2V0X2F1dGhvcml6ZXIiLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9zZXRfYXV0aG9yaXplciwgTUVUSF9WQVJBUkdTfE1FVEhfS0VZV09SRFMsCisgICAgICAgIFB5RG9jX1NUUigiU2V0cyBhdXRob3JpemVyIGNhbGxiYWNrLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHsiZXhlY3V0ZSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2V4ZWN1dGUsIE1FVEhfVkFSQVJHUywKICAgICAgICAgUHlEb2NfU1RSKCJFeGVjdXRlcyBhIFNRTCBzdGF0ZW1lbnQuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJleGVjdXRlbWFueSIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2V4ZWN1dGVtYW55LCBNRVRIX1ZBUkFSR1MsCkBAIC0xMDc1LDYgKzExODMsOCBAQAogICAgICAgICBQeURvY19TVFIoIkV4ZWN1dGVzIGEgbXVsdGlwbGUgU1FMIHN0YXRlbWVudHMgYXQgb25jZS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7ImNyZWF0ZV9jb2xsYXRpb24iLCAoUHlDRnVuY3Rpb24pY29ubmVjdGlvbl9jcmVhdGVfY29sbGF0aW9uLCBNRVRIX1ZBUkFSR1MsCiAgICAgICAgIFB5RG9jX1NUUigiQ3JlYXRlcyBhIGNvbGxhdGlvbiBmdW5jdGlvbi4gTm9uLXN0YW5kYXJkLiIpfSwKKyAgICB7ImludGVycnVwdCIsIChQeUNGdW5jdGlvbiljb25uZWN0aW9uX2ludGVycnVwdCwgTUVUSF9OT0FSR1MsCisgICAgICAgIFB5RG9jX1NUUigiQWJvcnQgYW55IHBlbmRpbmcgZGF0YWJhc2Ugb3BlcmF0aW9uLiBOb24tc3RhbmRhcmQuIil9LAogICAgIHtOVUxMLCBOVUxMfQogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jIGIvTW9kdWxlcy9fc3FsaXRlL2N1cnNvci5jCmluZGV4IDk1YTQ5MzEuLmEyZDNjZjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9jdXJzb3IuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvY3Vyc29yLmMKQEAgLTEzNyw2ICsxMzcsMjIgQEAKICAgICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKChQeU9iamVjdCopc2VsZik7CiB9CiAKK1B5T2JqZWN0KiBfZ2V0X2NvbnZlcnRlcihQeU9iamVjdCoga2V5KQoreworICAgIFB5T2JqZWN0KiB1cGNhc2Vfa2V5OworICAgIFB5T2JqZWN0KiByZXR2YWw7CisKKyAgICB1cGNhc2Vfa2V5ID0gUHlPYmplY3RfQ2FsbE1ldGhvZChrZXksICJ1cHBlciIsICIiKTsKKyAgICBpZiAoIXVwY2FzZV9rZXkpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dmFsID0gUHlEaWN0X0dldEl0ZW0oY29udmVydGVycywgdXBjYXNlX2tleSk7CisgICAgUHlfREVDUkVGKHVwY2FzZV9rZXkpOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKwogaW50IGJ1aWxkX3Jvd19jYXN0X21hcChDdXJzb3IqIHNlbGYpCiB7CiAgICAgaW50IGk7CkBAIC0xNzQsNyArMTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVyID0gUHlEaWN0X0dldEl0ZW0oY29udmVydGVycywga2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IF9nZXRfY29udmVydGVyKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xOTUsNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IFB5RGljdF9HZXRJdGVtKGNvbnZlcnRlcnMsIHB5X2RlY2x0eXBlKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIgPSBfZ2V0X2NvbnZlcnRlcihweV9kZWNsdHlwZSk7CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKHB5X2RlY2x0eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjI4LDcgKzI0NCwxMCBAQAogICAgIH0KIAogICAgIGZvciAocG9zID0gY29sbmFtZTs7IHBvcysrKSB7Ci0gICAgICAgIGlmICgqcG9zID09IDAgfHwgKnBvcyA9PSAnICcpIHsKKyAgICAgICAgaWYgKCpwb3MgPT0gMCB8fCAqcG9zID09ICdbJykgeworICAgICAgICAgICAgaWYgKCgqcG9zID09ICdbJykgJiYgKHBvcyA+IGNvbG5hbWUpICYmICgqKHBvcy0xKSA9PSAnICcpKSB7CisgICAgICAgICAgICAgICAgcG9zLS07CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoY29sbmFtZSwgcG9zIC0gY29sbmFtZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMDIsMjMgKzMyMSwyMSBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBQeV9Ob25lKSB7Ci0gICAgICAgICAgICB2YWxfc3RyID0gKGNvbnN0IGNoYXIqKXNxbGl0ZTNfY29sdW1uX3RleHQoc2VsZi0+c3RhdGVtZW50LT5zdCwgaSk7CisgICAgICAgICAgICBuYnl0ZXMgPSBzcWxpdGUzX2NvbHVtbl9ieXRlcyhzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKKyAgICAgICAgICAgIHZhbF9zdHIgPSAoY29uc3QgY2hhciopc3FsaXRlM19jb2x1bW5fYmxvYihzZWxmLT5zdGF0ZW1lbnQtPnN0LCBpKTsKICAgICAgICAgICAgIGlmICghdmFsX3N0cikgewogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKICAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBQeV9Ob25lOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWxfc3RyKTsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUodmFsX3N0ciwgbmJ5dGVzKTsKICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb252ZXJ0ZXIsICJPIiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLyogVE9ETzogaGF2ZSBhIHdheSB0byBsb2cgdGhlc2UgZXJyb3JzICovCi0gICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gUHlfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgUHlfREVDUkVGKGl0ZW0pOworICAgICAgICAgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKQEAgLTM0NiwxMCArMzYzLDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgPSBzcWxpdGUzX2NvbHVtbl9uYW1lKHNlbGYtPnN0YXRlbWVudC0+c3QsIGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29sbmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgPSAiPHVua25vd24gY29sdW1uIG5hbWU+IjsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIFB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSAtIDEsICJDb3VsZCBub3QgZGVjb2RlIHRvIFVURi04IGNvbHVtbiAlcyB3aXRoIHRleHQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpIC0gMSwgIkNvdWxkIG5vdCBkZWNvZGUgdG8gVVRGLTggY29sdW1uICclcycgd2l0aCB0ZXh0ICclcyciLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG5hbWUgLCB2YWxfc3RyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhPcGVyYXRpb25hbEVycm9yLCBidWYpOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0zNzMsNyArMzkwLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocm93LCBpLCBjb252ZXJ0ZWQpOworICAgICAgICBpZiAoY29udmVydGVkKSB7CisgICAgICAgICAgICBQeVR1cGxlX1NldEl0ZW0ocm93LCBpLCBjb252ZXJ0ZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgUHlUdXBsZV9TZXRJdGVtKHJvdywgaSwgUHlfTm9uZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewpAQCAtNTk4LDYgKzYyMCwxNCBAQAogICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogdGhlcmUgd2FzIGFuIGVycm9yIHRoYXQgb2NjdXJyZWQgaW4gYSB1c2VyLWRlZmluZWQgY2FsbGJhY2sgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgX3NldGVycm9yKHNlbGYtPmNvbm5lY3Rpb24tPmRiKTsKICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5jCmluZGV4IDcxZDBhYWEuLjYwNjQ1NGMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuYworKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmMKQEAgLTEsMjUgKzEsMjUgQEAKLS8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+Ci0gKgotICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCi0gKgotICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKLSAqIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKLSAqIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCi0gKgotICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCi0gKiBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0Ci0gKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6Ci0gKgotICogMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKLSAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCi0gKiAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKLSAqICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCi0gKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQotICogICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgotICogMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KLSAqLworICAgIC8qIG1vZHVsZS5jIC0gdGhlIG1vZHVsZSBpdHNlbGYKKyAgICAgKgorICAgICAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA2IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyAgICAgKgorICAgICAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorICAgICAqCisgICAgICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyAgICAgKiB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisgICAgICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyAgICAgKgorICAgICAqIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorICAgICAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyAgICAgKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisgICAgICoKKyAgICAgKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorICAgICAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisgICAgICogICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisgICAgICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyAgICAgKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorICAgICAqICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyAgICAgKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorICAgICAqLwogCiAjaW5jbHVkZSAiY29ubmVjdGlvbi5oIgogI2luY2x1ZGUgInN0YXRlbWVudC5oIgpAQCAtNDAsNiArNDAsNyBAQAogICAgICpOb3RTdXBwb3J0ZWRFcnJvciwgKk9wdGltaXplZFVuaWNvZGU7CiAKIFB5T2JqZWN0KiBjb252ZXJ0ZXJzOworaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsKIAogc3RhdGljIFB5T2JqZWN0KiBtb2R1bGVfY29ubmVjdChQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KgogICAgICAgICBrd2FyZ3MpCkBAIC0xNDAsMTQgKzE0MSw0MiBAQAogCiBzdGF0aWMgUHlPYmplY3QqIG1vZHVsZV9yZWdpc3Rlcl9jb252ZXJ0ZXIoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQogewotICAgIFB5T2JqZWN0KiBuYW1lOworICAgIGNoYXIqIG9yaWdfbmFtZTsKKyAgICBjaGFyKiBuYW1lID0gTlVMTDsKKyAgICBjaGFyKiBjOwogICAgIFB5T2JqZWN0KiBjYWxsYWJsZTsKKyAgICBQeU9iamVjdCogcmV0dmFsID0gTlVMTDsKIAotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT08iLCAmbmFtZSwgJmNhbGxhYmxlKSkgeworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAic08iLCAmb3JpZ19uYW1lLCAmY2FsbGFibGUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIGlmIChQeURpY3RfU2V0SXRlbShjb252ZXJ0ZXJzLCBuYW1lLCBjYWxsYWJsZSkgIT0gMCkgeworICAgIC8qIGNvbnZlcnQgdGhlIG5hbWUgdG8gbG93ZXJjYXNlICovCisgICAgbmFtZSA9IFB5TWVtX01hbGxvYyhzdHJsZW4ob3JpZ19uYW1lKSArIDIpOworICAgIGlmICghbmFtZSkgeworICAgICAgICBnb3RvIGVycm9yOworICAgIH0KKyAgICBzdHJjcHkobmFtZSwgb3JpZ19uYW1lKTsKKyAgICBmb3IgKGMgPSBuYW1lOyAqYyAhPSAoY2hhcikwOyBjKyspIHsKKyAgICAgICAgKmMgPSAoKmMpICYgMHhERjsKKyAgICB9CisKKyAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoY29udmVydGVycywgbmFtZSwgY2FsbGFibGUpICE9IDApIHsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgcmV0dmFsID0gUHlfTm9uZTsKK2Vycm9yOgorICAgIGlmIChuYW1lKSB7CisgICAgICAgIFB5TWVtX0ZyZWUobmFtZSk7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBQeU9iamVjdCogZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKQoreworICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiaSIsICZfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3MpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTc0LDEzICsyMDMsNjQgQEAKICAgICB7InJlZ2lzdGVyX2FkYXB0ZXIiLCAoUHlDRnVuY3Rpb24pbW9kdWxlX3JlZ2lzdGVyX2FkYXB0ZXIsIE1FVEhfVkFSQVJHUywgUHlEb2NfU1RSKCJSZWdpc3RlcnMgYW4gYWRhcHRlciB3aXRoIHB5c3FsaXRlJ3MgYWRhcHRlciByZWdpc3RyeS4gTm9uLXN0YW5kYXJkLiIpfSwKICAgICB7InJlZ2lzdGVyX2NvbnZlcnRlciIsIChQeUNGdW5jdGlvbiltb2R1bGVfcmVnaXN0ZXJfY29udmVydGVyLCBNRVRIX1ZBUkFSR1MsIFB5RG9jX1NUUigiUmVnaXN0ZXJzIGEgY29udmVydGVyIHdpdGggcHlzcWxpdGUuIE5vbi1zdGFuZGFyZC4iKX0sCiAgICAgeyJhZGFwdCIsICAoUHlDRnVuY3Rpb24pcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHQsIE1FVEhfVkFSQVJHUywgcHN5Y29fbWljcm9wcm90b2NvbHNfYWRhcHRfZG9jfSwKKyAgICB7ImVuYWJsZV9jYWxsYmFja190cmFjZWJhY2tzIiwgIChQeUNGdW5jdGlvbillbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcywgTUVUSF9WQVJBUkdTLCBQeURvY19TVFIoIkVuYWJsZSBvciBkaXNhYmxlIGNhbGxiYWNrIGZ1bmN0aW9ucyB0aHJvd2luZyBlcnJvcnMgdG8gc3RkZXJyLiIpfSwKICAgICB7TlVMTCwgTlVMTH0KIH07CiAKK3N0cnVjdCBfSW50Q29uc3RhbnRQYWlyIHsKKyAgICBjaGFyKiBjb25zdGFudF9uYW1lOworICAgIGludCBjb25zdGFudF92YWx1ZTsKK307CisKK3R5cGVkZWYgc3RydWN0IF9JbnRDb25zdGFudFBhaXIgSW50Q29uc3RhbnRQYWlyOworCitzdGF0aWMgSW50Q29uc3RhbnRQYWlyIF9pbnRfY29uc3RhbnRzW10gPSB7CisgICAgeyJQQVJTRV9ERUNMVFlQRVMiLCBQQVJTRV9ERUNMVFlQRVN9LAorICAgIHsiUEFSU0VfQ09MTkFNRVMiLCBQQVJTRV9DT0xOQU1FU30sCisKKyAgICB7IlNRTElURV9PSyIsIFNRTElURV9PS30sCisgICAgeyJTUUxJVEVfREVOWSIsIFNRTElURV9ERU5ZfSwKKyAgICB7IlNRTElURV9JR05PUkUiLCBTUUxJVEVfSUdOT1JFfSwKKyAgICB7IlNRTElURV9DUkVBVEVfSU5ERVgiLCBTUUxJVEVfQ1JFQVRFX0lOREVYfSwKKyAgICB7IlNRTElURV9DUkVBVEVfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RBQkxFfSwKKyAgICB7IlNRTElURV9DUkVBVEVfVEVNUF9JTkRFWCIsIFNRTElURV9DUkVBVEVfVEVNUF9JTkRFWH0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEUiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVEFCTEV9LAorICAgIHsiU1FMSVRFX0NSRUFURV9URU1QX1RSSUdHRVIiLCBTUUxJVEVfQ1JFQVRFX1RFTVBfVFJJR0dFUn0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1RFTVBfVklFVyIsIFNRTElURV9DUkVBVEVfVEVNUF9WSUVXfSwKKyAgICB7IlNRTElURV9DUkVBVEVfVFJJR0dFUiIsIFNRTElURV9DUkVBVEVfVFJJR0dFUn0sCisgICAgeyJTUUxJVEVfQ1JFQVRFX1ZJRVciLCBTUUxJVEVfQ1JFQVRFX1ZJRVd9LAorICAgIHsiU1FMSVRFX0RFTEVURSIsIFNRTElURV9ERUxFVEV9LAorICAgIHsiU1FMSVRFX0RST1BfSU5ERVgiLCBTUUxJVEVfRFJPUF9JTkRFWH0sCisgICAgeyJTUUxJVEVfRFJPUF9UQUJMRSIsIFNRTElURV9EUk9QX1RBQkxFfSwKKyAgICB7IlNRTElURV9EUk9QX1RFTVBfSU5ERVgiLCBTUUxJVEVfRFJPUF9URU1QX0lOREVYfSwKKyAgICB7IlNRTElURV9EUk9QX1RFTVBfVEFCTEUiLCBTUUxJVEVfRFJPUF9URU1QX1RBQkxFfSwKKyAgICB7IlNRTElURV9EUk9QX1RFTVBfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RFTVBfVFJJR0dFUn0sCisgICAgeyJTUUxJVEVfRFJPUF9URU1QX1ZJRVciLCBTUUxJVEVfRFJPUF9URU1QX1ZJRVd9LAorICAgIHsiU1FMSVRFX0RST1BfVFJJR0dFUiIsIFNRTElURV9EUk9QX1RSSUdHRVJ9LAorICAgIHsiU1FMSVRFX0RST1BfVklFVyIsIFNRTElURV9EUk9QX1ZJRVd9LAorICAgIHsiU1FMSVRFX0lOU0VSVCIsIFNRTElURV9JTlNFUlR9LAorICAgIHsiU1FMSVRFX1BSQUdNQSIsIFNRTElURV9QUkFHTUF9LAorICAgIHsiU1FMSVRFX1JFQUQiLCBTUUxJVEVfUkVBRH0sCisgICAgeyJTUUxJVEVfU0VMRUNUIiwgU1FMSVRFX1NFTEVDVH0sCisgICAgeyJTUUxJVEVfVFJBTlNBQ1RJT04iLCBTUUxJVEVfVFJBTlNBQ1RJT059LAorICAgIHsiU1FMSVRFX1VQREFURSIsIFNRTElURV9VUERBVEV9LAorICAgIHsiU1FMSVRFX0FUVEFDSCIsIFNRTElURV9BVFRBQ0h9LAorICAgIHsiU1FMSVRFX0RFVEFDSCIsIFNRTElURV9ERVRBQ0h9LAorI2lmIFNRTElURV9WRVJTSU9OX05VTUJFUiA+PSAzMDAyMDAxCisgICAgeyJTUUxJVEVfQUxURVJfVEFCTEUiLCBTUUxJVEVfQUxURVJfVEFCTEV9LAorICAgIHsiU1FMSVRFX1JFSU5ERVgiLCBTUUxJVEVfUkVJTkRFWH0sCisjZW5kaWYKKyNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMzAwMAorICAgIHsiU1FMSVRFX0FOQUxZWkUiLCBTUUxJVEVfQU5BTFlaRX0sCisjZW5kaWYKKyAgICB7KGNoYXIqKU5VTEwsIDB9Cit9OworCiBQeU1PRElOSVRfRlVOQyBpbml0X3NxbGl0ZTModm9pZCkKIHsKICAgICBQeU9iamVjdCAqbW9kdWxlLCAqZGljdDsKICAgICBQeU9iamVjdCAqdG1wX29iajsKKyAgICBpbnQgaTsKIAogICAgIG1vZHVsZSA9IFB5X0luaXRNb2R1bGUoIl9zcWxpdGUzIiwgbW9kdWxlX21ldGhvZHMpOwogCkBAIC0yNzYsMTcgKzM1NiwxNSBAQAogICAgIE9wdGltaXplZFVuaWNvZGUgPSAoUHlPYmplY3QqKSZQeUNlbGxfVHlwZTsKICAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiT3B0aW1pemVkVW5pY29kZSIsIE9wdGltaXplZFVuaWNvZGUpOwogCi0gICAgaWYgKCEodG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKFBBUlNFX0RFQ0xUWVBFUykpKSB7Ci0gICAgICAgIGdvdG8gZXJyb3I7CisgICAgLyogU2V0IGludGVnZXIgY29uc3RhbnRzICovCisgICAgZm9yIChpID0gMDsgX2ludF9jb25zdGFudHNbaV0uY29uc3RhbnRfbmFtZSAhPSAwOyBpKyspIHsKKyAgICAgICAgdG1wX29iaiA9IFB5SW50X0Zyb21Mb25nKF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X3ZhbHVlKTsKKyAgICAgICAgaWYgKCF0bXBfb2JqKSB7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsIF9pbnRfY29uc3RhbnRzW2ldLmNvbnN0YW50X25hbWUsIHRtcF9vYmopOworICAgICAgICBQeV9ERUNSRUYodG1wX29iaik7CiAgICAgfQotICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGRpY3QsICJQQVJTRV9ERUNMVFlQRVMiLCB0bXBfb2JqKTsKLSAgICBQeV9ERUNSRUYodG1wX29iaik7Ci0KLSAgICBpZiAoISh0bXBfb2JqID0gUHlJbnRfRnJvbUxvbmcoUEFSU0VfQ09MTkFNRVMpKSkgewotICAgICAgICBnb3RvIGVycm9yOwotICAgIH0KLSAgICBQeURpY3RfU2V0SXRlbVN0cmluZyhkaWN0LCAiUEFSU0VfQ09MTkFNRVMiLCB0bXBfb2JqKTsKLSAgICBQeV9ERUNSRUYodG1wX29iaik7CiAKICAgICBpZiAoISh0bXBfb2JqID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQWVNRTElURV9WRVJTSU9OKSkpIHsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTMwNiw2ICszODQsOCBAQAogICAgIC8qIGluaXRpYWxpemUgdGhlIGRlZmF1bHQgY29udmVydGVycyAqLwogICAgIGNvbnZlcnRlcnNfaW5pdChkaWN0KTsKIAorICAgIF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrcyA9IDA7CisKICAgICAvKiBPcmlnaW5hbCBjb21tZW50IGZvcm0gX2JzZGRiLmMgaW4gdGhlIFB5dGhvbiBjb3JlLiBUaGlzIGlzIGFsc28gc3RpbGwKICAgICAgKiBuZWVkZWQgbm93YWRheXMgZm9yIFB5dGhvbiAyLjMvMi40LgogICAgICAqIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oIGIvTW9kdWxlcy9fc3FsaXRlL21vZHVsZS5oCmluZGV4IGYzZTJhYTEuLmU1MTRiZDEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NxbGl0ZS9tb2R1bGUuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvbW9kdWxlLmgKQEAgLTI1LDcgKzI1LDcgQEAKICNkZWZpbmUgUFlTUUxJVEVfTU9EVUxFX0gKICNpbmNsdWRlICJQeXRob24uaCIKIAotI2RlZmluZSBQWVNRTElURV9WRVJTSU9OICIyLjIuMiIKKyNkZWZpbmUgUFlTUUxJVEVfVkVSU0lPTiAiMi4zLjIiCiAKIGV4dGVybiBQeU9iamVjdCogRXJyb3I7CiBleHRlcm4gUHlPYmplY3QqIFdhcm5pbmc7CkBAIC01MCw2ICs1MCw4IEBACiAgKi8KIGV4dGVybiBQeU9iamVjdCogY29udmVydGVyczsKIAorZXh0ZXJuIGludCBfZW5hYmxlX2NhbGxiYWNrX3RyYWNlYmFja3M7CisKICNkZWZpbmUgUEFSU0VfREVDTFRZUEVTIDEKICNkZWZpbmUgUEFSU0VfQ09MTkFNRVMgMgogI2VuZGlmCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jIGIvTW9kdWxlcy9fc3FsaXRlL3V0aWwuYwppbmRleCAzMzc0OGE2Li5mNWE3MjMzIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zcWxpdGUvdXRpbC5jCisrKyBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmMKQEAgLTM4LDcgKzM4LDcgQEAKIAogLyoqCiAgKiBDaGVja3MgdGhlIFNRTGl0ZSBlcnJvciBjb2RlIGFuZCBzZXRzIHRoZSBhcHByb3ByaWF0ZSBEQi1BUEkgZXhjZXB0aW9uLgotICogUmV0dXJucyB0aGUgZXJyb3IgY29kZSAoMCBtZWFucyBubyBlcnJvciBvY2N1cmVkKS4KKyAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJyZWQpLgogICovCiBpbnQgX3NldGVycm9yKHNxbGl0ZTMqIGRiKQogewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaCBiL01vZHVsZXMvX3NxbGl0ZS91dGlsLmgKaW5kZXggZTk5YTRkZC4uN2NlM2Q0MCAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3FsaXRlL3V0aWwuaAorKysgYi9Nb2R1bGVzL19zcWxpdGUvdXRpbC5oCkBAIC0zMiw3ICszMiw3IEBACiAKIC8qKgogICogQ2hlY2tzIHRoZSBTUUxpdGUgZXJyb3IgY29kZSBhbmQgc2V0cyB0aGUgYXBwcm9wcmlhdGUgREItQVBJIGV4Y2VwdGlvbi4KLSAqIFJldHVybnMgdGhlIGVycm9yIGNvZGUgKDAgbWVhbnMgbm8gZXJyb3Igb2NjdXJlZCkuCisgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlICgwIG1lYW5zIG5vIGVycm9yIG9jY3VycmVkKS4KICAqLwogaW50IF9zZXRlcnJvcihzcWxpdGUzKiBkYik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3NyZS5jIGIvTW9kdWxlcy9fc3JlLmMKaW5kZXggZDRlNjA1MS4uNjhkNTExZSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fc3JlLmMKKysrIGIvTW9kdWxlcy9fc3JlLmMKQEAgLTM5LDYgKzM5LDggQEAKIHN0YXRpYyBjaGFyIGNvcHlyaWdodFtdID0KICAgICAiIFNSRSAyLjIuMiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwMiBieSBTZWNyZXQgTGFicyBBQiAiOwogCisjZGVmaW5lIFBZX1NTSVpFX1RfQ0xFQU4KKwogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIiAvKiBvZmZzZXRvZiAqLwogCkBAIC0yNjEsOSArMjYzLDkgQEAKIH0KIAogc3RhdGljIGludAotZGF0YV9zdGFja19ncm93KFNSRV9TVEFURSogc3RhdGUsIGludCBzaXplKQorZGF0YV9zdGFja19ncm93KFNSRV9TVEFURSogc3RhdGUsIFB5X3NzaXplX3Qgc2l6ZSkKIHsKLSAgICBpbnQgbWluc2l6ZSwgY3Vyc2l6ZTsKKyAgICBQeV9zc2l6ZV90IG1pbnNpemUsIGN1cnNpemU7CiAgICAgbWluc2l6ZSA9IHN0YXRlLT5kYXRhX3N0YWNrX2Jhc2Urc2l6ZTsKICAgICBjdXJzaXplID0gc3RhdGUtPmRhdGFfc3RhY2tfc2l6ZTsKICAgICBpZiAoY3Vyc2l6ZSA8IG1pbnNpemUpIHsKQEAgLTMzNSw3ICszMzcsNyBAQAogewogICAgIC8qIGNoZWNrIGlmIHBvaW50ZXIgaXMgYXQgZ2l2ZW4gcG9zaXRpb24gKi8KIAotICAgIGludCB0aGlzcCwgdGhhdHA7CisgICAgUHlfc3NpemVfdCB0aGlzcCwgdGhhdHA7CiAKICAgICBzd2l0Y2ggKGF0KSB7CiAKQEAgLTQ3Niw3ICs0NzgsNyBAQAogICAgICAgICBjYXNlIFNSRV9PUF9CSUdDSEFSU0VUOgogICAgICAgICAgICAgLyogPEJJR0NIQVJTRVQ+IDxibG9ja2NvdW50PiA8MjU2IGJsb2NraW5kaWNlcz4gPGJsb2Nrcz4gKi8KICAgICAgICAgewotICAgICAgICAgICAgaW50IGNvdW50LCBibG9jazsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgY291bnQsIGJsb2NrOwogICAgICAgICAgICAgY291bnQgPSAqKHNldCsrKTsKIAogICAgICAgICAgICAgaWYgKHNpemVvZihTUkVfQ09ERSkgPT0gMikgewpAQCAtNTEwLDE1ICs1MTIsMTUgQEAKICAgICB9CiB9CiAKLUxPQ0FMKGludCkgU1JFX01BVENIKFNSRV9TVEFURSogc3RhdGUsIFNSRV9DT0RFKiBwYXR0ZXJuKTsKK0xPQ0FMKFB5X3NzaXplX3QpIFNSRV9NQVRDSChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybik7CiAKLUxPQ0FMKGludCkKLVNSRV9DT1VOVChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybiwgaW50IG1heGNvdW50KQorTE9DQUwoUHlfc3NpemVfdCkKK1NSRV9DT1VOVChTUkVfU1RBVEUqIHN0YXRlLCBTUkVfQ09ERSogcGF0dGVybiwgUHlfc3NpemVfdCBtYXhjb3VudCkKIHsKICAgICBTUkVfQ09ERSBjaHI7CiAgICAgU1JFX0NIQVIqIHB0ciA9IChTUkVfQ0hBUiAqKXN0YXRlLT5wdHI7CiAgICAgU1JFX0NIQVIqIGVuZCA9IChTUkVfQ0hBUiAqKXN0YXRlLT5lbmQ7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgLyogYWRqdXN0IGVuZCAqLwogICAgIGlmIChtYXhjb3VudCA8IGVuZCAtIHB0ciAmJiBtYXhjb3VudCAhPSA2NTUzNSkKQEAgLTYwOCw3ICs2MTAsNyBAQAogCiAgICAgU1JFX0NIQVIqIGVuZCA9IHN0YXRlLT5lbmQ7CiAgICAgU1JFX0NIQVIqIHB0ciA9IHN0YXRlLT5wdHI7Ci0gICAgaW50IGk7CisgICAgUHlfc3NpemVfdCBpOwogCiAgICAgLyogY2hlY2sgbWluaW1hbCBsZW5ndGggKi8KICAgICBpZiAocGF0dGVyblszXSAmJiAoZW5kIC0gcHRyKSA8IHBhdHRlcm5bM10pCkBAIC03ODUsMTMgKzc4NywxMyBAQAogICAgIHdoaWxlICgwKSAvKiBnY2MgZG9lc24ndCBsaWtlIGxhYmVscyBhdCBlbmQgb2Ygc2NvcGVzICovIFwKIAogdHlwZWRlZiBzdHJ1Y3QgewotICAgIGludCBsYXN0X2N0eF9wb3M7Ci0gICAgaW50IGp1bXA7CisgICAgUHlfc3NpemVfdCBsYXN0X2N0eF9wb3M7CisgICAgUHlfc3NpemVfdCBqdW1wOwogICAgIFNSRV9DSEFSKiBwdHI7CiAgICAgU1JFX0NPREUqIHBhdHRlcm47Ci0gICAgaW50IGNvdW50OwotICAgIGludCBsYXN0bWFyazsKLSAgICBpbnQgbGFzdGluZGV4OworICAgIFB5X3NzaXplX3QgY291bnQ7CisgICAgUHlfc3NpemVfdCBsYXN0bWFyazsKKyAgICBQeV9zc2l6ZV90IGxhc3RpbmRleDsKICAgICB1bmlvbiB7CiAgICAgICAgIFNSRV9DT0RFIGNocjsKICAgICAgICAgU1JFX1JFUEVBVCogcmVwOwpAQCAtODAwLDEzICs4MDIsMTMgQEAKIAogLyogY2hlY2sgaWYgc3RyaW5nIG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4uICByZXR1cm5zIDwwIGZvcgogICAgZXJyb3IsIDAgZm9yIGZhaWx1cmUsIGFuZCAxIGZvciBzdWNjZXNzICovCi1MT0NBTChpbnQpCitMT0NBTChQeV9zc2l6ZV90KQogU1JFX01BVENIKFNSRV9TVEFURSogc3RhdGUsIFNSRV9DT0RFKiBwYXR0ZXJuKQogewogICAgIFNSRV9DSEFSKiBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwotICAgIGludCBhbGxvY19wb3MsIGN0eF9wb3MgPSAtMTsKLSAgICBpbnQgaSwgcmV0ID0gMDsKLSAgICBpbnQganVtcDsKKyAgICBQeV9zc2l6ZV90IGFsbG9jX3BvcywgY3R4X3BvcyA9IC0xOworICAgIFB5X3NzaXplX3QgaSwgcmV0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGp1bXA7CiAKICAgICBTUkVfTUFUQ0hfQ09OVEVYVCogY3R4OwogICAgIFNSRV9NQVRDSF9DT05URVhUKiBuZXh0Y3R4OwpAQCAtODUxLDcgKzg1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1hcmsgYXJyYXkuICBJZiBpdCBpcyBpbmNyZWFzZWQgYnkgbW9yZSB0aGFuIDEsCiAgICAgICAgICAgICAgICAgICAgdGhlIGludGVydmVuaW5nIG1hcmtzIG11c3QgYmUgc2V0IHRvIE5VTEwgdG8gc2lnbmFsCiAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGVzZSBtYXJrcyBoYXZlIG5vdCBiZWVuIGVuY291bnRlcmVkLiAqLwotICAgICAgICAgICAgICAgIGludCBqID0gc3RhdGUtPmxhc3RtYXJrICsgMTsKKyAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGogPSBzdGF0ZS0+bGFzdG1hcmsgKyAxOwogICAgICAgICAgICAgICAgIHdoaWxlIChqIDwgaSkKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPm1hcmtbaisrXSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgc3RhdGUtPmxhc3RtYXJrID0gaTsKQEAgLTEwMzcsNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICBzdHJpbmcuICBjaGVjayBpZiB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBtYXRjaGVzLAogICAgICAgICAgICAgICAgYW5kIGJhY2t0cmFjayBpZiBub3QuICovCiAKLSAgICAgICAgICAgIGlmIChjdHgtPmNvdW50IDwgKGludCkgY3R4LT5wYXR0ZXJuWzFdKQorICAgICAgICAgICAgaWYgKGN0eC0+Y291bnQgPCAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdKQogICAgICAgICAgICAgICAgIFJFVFVSTl9GQUlMVVJFOwogCiAgICAgICAgICAgICBpZiAoY3R4LT5wYXR0ZXJuW2N0eC0+cGF0dGVyblswXV0gPT0gU1JFX09QX1NVQ0NFU1MpIHsKQEAgLTEwNTMsMTIgKzEwNTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICB0aGUgcmVzdCBvZiB0aGUgcGF0dGVybiBjYW5ub3QgcG9zc2libHkgbWF0Y2ggKi8KICAgICAgICAgICAgICAgICBjdHgtPnUuY2hyID0gY3R4LT5wYXR0ZXJuW2N0eC0+cGF0dGVyblswXSsxXTsKICAgICAgICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjdHgtPmNvdW50ID49IChpbnQpIGN0eC0+cGF0dGVyblsxXSAmJgorICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3R4LT5jb3VudCA+PSAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY3R4LT5wdHIgPj0gZW5kIHx8ICpjdHgtPnB0ciAhPSBjdHgtPnUuY2hyKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5wdHItLTsKICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC0+Y291bnQtLTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LT5jb3VudCA8IChpbnQpIGN0eC0+cGF0dGVyblsxXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGN0eC0+Y291bnQgPCAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5wdHIgPSBjdHgtPnB0cjsKICAgICAgICAgICAgICAgICAgICAgRE9fSlVNUChKVU1QX1JFUEVBVF9PTkVfMSwganVtcF9yZXBlYXRfb25lXzEsCkBAIC0xMDc2LDcgKzEwNzgsNyBAQAogCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgY2FzZSAqLwotICAgICAgICAgICAgICAgIHdoaWxlIChjdHgtPmNvdW50ID49IChpbnQpIGN0eC0+cGF0dGVyblsxXSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChjdHgtPmNvdW50ID49IChQeV9zc2l6ZV90KSBjdHgtPnBhdHRlcm5bMV0pIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnB0ciA9IGN0eC0+cHRyOwogICAgICAgICAgICAgICAgICAgICBET19KVU1QKEpVTVBfUkVQRUFUX09ORV8yLCBqdW1wX3JlcGVhdF9vbmVfMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBhdHRlcm4rY3R4LT5wYXR0ZXJuWzBdKTsKQEAgLTExMTYsNyArMTExOCw3IEBACiAgICAgICAgICAgICAgICAgcmV0ID0gU1JFX0NPVU5UKHN0YXRlLCBjdHgtPnBhdHRlcm4rMywgY3R4LT5wYXR0ZXJuWzFdKTsKICAgICAgICAgICAgICAgICBSRVRVUk5fT05fRVJST1IocmV0KTsKICAgICAgICAgICAgICAgICBEQVRBX0xPT0tVUF9BVChTUkVfTUFUQ0hfQ09OVEVYVCwgY3R4LCBjdHhfcG9zKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0IDwgKGludCkgY3R4LT5wYXR0ZXJuWzFdKQorICAgICAgICAgICAgICAgIGlmIChyZXQgPCAoUHlfc3NpemVfdCkgY3R4LT5wYXR0ZXJuWzFdKQogICAgICAgICAgICAgICAgICAgICAvKiBkaWRuJ3QgbWF0Y2ggbWluaW11bSBudW1iZXIgb2YgdGltZXMgKi8KICAgICAgICAgICAgICAgICAgICAgUkVUVVJOX0ZBSUxVUkU7CiAgICAgICAgICAgICAgICAgLyogYWR2YW5jZSBwYXN0IG1pbmltdW0gbWF0Y2hlcyBvZiByZXBlYXQgKi8KQEAgLTExMzIsOCArMTEzNCw4IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8qIGdlbmVyYWwgY2FzZSAqLwogICAgICAgICAgICAgICAgIExBU1RNQVJLX1NBVkUoKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKGludCljdHgtPnBhdHRlcm5bMl0gPT0gNjU1MzUKLSAgICAgICAgICAgICAgICAgICAgICAgfHwgY3R4LT5jb3VudCA8PSAoaW50KWN0eC0+cGF0dGVyblsyXSkgeworICAgICAgICAgICAgICAgIHdoaWxlICgoUHlfc3NpemVfdCljdHgtPnBhdHRlcm5bMl0gPT0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgICAgfHwgY3R4LT5jb3VudCA8PSAoUHlfc3NpemVfdCljdHgtPnBhdHRlcm5bMl0pIHsKICAgICAgICAgICAgICAgICAgICAgc3RhdGUtPnB0ciA9IGN0eC0+cHRyOwogICAgICAgICAgICAgICAgICAgICBET19KVU1QKEpVTVBfTUlOX1JFUEVBVF9PTkUsanVtcF9taW5fcmVwZWF0X29uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPnBhdHRlcm4rY3R4LT5wYXR0ZXJuWzBdKTsKQEAgLTEzMTIsNyArMTMxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgY3R4LT5wdHIsIGN0eC0+cGF0dGVyblswXSkpOwogICAgICAgICAgICAgaSA9IGN0eC0+cGF0dGVyblswXTsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZ3JvdXByZWYgPSBpK2k7CisgICAgICAgICAgICAgICAgUHlfc3NpemVfdCBncm91cHJlZiA9IGkraTsKICAgICAgICAgICAgICAgICBpZiAoZ3JvdXByZWYgPj0gc3RhdGUtPmxhc3RtYXJrKSB7CiAgICAgICAgICAgICAgICAgICAgIFJFVFVSTl9GQUlMVVJFOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xMzM2LDcgKzEzMzgsNyBAQAogICAgICAgICAgICAgICAgICAgIGN0eC0+cHRyLCBjdHgtPnBhdHRlcm5bMF0pKTsKICAgICAgICAgICAgIGkgPSBjdHgtPnBhdHRlcm5bMF07CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGdyb3VwcmVmID0gaStpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZ3JvdXByZWYgPSBpK2k7CiAgICAgICAgICAgICAgICAgaWYgKGdyb3VwcmVmID49IHN0YXRlLT5sYXN0bWFyaykgewogICAgICAgICAgICAgICAgICAgICBSRVRVUk5fRkFJTFVSRTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTM2MSw3ICsxMzYzLDcgQEAKICAgICAgICAgICAgIC8qIDxHUk9VUFJFRl9FWElTVFM+IDxncm91cD4gPHNraXA+IGNvZGV5ZXMgPEpVTVA+IGNvZGVubyAuLi4gKi8KICAgICAgICAgICAgIGkgPSBjdHgtPnBhdHRlcm5bMF07CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGdyb3VwcmVmID0gaStpOworICAgICAgICAgICAgICAgIFB5X3NzaXplX3QgZ3JvdXByZWYgPSBpK2k7CiAgICAgICAgICAgICAgICAgaWYgKGdyb3VwcmVmID49IHN0YXRlLT5sYXN0bWFyaykgewogICAgICAgICAgICAgICAgICAgICBjdHgtPnBhdHRlcm4gKz0gY3R4LT5wYXR0ZXJuWzFdOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTE0NzQsMTQgKzE0NzYsMTQgQEAKICAgICByZXR1cm4gcmV0OyAvKiBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUgKi8KIH0KIAotTE9DQUwoaW50KQorTE9DQUwoUHlfc3NpemVfdCkKIFNSRV9TRUFSQ0goU1JFX1NUQVRFKiBzdGF0ZSwgU1JFX0NPREUqIHBhdHRlcm4pCiB7CiAgICAgU1JFX0NIQVIqIHB0ciA9IChTUkVfQ0hBUiAqKXN0YXRlLT5zdGFydDsKICAgICBTUkVfQ0hBUiogZW5kID0gKFNSRV9DSEFSICopc3RhdGUtPmVuZDsKLSAgICBpbnQgc3RhdHVzID0gMDsKLSAgICBpbnQgcHJlZml4X2xlbiA9IDA7Ci0gICAgaW50IHByZWZpeF9za2lwID0gMDsKKyAgICBQeV9zc2l6ZV90IHN0YXR1cyA9IDA7CisgICAgUHlfc3NpemVfdCBwcmVmaXhfbGVuID0gMDsKKyAgICBQeV9zc2l6ZV90IHByZWZpeF9za2lwID0gMDsKICAgICBTUkVfQ09ERSogcHJlZml4ID0gTlVMTDsKICAgICBTUkVfQ09ERSogY2hhcnNldCA9IE5VTEw7CiAgICAgU1JFX0NPREUqIG92ZXJsYXAgPSBOVUxMOwpAQCAtMTUyMyw3ICsxNTI1LDcgQEAKICAgICBpZiAocHJlZml4X2xlbiA+IDEpIHsKICAgICAgICAgLyogcGF0dGVybiBzdGFydHMgd2l0aCBhIGtub3duIHByZWZpeC4gIHVzZSB0aGUgb3ZlcmxhcAogICAgICAgICAgICB0YWJsZSB0byBza2lwIGZvcndhcmQgYXMgZmFzdCBhcyB3ZSBwb3NzaWJseSBjYW4gKi8KLSAgICAgICAgaW50IGkgPSAwOworICAgICAgICBQeV9zc2l6ZV90IGkgPSAwOwogICAgICAgICBlbmQgPSAoU1JFX0NIQVIgKilzdGF0ZS0+ZW5kOwogICAgICAgICB3aGlsZSAocHRyIDwgZW5kKSB7CiAgICAgICAgICAgICBmb3IgKDs7KSB7CkBAIC0xNjA0LDcgKzE2MDYsNyBAQAogfQogCiBMT0NBTChpbnQpCi1TUkVfTElURVJBTF9URU1QTEFURShTUkVfQ0hBUiogcHRyLCBpbnQgbGVuKQorU1JFX0xJVEVSQUxfVEVNUExBVEUoU1JFX0NIQVIqIHB0ciwgUHlfc3NpemVfdCBsZW4pCiB7CiAgICAgLyogY2hlY2sgaWYgZ2l2ZW4gc3RyaW5nIGlzIGEgbGl0ZXJhbCB0ZW1wbGF0ZSAoaS5lLiBubyBlc2NhcGVzKSAqLwogICAgIHdoaWxlIChsZW4tLSA+IDApCkBAIC0xNjI1LDcgKzE2MjcsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHNyZV9jb2Rlc2l6ZShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QgKnVudXNlZCkKIHsKLSAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHNpemVvZihTUkVfQ09ERSkpOworICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2l6ZW9mKFNSRV9DT0RFKSk7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCkBAIC0xNjYwLDE0ICsxNjYyLDE1IEBACiB9CiAKIHN0YXRpYyB2b2lkKgotZ2V0c3RyaW5nKFB5T2JqZWN0KiBzdHJpbmcsIGludCogcF9sZW5ndGgsIGludCogcF9jaGFyc2l6ZSkKK2dldHN0cmluZyhQeU9iamVjdCogc3RyaW5nLCBQeV9zc2l6ZV90KiBwX2xlbmd0aCwgaW50KiBwX2NoYXJzaXplKQogewogICAgIC8qIGdpdmVuIGEgcHl0aG9uIG9iamVjdCwgcmV0dXJuIGEgZGF0YSBwb2ludGVyLCBhIGxlbmd0aCAoaW4KICAgICAgICBjaGFyYWN0ZXJzKSwgYW5kIGEgY2hhcmFjdGVyIHNpemUuICByZXR1cm4gTlVMTCBpZiB0aGUgb2JqZWN0CiAgICAgICAgaXMgbm90IGEgc3RyaW5nIChvciBub3QgY29tcGF0aWJsZSkgKi8KIAogICAgIFB5QnVmZmVyUHJvY3MgKmJ1ZmZlcjsKLSAgICBpbnQgc2l6ZSwgYnl0ZXMsIGNoYXJzaXplOworICAgIFB5X3NzaXplX3Qgc2l6ZSwgYnl0ZXM7CisgICAgaW50IGNoYXJzaXplOwogICAgIHZvaWQqIHB0cjsKIAogI2lmIGRlZmluZWQoSEFWRV9VTklDT0RFKQpAQCAtMTcwNiw3ICsxNzA5LDcgQEAKICAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3RyaW5nKSB8fCBieXRlcyA9PSBzaXplKQogICAgICAgICBjaGFyc2l6ZSA9IDE7CiAjaWYgZGVmaW5lZChIQVZFX1VOSUNPREUpCi0gICAgZWxzZSBpZiAoYnl0ZXMgPT0gKGludCkgKHNpemUgKiBzaXplb2YoUHlfVU5JQ09ERSkpKQorICAgIGVsc2UgaWYgKGJ5dGVzID09IChQeV9zc2l6ZV90KSAoc2l6ZSAqIHNpemVvZihQeV9VTklDT0RFKSkpCiAgICAgICAgIGNoYXJzaXplID0gc2l6ZW9mKFB5X1VOSUNPREUpOwogI2VuZGlmCiAgICAgZWxzZSB7CkBAIC0xNzI2LDExICsxNzI5LDExIEBACiAKIExPQ0FMKFB5T2JqZWN0KikKIHN0YXRlX2luaXQoU1JFX1NUQVRFKiBzdGF0ZSwgUGF0dGVybk9iamVjdCogcGF0dGVybiwgUHlPYmplY3QqIHN0cmluZywKLSAgICAgICAgICAgaW50IHN0YXJ0LCBpbnQgZW5kKQorICAgICAgICAgICBQeV9zc2l6ZV90IHN0YXJ0LCBQeV9zc2l6ZV90IGVuZCkKIHsKICAgICAvKiBwcmVwYXJlIHN0YXRlIG9iamVjdCAqLwogCi0gICAgaW50IGxlbmd0aDsKKyAgICBQeV9zc2l6ZV90IGxlbmd0aDsKICAgICBpbnQgY2hhcnNpemU7CiAgICAgdm9pZCogcHRyOwogCkBAIC0xNzkyLDkgKzE3OTUsOSBAQAogICAgICgoKGNoYXIqKShtZW1iZXIpIC0gKGNoYXIqKShzdGF0ZSktPmJlZ2lubmluZykgLyAoc3RhdGUpLT5jaGFyc2l6ZSkKIAogTE9DQUwoUHlPYmplY3QqKQotc3RhdGVfZ2V0c2xpY2UoU1JFX1NUQVRFKiBzdGF0ZSwgaW50IGluZGV4LCBQeU9iamVjdCogc3RyaW5nLCBpbnQgZW1wdHkpCitzdGF0ZV9nZXRzbGljZShTUkVfU1RBVEUqIHN0YXRlLCBQeV9zc2l6ZV90IGluZGV4LCBQeU9iamVjdCogc3RyaW5nLCBpbnQgZW1wdHkpCiB7Ci0gICAgaW50IGksIGo7CisgICAgUHlfc3NpemVfdCBpLCBqOwogCiAgICAgaW5kZXggPSAoaW5kZXggLSAxKSAqIDI7CiAKQEAgLTE4NTQsMTAgKzE4NTcsMTAgQEAKICAgICBpbnQgc3RhdHVzOwogCiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGludCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAicGF0dGVybiIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xpaTptYXRjaCIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk98bm46bWF0Y2giLCBrd2xpc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmluZywgJnN0YXJ0LCAmZW5kKSkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTE4OTEsMTAgKzE4OTQsMTAgQEAKICAgICBpbnQgc3RhdHVzOwogCiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgc3RhcnQgPSAwOwotICAgIGludCBlbmQgPSBJTlRfTUFYOworICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOworICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAicGF0dGVybiIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xpaTpzZWFyY2giLCBrd2xpc3QsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPfG5uOnNlYXJjaCIsIGt3bGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyaW5nLCAmc3RhcnQsICZlbmQpKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjAyOSwxMyArMjAzMiwxMyBAQAogICAgIFNSRV9TVEFURSBzdGF0ZTsKICAgICBQeU9iamVjdCogbGlzdDsKICAgICBpbnQgc3RhdHVzOwotICAgIGludCBpLCBiLCBlOworICAgIFB5X3NzaXplX3QgaSwgYiwgZTsKIAogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKKyAgICBQeV9zc2l6ZV90IHN0YXJ0ID0gMDsKKyAgICBQeV9zc2l6ZV90IGVuZCA9IFBZX1NTSVpFX1RfTUFYOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInNvdXJjZSIsICJwb3MiLCAiZW5kcG9zIiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xpaTpmaW5kYWxsIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xubjpmaW5kYWxsIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yMTU0LDE4ICsyMTU3LDE4IEBACiAgICAgUHlPYmplY3QqIGxpc3Q7CiAgICAgUHlPYmplY3QqIGl0ZW07CiAgICAgaW50IHN0YXR1czsKLSAgICBpbnQgbjsKLSAgICBpbnQgaTsKKyAgICBQeV9zc2l6ZV90IG47CisgICAgUHlfc3NpemVfdCBpOwogICAgIHZvaWQqIGxhc3Q7CiAKICAgICBQeU9iamVjdCogc3RyaW5nOwotICAgIGludCBtYXhzcGxpdCA9IDA7CisgICAgUHlfc3NpemVfdCBtYXhzcGxpdCA9IDA7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAic291cmNlIiwgIm1heHNwbGl0IiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xpOnNwbGl0Iiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT3xuOnNwbGl0Iiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmcsICZtYXhzcGxpdCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc3RhdGUsIHNlbGYsIHN0cmluZywgMCwgSU5UX01BWCk7CisgICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc3RhdGUsIHNlbGYsIHN0cmluZywgMCwgUFlfU1NJWkVfVF9NQVgpOwogICAgIGlmICghc3RyaW5nKQogICAgICAgICByZXR1cm4gTlVMTDsKIApAQCAtMjI1OSw3ICsyMjYyLDcgQEAKIAogc3RhdGljIFB5T2JqZWN0KgogcGF0dGVybl9zdWJ4KFBhdHRlcm5PYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBwdGVtcGxhdGUsIFB5T2JqZWN0KiBzdHJpbmcsCi0gICAgICAgICAgICAgaW50IGNvdW50LCBpbnQgc3VibikKKyAgICAgICAgICAgICBQeV9zc2l6ZV90IGNvdW50LCBQeV9zc2l6ZV90IHN1Ym4pCiB7CiAgICAgU1JFX1NUQVRFIHN0YXRlOwogICAgIFB5T2JqZWN0KiBsaXN0OwpAQCAtMjI2OSw4ICsyMjcyLDkgQEAKICAgICBQeU9iamVjdCogbWF0Y2g7CiAgICAgdm9pZCogcHRyOwogICAgIGludCBzdGF0dXM7Ci0gICAgaW50IG47Ci0gICAgaW50IGksIGIsIGU7CisgICAgUHlfc3NpemVfdCBuOworICAgIFB5X3NzaXplX3QgaSwgYiwgZTsKKyAgICBpbnQgYmludDsKICAgICBpbnQgZmlsdGVyX2lzX2NhbGxhYmxlOwogCiAgICAgaWYgKFB5Q2FsbGFibGVfQ2hlY2socHRlbXBsYXRlKSkgewpAQCAtMjI4MSw3ICsyMjg1LDggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvKiBpZiBub3QgY2FsbGFibGUsIGNoZWNrIGlmIGl0J3MgYSBsaXRlcmFsIHN0cmluZyAqLwogICAgICAgICBpbnQgbGl0ZXJhbDsKLSAgICAgICAgcHRyID0gZ2V0c3RyaW5nKHB0ZW1wbGF0ZSwgJm4sICZiKTsKKyAgICAgICAgcHRyID0gZ2V0c3RyaW5nKHB0ZW1wbGF0ZSwgJm4sICZiaW50KTsKKyAgICAgICAgYiA9IGJpbnQ7CiAgICAgICAgIGlmIChwdHIpIHsKICAgICAgICAgICAgIGlmIChiID09IDEpIHsKIAkJICAgIGxpdGVyYWwgPSBzcmVfbGl0ZXJhbF90ZW1wbGF0ZSgodW5zaWduZWQgY2hhciAqKXB0ciwgbik7CkBAIC0yMzEwLDcgKzIzMTUsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc3RhdGUsIHNlbGYsIHN0cmluZywgMCwgSU5UX01BWCk7CisgICAgc3RyaW5nID0gc3RhdGVfaW5pdCgmc3RhdGUsIHNlbGYsIHN0cmluZywgMCwgUFlfU1NJWkVfVF9NQVgpOwogICAgIGlmICghc3RyaW5nKSB7CiAgICAgICAgIFB5X0RFQ1JFRihmaWx0ZXIpOwogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI0NDMsOSArMjQ0OCw5IEBACiB7CiAgICAgUHlPYmplY3QqIHB0ZW1wbGF0ZTsKICAgICBQeU9iamVjdCogc3RyaW5nOwotICAgIGludCBjb3VudCA9IDA7CisgICAgUHlfc3NpemVfdCBjb3VudCA9IDA7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAicmVwbCIsICJzdHJpbmciLCAiY291bnQiLCBOVUxMIH07Ci0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3csICJPT3xpOnN1YiIsIGt3bGlzdCwKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrdywgIk9PfG46c3ViIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcGxhdGUsICZzdHJpbmcsICZjb3VudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yNDU3LDkgKzI0NjIsOSBAQAogewogICAgIFB5T2JqZWN0KiBwdGVtcGxhdGU7CiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogICAgIHN0YXRpYyBjaGFyKiBrd2xpc3RbXSA9IHsgInJlcGwiLCAic3RyaW5nIiwgImNvdW50IiwgTlVMTCB9OwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098aTpzdWJuIiwga3dsaXN0LAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3LCAiT098bjpzdWJuIiwga3dsaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdGVtcGxhdGUsICZzdHJpbmcsICZjb3VudCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCkBAIC0yNjQyLDE1ICsyNjQ3LDE1IEBACiAgICAgLyogImNvbXBpbGUiIHBhdHRlcm4gZGVzY3JpcHRvciB0byBwYXR0ZXJuIG9iamVjdCAqLwogCiAgICAgUGF0dGVybk9iamVjdCogc2VsZjsKLSAgICBpbnQgaSwgbjsKKyAgICBQeV9zc2l6ZV90IGksIG47CiAKICAgICBQeU9iamVjdCogcGF0dGVybjsKICAgICBpbnQgZmxhZ3MgPSAwOwogICAgIFB5T2JqZWN0KiBjb2RlOwotICAgIGludCBncm91cHMgPSAwOworICAgIFB5X3NzaXplX3QgZ3JvdXBzID0gMDsKICAgICBQeU9iamVjdCogZ3JvdXBpbmRleCA9IE5VTEw7CiAgICAgUHlPYmplY3QqIGluZGV4Z3JvdXAgPSBOVUxMOwotICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPIXxpT08iLCAmcGF0dGVybiwgJmZsYWdzLAorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2lPIXxuT08iLCAmcGF0dGVybiwgJmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlMaXN0X1R5cGUsICZjb2RlLCAmZ3JvdXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3JvdXBpbmRleCwgJmluZGV4Z3JvdXApKQogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI3MTEsNyArMjcxNiw3IEBACiB9CiAKIHN0YXRpYyBQeU9iamVjdCoKLW1hdGNoX2dldHNsaWNlX2J5X2luZGV4KE1hdGNoT2JqZWN0KiBzZWxmLCBpbnQgaW5kZXgsIFB5T2JqZWN0KiBkZWYpCittYXRjaF9nZXRzbGljZV9ieV9pbmRleChNYXRjaE9iamVjdCogc2VsZiwgUHlfc3NpemVfdCBpbmRleCwgUHlPYmplY3QqIGRlZikKIHsKICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNlbGYtPmdyb3VwcykgewogICAgICAgICAvKiByYWlzZSBJbmRleEVycm9yIGlmIHdlIHdlcmUgZ2l2ZW4gYSBiYWQgZ3JvdXAgbnVtYmVyICovCkBAIC0yNzM1LDIxICsyNzQwLDIxIEBACiAgICAgICAgICk7CiB9CiAKLXN0YXRpYyBpbnQKK3N0YXRpYyBQeV9zc2l6ZV90CiBtYXRjaF9nZXRpbmRleChNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGluZGV4KQogewotICAgIGludCBpOworICAgIFB5X3NzaXplX3QgaTsKIAogICAgIGlmIChQeUludF9DaGVjayhpbmRleCkpCi0gICAgICAgIHJldHVybiAoaW50KSBQeUludF9BU19MT05HKGluZGV4KTsKKyAgICAgICAgcmV0dXJuIFB5SW50X0FzU3NpemVfdChpbmRleCk7CiAKICAgICBpID0gLTE7CiAKICAgICBpZiAoc2VsZi0+cGF0dGVybi0+Z3JvdXBpbmRleCkgewogICAgICAgICBpbmRleCA9IFB5T2JqZWN0X0dldEl0ZW0oc2VsZi0+cGF0dGVybi0+Z3JvdXBpbmRleCwgaW5kZXgpOwogICAgICAgICBpZiAoaW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhpbmRleCkpCi0gICAgICAgICAgICAgICAgaSA9IChpbnQpIFB5SW50X0FTX0xPTkcoaW5kZXgpOworICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKGluZGV4KSB8fCBQeUxvbmdfQ2hlY2soaW5kZXgpKQorICAgICAgICAgICAgICAgIGkgPSBQeUludF9Bc1NzaXplX3QoaW5kZXgpOwogICAgICAgICAgICAgUHlfREVDUkVGKGluZGV4KTsKICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICBQeUVycl9DbGVhcigpOwpAQCAtMjc3OCw3ICsyNzgzLDcgQEAKIG1hdGNoX2dyb3VwKE1hdGNoT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKIHsKICAgICBQeU9iamVjdCogcmVzdWx0OwotICAgIGludCBpLCBzaXplOworICAgIFB5X3NzaXplX3QgaSwgc2l6ZTsKIAogICAgIHNpemUgPSBQeVR1cGxlX0dFVF9TSVpFKGFyZ3MpOwogCkBAIC0yODEzLDcgKzI4MTgsNyBAQAogbWF0Y2hfZ3JvdXBzKE1hdGNoT2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3KQogewogICAgIFB5T2JqZWN0KiByZXN1bHQ7Ci0gICAgaW50IGluZGV4OworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICBQeU9iamVjdCogZGVmID0gUHlfTm9uZTsKICAgICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ICJkZWZhdWx0IiwgTlVMTCB9OwpAQCAtMjg0Miw3ICsyODQ3LDcgQEAKIHsKICAgICBQeU9iamVjdCogcmVzdWx0OwogICAgIFB5T2JqZWN0KiBrZXlzOwotICAgIGludCBpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogCiAgICAgUHlPYmplY3QqIGRlZiA9IFB5X05vbmU7CiAgICAgc3RhdGljIGNoYXIqIGt3bGlzdFtdID0geyAiZGVmYXVsdCIsIE5VTEwgfTsKQEAgLTI4ODgsNyArMjg5Myw3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBtYXRjaF9zdGFydChNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0gICAgaW50IGluZGV4OworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICBQeU9iamVjdCogaW5kZXhfID0gUHlfRmFsc2U7IC8qIHplcm8gKi8KICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJzdGFydCIsIDAsIDEsICZpbmRleF8pKQpAQCAtMjkxMSw3ICsyOTE2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG1hdGNoX2VuZChNYXRjaE9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpCiB7Ci0gICAgaW50IGluZGV4OworICAgIFB5X3NzaXplX3QgaW5kZXg7CiAKICAgICBQeU9iamVjdCogaW5kZXhfID0gUHlfRmFsc2U7IC8qIHplcm8gKi8KICAgICBpZiAoIVB5QXJnX1VucGFja1R1cGxlKGFyZ3MsICJlbmQiLCAwLCAxLCAmaW5kZXhfKSkKQEAgLTI5MzIsNyArMjkzNyw3IEBACiB9CiAKIExPQ0FMKFB5T2JqZWN0KikKLV9wYWlyKGludCBpMSwgaW50IGkyKQorX3BhaXIoUHlfc3NpemVfdCBpMSwgUHlfc3NpemVfdCBpMikKIHsKICAgICBQeU9iamVjdCogcGFpcjsKICAgICBQeU9iamVjdCogaXRlbTsKQEAgLTI5NDEsMTIgKzI5NDYsMTIgQEAKICAgICBpZiAoIXBhaXIpCiAgICAgICAgIHJldHVybiBOVUxMOwogCi0gICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKGkxKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbVNzaXplX3QoaTEpOwogICAgIGlmICghaXRlbSkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBQeVR1cGxlX1NFVF9JVEVNKHBhaXIsIDAsIGl0ZW0pOwogCi0gICAgaXRlbSA9IFB5SW50X0Zyb21Mb25nKGkyKTsKKyAgICBpdGVtID0gUHlJbnRfRnJvbVNzaXplX3QoaTIpOwogICAgIGlmICghaXRlbSkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBQeVR1cGxlX1NFVF9JVEVNKHBhaXIsIDEsIGl0ZW0pOwpAQCAtMjk2MSw3ICsyOTY2LDcgQEAKIHN0YXRpYyBQeU9iamVjdCoKIG1hdGNoX3NwYW4oTWF0Y2hPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKQogewotICAgIGludCBpbmRleDsKKyAgICBQeV9zc2l6ZV90IGluZGV4OwogCiAgICAgUHlPYmplY3QqIGluZGV4XyA9IFB5X0ZhbHNlOyAvKiB6ZXJvICovCiAgICAgaWYgKCFQeUFyZ19VbnBhY2tUdXBsZShhcmdzLCAic3BhbiIsIDAsIDEsICZpbmRleF8pKQpAQCAtMjk4Niw3ICsyOTkxLDcgQEAKIHsKICAgICBQeU9iamVjdCogcmVnczsKICAgICBQeU9iamVjdCogaXRlbTsKLSAgICBpbnQgaW5kZXg7CisgICAgUHlfc3NpemVfdCBpbmRleDsKIAogICAgIHJlZ3MgPSBQeVR1cGxlX05ldyhzZWxmLT5ncm91cHMpOwogICAgIGlmICghcmVncykKQEAgLTMwMTIsNyArMzAxNyw3IEBACiB7CiAjaWZkZWYgVVNFX0JVSUxUSU5fQ09QWQogICAgIE1hdGNoT2JqZWN0KiBjb3B5OwotICAgIGludCBzbG90cywgb2Zmc2V0OworICAgIFB5X3NzaXplX3Qgc2xvdHMsIG9mZnNldDsKIAogICAgIHNsb3RzID0gMiAqIChzZWxmLT5wYXR0ZXJuLT5ncm91cHMrMSk7CiAKQEAgLTMwMjksNyArMzAzNCw3IEBACiAgICAgUHlfWElOQ1JFRihzZWxmLT5yZWdzKTsKIAogICAgIG1lbWNweSgoY2hhciopIGNvcHkgKyBvZmZzZXQsIChjaGFyKikgc2VsZiArIG9mZnNldCwKLSAgICAgICAgICAgc2l6ZW9mKE1hdGNoT2JqZWN0KSArIHNsb3RzICogc2l6ZW9mKGludCkgLSBvZmZzZXQpOworICAgICAgICAgICBzaXplb2YoTWF0Y2hPYmplY3QpICsgc2xvdHMgKiBzaXplb2YoUHlfc3NpemVfdCkgLSBvZmZzZXQpOwogCiAgICAgcmV0dXJuIChQeU9iamVjdCopIGNvcHk7CiAjZWxzZQpAQCAtMzE0NCw3ICszMTQ5LDcgQEAKIHN0YXRpYyBQeVR5cGVPYmplY3QgTWF0Y2hfVHlwZSA9IHsKICAgICBQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKICAgICAwLCAiXyIgU1JFX01PRFVMRSAiLlNSRV9NYXRjaCIsCi0gICAgc2l6ZW9mKE1hdGNoT2JqZWN0KSwgc2l6ZW9mKGludCksCisgICAgc2l6ZW9mKE1hdGNoT2JqZWN0KSwgc2l6ZW9mKFB5X3NzaXplX3QpLAogICAgIChkZXN0cnVjdG9yKW1hdGNoX2RlYWxsb2MsIC8qdHBfZGVhbGxvYyovCiAgICAgMCwgLyp0cF9wcmludCovCiAgICAgKGdldGF0dHJmdW5jKW1hdGNoX2dldGF0dHIgLyp0cF9nZXRhdHRyKi8KQEAgLTMxNTYsNyArMzE2MSw3IEBACiAgICAgLyogY3JlYXRlIG1hdGNoIG9iamVjdCAoZnJvbSBzdGF0ZSBvYmplY3QpICovCiAKICAgICBNYXRjaE9iamVjdCogbWF0Y2g7Ci0gICAgaW50IGksIGo7CisgICAgUHlfc3NpemVfdCBpLCBqOwogICAgIGNoYXIqIGJhc2U7CiAgICAgaW50IG47CiAKQEAgLTMzMjksOSArMzMzNCw5IEBACiAgICAgU2Nhbm5lck9iamVjdCogc2VsZjsKIAogICAgIFB5T2JqZWN0KiBzdHJpbmc7Ci0gICAgaW50IHN0YXJ0ID0gMDsKLSAgICBpbnQgZW5kID0gSU5UX01BWDsKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98aWk6c2Nhbm5lciIsICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCisgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CisgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKKyAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98bm46c2Nhbm5lciIsICZzdHJpbmcsICZzdGFydCwgJmVuZCkpCiAgICAgICAgIHJldHVybiBOVUxMOwogCiAgICAgLyogY3JlYXRlIHNjYW5uZXIgb2JqZWN0ICovCmRpZmYgLS1naXQgYS9Nb2R1bGVzL19zc2wuYyBiL01vZHVsZXMvX3NzbC5jCmluZGV4IGY0OTM5MWQuLjNiOTFiMjQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvX3NzbC5jCisrKyBiL01vZHVsZXMvX3NzbC5jCkBAIC0yNiw2ICsyNiwxMiBAQAogLyogSW5jbHVkZSBzeW1ib2xzIGZyb20gX3NvY2tldCBtb2R1bGUgKi8KICNpbmNsdWRlICJzb2NrZXRtb2R1bGUuaCIKIAorI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpIAorI2luY2x1ZGUgPHBvbGwuaD4KKyNlbGlmIGRlZmluZWQoSEFWRV9TWVNfUE9MTF9IKQorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjZW5kaWYKKwogLyogSW5jbHVkZSBPcGVuU1NMIGhlYWRlciBmaWxlcyAqLwogI2luY2x1ZGUgIm9wZW5zc2wvcnNhLmgiCiAjaW5jbHVkZSAib3BlbnNzbC9jcnlwdG8uaCIKQEAgLTM1MSw3ICszNTcsNyBAQAogCVB5T2JqZWN0X0RlbChzZWxmKTsKIH0KIAotLyogSWYgdGhlIHNvY2tldCBoYXMgYSB0aW1lb3V0LCBkbyBhIHNlbGVjdCgpIG9uIHRoZSBzb2NrZXQuCisvKiBJZiB0aGUgc29ja2V0IGhhcyBhIHRpbWVvdXQsIGRvIGEgc2VsZWN0KCkvcG9sbCgpIG9uIHRoZSBzb2NrZXQuCiAgICBUaGUgYXJndW1lbnQgd3JpdGluZyBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbi4KICAgIFJldHVybnMgb25lIG9mIHRoZSBwb3NzaWJpbGl0aWVzIGluIHRoZSB0aW1lb3V0X3N0YXRlIGVudW0gKGFib3ZlKS4KICAqLwpAQCAtMzczLDYgKzM3OSwyNiBAQAogCWlmIChzLT5zb2NrX2ZkIDwgMCkKIAkJcmV0dXJuIFNPQ0tFVF9IQVNfQkVFTl9DTE9TRUQ7CiAKKwkvKiBQcmVmZXIgcG9sbCwgaWYgYXZhaWxhYmxlLCBzaW5jZSB5b3UgY2FuIHBvbGwoKSBhbnkgZmQKKwkgKiB3aGljaCBjYW4ndCBiZSBkb25lIHdpdGggc2VsZWN0KCkuICovCisjaWZkZWYgSEFWRV9QT0xMCisJeworCQlzdHJ1Y3QgcG9sbGZkIHBvbGxmZDsKKwkJaW50IHRpbWVvdXQ7CisKKwkJcG9sbGZkLmZkID0gcy0+c29ja19mZDsKKwkJcG9sbGZkLmV2ZW50cyA9IHdyaXRpbmcgPyBQT0xMT1VUIDogUE9MTElOOworCisJCS8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCisJCXRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsKKwkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUworCQlyYyA9IHBvbGwoJnBvbGxmZCwgMSwgdGltZW91dCk7CisJCVB5X0VORF9BTExPV19USFJFQURTCisKKwkJZ290byBub3JtYWxfcmV0dXJuOworCX0KKyNlbmRpZgorCiAJLyogR3VhcmQgYWdhaW5zdCBzb2NrZXQgdG9vIGxhcmdlIGZvciBzZWxlY3QqLwogI2lmbmRlZiBQeV9TT0NLRVRfRkRfQ0FOX0JFX0dFX0ZEX1NFVFNJWkUKIAlpZiAocy0+c29ja19mZCA+PSBGRF9TRVRTSVpFKQpAQCAtMzkzLDYgKzQxOSw3IEBACiAJCXJjID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCitub3JtYWxfcmV0dXJuOgogCS8qIFJldHVybiBTT0NLRVRfVElNRURfT1VUIG9uIHRpbWVvdXQsIFNPQ0tFVF9PUEVSQVRJT05fT0sgb3RoZXJ3aXNlCiAJICAgKHdoZW4gd2UgYXJlIGFibGUgdG8gd3JpdGUgb3Igd2hlbiB0aGVyZSdzIHNvbWV0aGluZyB0byByZWFkKSAqLwogCXJldHVybiByYyA9PSAwID8gU09DS0VUX0hBU19USU1FRF9PVVQgOiBTT0NLRVRfT1BFUkFUSU9OX09LOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fc3RydWN0LmMgYi9Nb2R1bGVzL19zdHJ1Y3QuYwppbmRleCBkZjI0M2VjLi44ZDBhM2JjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL19zdHJ1Y3QuYworKysgYi9Nb2R1bGVzL19zdHJ1Y3QuYwpAQCAtMzEsNiArMzEsMTcgQEAKIHN0YXRpYyBQeU9iamVjdCAqcHlpbnRfemVybyA9IE5VTEw7CiAjZW5kaWYKIAorLyogSWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRSBpcyBkZWZpbmVkLCB0aGUgc3RydWN0IG1vZHVsZSB3aWxsIGFsbG93IGZsb2F0CisgICBhcmd1bWVudHMgZm9yIGludGVnZXIgZm9ybWF0cyB3aXRoIGEgd2FybmluZyBmb3IgYmFja3dhcmRzCisgICBjb21wYXRpYmlsaXR5LiAqLworCisjZGVmaW5lIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UgMQorCisjaWZkZWYgUFlfU1RSVUNUX0ZMT0FUX0NPRVJDRQorI2RlZmluZSBGTE9BVF9DT0VSQ0UgImludGVnZXIgYXJndW1lbnQgZXhwZWN0ZWQsIGdvdCBmbG9hdCIKKyNlbmRpZgorCisKIC8qIFRoZSB0cmFuc2xhdGlvbiBmdW5jdGlvbiBmb3IgZWFjaCBmb3JtYXQgY2hhcmFjdGVyIGlzIHRhYmxlIGRyaXZlbiAqLwogdHlwZWRlZiBzdHJ1Y3QgX2Zvcm1hdGRlZiB7CiAJY2hhciBmb3JtYXQ7CkBAIC0xMzUsNiArMTQ2LDIxIEBACiB7CiAJbG9uZyB4ID0gUHlJbnRfQXNMb25nKHYpOwogCWlmICh4ID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKKyNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCisJCWlmIChQeUZsb2F0X0NoZWNrKHYpKSB7CisJCQlQeU9iamVjdCAqbzsKKwkJCWludCByZXM7CisJCQlQeUVycl9DbGVhcigpOworCQkJaWYgKFB5RXJyX1dhcm5FeChQeUV4Y19EZXByZWNhdGlvbldhcm5pbmcsIEZMT0FUX0NPRVJDRSwgMikgPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCW8gPSBQeU51bWJlcl9JbnQodik7CisJCQlpZiAobyA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKwkJCXJlcyA9IGdldF9sb25nKG8sIHApOworCQkJUHlfREVDUkVGKG8pOworCQkJcmV0dXJuIHJlczsKKwkJfQorI2VuZGlmCiAJCWlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpCiAJCQlQeUVycl9TZXRTdHJpbmcoU3RydWN0RXJyb3IsCiAJCQkJCSJyZXF1aXJlZCBhcmd1bWVudCBpcyBub3QgYW4gaW50ZWdlciIpOwpAQCAtMjE0LDE1ICsyNDAsMzMgQEAKIC8qIEhlbHBlciByb3V0aW5lIHRvIGdldCBhIFB5dGhvbiBpbnRlZ2VyIGFuZCByYWlzZSB0aGUgYXBwcm9wcmlhdGUgZXJyb3IKICAgIGlmIGl0IGlzbid0IG9uZSAqLwogCisjZGVmaW5lIElOVF9PVkVSRkxPVyAic3RydWN0IGludGVnZXIgb3ZlcmZsb3cgbWFza2luZyBpcyBkZXByZWNhdGVkIgorCiBzdGF0aWMgaW50CiBnZXRfd3JhcHBlZF9sb25nKFB5T2JqZWN0ICp2LCBsb25nICpwKQogewogCWlmIChnZXRfbG9uZyh2LCBwKSA8IDApIHsKLQkJaWYgKFB5TG9uZ19DaGVjayh2KSAmJiBQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX092ZXJmbG93RXJyb3IpKSB7CisJCWlmIChQeUxvbmdfQ2hlY2sodikgJiYKKwkJICAgIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpIHsKIAkJCVB5T2JqZWN0ICp3cmFwcGVkOwogCQkJbG9uZyB4OwogCQkJUHlFcnJfQ2xlYXIoKTsKLQkJCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgInN0cnVjdCBpbnRlZ2VyIG92ZXJmbG93IG1hc2tpbmcgaXMgZGVwcmVjYXRlZCIpIDwgMCkKKyNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCisJCQlpZiAoUHlGbG9hdF9DaGVjayh2KSkgeworCQkJCVB5T2JqZWN0ICpvOworCQkJCWludCByZXM7CisJCQkJUHlFcnJfQ2xlYXIoKTsKKwkJCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAyKSA8IDApCisJCQkJCXJldHVybiAtMTsKKwkJCQlvID0gUHlOdW1iZXJfSW50KHYpOworCQkJCWlmIChvID09IE5VTEwpCisJCQkJCXJldHVybiAtMTsKKwkJCQlyZXMgPSBnZXRfd3JhcHBlZF9sb25nKG8sIHApOworCQkJCVB5X0RFQ1JFRihvKTsKKwkJCQlyZXR1cm4gcmVzOworCQkJfQorI2VuZGlmCisJCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgSU5UX09WRVJGTE9XLCAyKSA8IDApCiAJCQkJcmV0dXJuIC0xOwogCQkJd3JhcHBlZCA9IFB5TnVtYmVyX0FuZCh2LCBweWxvbmdfdWxvbmdfbWFzayk7CiAJCQlpZiAod3JhcHBlZCA9PSBOVUxMKQpAQCAtMjQ2LDEwICsyOTAsMjUgQEAKIAlpZiAoeCA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKSB7CiAJCVB5T2JqZWN0ICp3cmFwcGVkOwogCQlQeUVycl9DbGVhcigpOworI2lmZGVmIFBZX1NUUlVDVF9GTE9BVF9DT0VSQ0UKKwkJaWYgKFB5RmxvYXRfQ2hlY2sodikpIHsKKwkJCVB5T2JqZWN0ICpvOworCQkJaW50IHJlczsKKwkJCVB5RXJyX0NsZWFyKCk7CisJCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgRkxPQVRfQ09FUkNFLCAyKSA8IDApCisJCQkJcmV0dXJuIC0xOworCQkJbyA9IFB5TnVtYmVyX0ludCh2KTsKKwkJCWlmIChvID09IE5VTEwpCisJCQkJcmV0dXJuIC0xOworCQkJcmVzID0gZ2V0X3dyYXBwZWRfdWxvbmcobywgcCk7CisJCQlQeV9ERUNSRUYobyk7CisJCQlyZXR1cm4gcmVzOworCQl9CisjZW5kaWYKIAkJd3JhcHBlZCA9IFB5TnVtYmVyX0FuZCh2LCBweWxvbmdfdWxvbmdfbWFzayk7CiAJCWlmICh3cmFwcGVkID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7Ci0JCWlmIChQeUVycl9XYXJuKFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgInN0cnVjdCBpbnRlZ2VyIG92ZXJmbG93IG1hc2tpbmcgaXMgZGVwcmVjYXRlZCIpIDwgMCkgeworCQlpZiAoUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywgSU5UX09WRVJGTE9XLCAyKSA8IDApIHsKIAkJCVB5X0RFQ1JFRih3cmFwcGVkKTsKIAkJCXJldHVybiAtMTsKIAkJfQpAQCAtMzQ0LDggKzQwMyw4IEBACiAJCVB5X1hERUNSRUYocHRyYWNlYmFjayk7CiAJCWlmIChtc2cgPT0gTlVMTCkKIAkJCXJldHVybiAtMTsKLQkJcnZhbCA9IFB5RXJyX1dhcm4oUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nLAotCQkJCSAgUHlTdHJpbmdfQVNfU1RSSU5HKG1zZykpOworCQlydmFsID0gUHlFcnJfV2FybkV4KFB5RXhjX0RlcHJlY2F0aW9uV2FybmluZywKKwkJCQkgICAgUHlTdHJpbmdfQVNfU1RSSU5HKG1zZyksIDIpOwogCQlQeV9ERUNSRUYobXNnKTsKIAkJaWYgKHJ2YWwgPT0gMCkKIAkJCXJldHVybiAwOwpAQCAtMTM5NiwyMyArMTQ1NSwxNyBAQAogCQljb25zdCBjaGFyICpyZXMgPSBzdGFydGZyb20gKyBjb2RlLT5vZmZzZXQ7CiAJCWlmIChlLT5mb3JtYXQgPT0gJ3MnKSB7CiAJCQl2ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUocmVzLCBjb2RlLT5zaXplKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CiAJCX0gZWxzZSBpZiAoZS0+Zm9ybWF0ID09ICdwJykgewogCQkJUHlfc3NpemVfdCBuID0gKih1bnNpZ25lZCBjaGFyKilyZXM7CiAJCQlpZiAobiA+PSBjb2RlLT5zaXplKQogCQkJCW4gPSBjb2RlLT5zaXplIC0gMTsKIAkJCXYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShyZXMgKyAxLCBuKTsKLQkJCWlmICh2ID09IE5VTEwpCi0JCQkJZ290byBmYWlsOwotCQkJUHlUdXBsZV9TRVRfSVRFTShyZXN1bHQsIGkrKywgdik7CiAJCX0gZWxzZSB7CiAJCQl2ID0gZS0+dW5wYWNrKHJlcywgZSk7Ci0JCQlpZiAodiA9PSBOVUxMKQotCQkJCWdvdG8gZmFpbDsKLQkJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOwogCQl9CisJCWlmICh2ID09IE5VTEwpCisJCQlnb3RvIGZhaWw7CisJCVB5VHVwbGVfU0VUX0lURU0ocmVzdWx0LCBpKyssIHYpOwogCX0KIAogCXJldHVybiByZXN1bHQ7CkBAIC0xNDM4LDcgKzE0OTEsOCBAQAogCWlmIChpbnB1dHN0ciA9PSBOVUxMIHx8ICFQeVN0cmluZ19DaGVjayhpbnB1dHN0cikgfHwKIAkJUHlTdHJpbmdfR0VUX1NJWkUoaW5wdXRzdHIpICE9IHNvc2VsZi0+c19zaXplKSB7CiAJCVB5RXJyX0Zvcm1hdChTdHJ1Y3RFcnJvciwKLQkJCSJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsIHNvc2VsZi0+c19zaXplKTsKKwkJCSJ1bnBhY2sgcmVxdWlyZXMgYSBzdHJpbmcgYXJndW1lbnQgb2YgbGVuZ3RoICV6ZCIsCisJCQlzb3NlbGYtPnNfc2l6ZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlyZXR1cm4gc191bnBhY2tfaW50ZXJuYWwoc29zZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoaW5wdXRzdHIpKTsKQEAgLTE1MDQsMTcgKzE1NTgsMTggQEAKIHNfcGFja19pbnRlcm5hbChQeVN0cnVjdE9iamVjdCAqc29zZWxmLCBQeU9iamVjdCAqYXJncywgaW50IG9mZnNldCwgY2hhciogYnVmKQogewogCWZvcm1hdGNvZGUgKmNvZGU7CisJLyogWFhYKG5ub3J3aXR6KTogd2h5IGRvZXMgaSBuZWVkIHRvIGJlIGEgbG9jYWw/ICBjYW4gd2UgdXNlCisJICAgdGhlIG9mZnNldCBwYXJhbWV0ZXIgb3IgZG8gd2UgbmVlZCB0aGUgd2lkZXIgd2lkdGg/ICovCiAJUHlfc3NpemVfdCBpOwogCiAJbWVtc2V0KGJ1ZiwgJ1wwJywgc29zZWxmLT5zX3NpemUpOwogCWkgPSBvZmZzZXQ7CiAJZm9yIChjb2RlID0gc29zZWxmLT5zX2NvZGVzOyBjb2RlLT5mbXRkZWYgIT0gTlVMTDsgY29kZSsrKSB7CiAJCVB5X3NzaXplX3QgbjsKLQkJUHlPYmplY3QgKnY7CisJCVB5T2JqZWN0ICp2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOwogCQljb25zdCBmb3JtYXRkZWYgKmUgPSBjb2RlLT5mbXRkZWY7CiAJCWNoYXIgKnJlcyA9IGJ1ZiArIGNvZGUtPm9mZnNldDsKIAkJaWYgKGUtPmZvcm1hdCA9PSAncycpIHsKLQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7CiAJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAogCQkJCQkJImFyZ3VtZW50IGZvciAncycgbXVzdCBiZSBhIHN0cmluZyIpOwpAQCAtMTUyNiw3ICsxNTgxLDYgQEAKIAkJCWlmIChuID4gMCkKIAkJCQltZW1jcHkocmVzLCBQeVN0cmluZ19BU19TVFJJTkcodiksIG4pOwogCQl9IGVsc2UgaWYgKGUtPmZvcm1hdCA9PSAncCcpIHsKLQkJCXYgPSBQeVR1cGxlX0dFVF9JVEVNKGFyZ3MsIGkrKyk7CiAJCQlpZiAoIVB5U3RyaW5nX0NoZWNrKHYpKSB7CiAJCQkJUHlFcnJfU2V0U3RyaW5nKFN0cnVjdEVycm9yLAogCQkJCQkJImFyZ3VtZW50IGZvciAncCcgbXVzdCBiZSBhIHN0cmluZyIpOwpAQCAtMTU0MSw3ICsxNTk1LDYgQEAKIAkJCQluID0gMjU1OwogCQkJKnJlcyA9IFB5X1NBRkVfRE9XTkNBU1QobiwgUHlfc3NpemVfdCwgdW5zaWduZWQgY2hhcik7CiAJCX0gZWxzZSB7Ci0JCQl2ID0gUHlUdXBsZV9HRVRfSVRFTShhcmdzLCBpKyspOwogCQkJaWYgKGUtPnBhY2socmVzLCB2LCBlKSA8IDApIHsKIAkJCQlpZiAoUHlMb25nX0NoZWNrKHYpICYmIFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfT3ZlcmZsb3dFcnJvcikpCiAJCQkJCVB5RXJyX1NldFN0cmluZyhTdHJ1Y3RFcnJvciwKQEAgLTE4MTgsNCArMTg3MSw4IEBACiAjaWZkZWYgUFlfU1RSVUNUX09WRVJGTE9XX01BU0tJTkcKIAlQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1BZX1NUUlVDVF9PVkVSRkxPV19NQVNLSU5HIiwgMSk7CiAjZW5kaWYKKyNpZmRlZiBQWV9TVFJVQ1RfRkxPQVRfQ09FUkNFCisJUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobSwgIl9QWV9TVFJVQ1RfRkxPQVRfQ09FUkNFIiwgMSk7CisjZW5kaWYKKwogfQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYyBiL01vZHVsZXMvX3Rlc3RjYXBpbW9kdWxlLmMKaW5kZXggNmI5ZGZmZC4uZjVmM2FiMiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9fdGVzdGNhcGltb2R1bGUuYworKysgYi9Nb2R1bGVzL190ZXN0Y2FwaW1vZHVsZS5jCkBAIC0yOTQsNiArMjk0LDE2IEBACiAKICNlbmRpZgkvKiBpZmRlZiBIQVZFX0xPTkdfTE9ORyAqLwogCisvKiBUZXN0IHR1cGxlIGFyZ3VtZW50IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBQeU9iamVjdCAqCitnZXRhcmdzX3R1cGxlKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlpbnQgYSwgYiwgYzsKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImkoaWkpIiwgJmEsICZiLCAmYykpCisJCXJldHVybiBOVUxMOworCXJldHVybiBQeV9CdWlsZFZhbHVlKCJpaWkiLCBhLCBiLCBjKTsKK30KKwogLyogRnVuY3Rpb25zIHRvIGNhbGwgUHlBcmdfUGFyc2VUdXBsZSB3aXRoIGludGVnZXIgZm9ybWF0IGNvZGVzLAogICAgYW5kIHJldHVybiB0aGUgcmVzdWx0LgogKi8KQEAgLTY5Niw2ICs3MDYsMTMgQEAKICN1bmRlZiBDSEVDS18xX0ZPUk1BVAogfQogCisvKiBUaGlzIGlzIGhlcmUgdG8gcHJvdmlkZSBhIGRvY3N0cmluZyBmb3IgdGVzdF9kZXNjci4gKi8KK3N0YXRpYyBQeU9iamVjdCAqCit0ZXN0X3dpdGhfZG9jc3RyaW5nKFB5T2JqZWN0ICpzZWxmKQoreworCVB5X1JFVFVSTl9OT05FOworfQorCiBzdGF0aWMgUHlNZXRob2REZWYgVGVzdE1ldGhvZHNbXSA9IHsKIAl7InJhaXNlX2V4Y2VwdGlvbiIsCXJhaXNlX2V4Y2VwdGlvbiwJCSBNRVRIX1ZBUkFSR1N9LAogCXsidGVzdF9jb25maWciLAkJKFB5Q0Z1bmN0aW9uKXRlc3RfY29uZmlnLAkgTUVUSF9OT0FSR1N9LApAQCAtNzA2LDcgKzcyMywxMCBAQAogCXsidGVzdF9rX2NvZGUiLAkJKFB5Q0Z1bmN0aW9uKXRlc3Rfa19jb2RlLAkgTUVUSF9OT0FSR1N9LAogCXsidGVzdF9udWxsX3N0cmluZ3MiLAkoUHlDRnVuY3Rpb24pdGVzdF9udWxsX3N0cmluZ3MsCSBNRVRIX05PQVJHU30sCiAJeyJ0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCIsIChQeUNGdW5jdGlvbil0ZXN0X3N0cmluZ19mcm9tX2Zvcm1hdCwgTUVUSF9OT0FSR1N9LAorCXsidGVzdF93aXRoX2RvY3N0cmluZyIsIChQeUNGdW5jdGlvbil0ZXN0X3dpdGhfZG9jc3RyaW5nLCBNRVRIX05PQVJHUywKKwkgUHlEb2NfU1RSKCJUaGlzIGlzIGEgcHJldHR5IG5vcm1hbCBkb2NzdHJpbmcuIil9LAogCisJeyJnZXRhcmdzX3R1cGxlIiwJZ2V0YXJnc190dXBsZSwJCQkgTUVUSF9WQVJBUkdTfSwKIAl7ImdldGFyZ3NfYiIsCQlnZXRhcmdzX2IsCQkJIE1FVEhfVkFSQVJHU30sCiAJeyJnZXRhcmdzX0IiLAkJZ2V0YXJnc19CLAkJCSBNRVRIX1ZBUkFSR1N9LAogCXsiZ2V0YXJnc19IIiwJCWdldGFyZ3NfSCwJCQkgTUVUSF9WQVJBUkdTfSwKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3RraW50ZXIuYyBiL01vZHVsZXMvX3RraW50ZXIuYwppbmRleCBjZWM4M2Y1Li4wODhmYmI5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL190a2ludGVyLmMKKysrIGIvTW9kdWxlcy9fdGtpbnRlci5jCkBAIC05MzIsMTIgKzkzMiwxMyBAQAogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2sodmFsdWUpKSB7CiAJCVB5X1VOSUNPREUgKmluYnVmID0gUHlVbmljb2RlX0FTX1VOSUNPREUodmFsdWUpOwotCQlpbnQgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7CisJCVB5X3NzaXplX3Qgc2l6ZSA9IFB5VW5pY29kZV9HRVRfU0laRSh2YWx1ZSk7CiAJCS8qIFRoaXMgI2lmZGVmIGFzc3VtZXMgdGhhdCBUY2wgdXNlcyBVQ1MtMi4KIAkJICAgU2VlIFRDTF9VVEZfTUFYIHRlc3QgYWJvdmUuICovCiAjaWYgZGVmaW5lZChQeV9VTklDT0RFX1dJREUpICYmIFRDTF9VVEZfTUFYID09IDMKIAkJVGNsX1VuaUNoYXIgKm91dGJ1ZjsKLQkJaW50IGk7CisJCVB5X3NzaXplX3QgaTsKKwkJYXNzZXJ0KHNpemUgPCBzaXplICogc2l6ZW9mKFRjbF9VbmlDaGFyKSk7CiAJCW91dGJ1ZiA9IChUY2xfVW5pQ2hhciopY2thbGxvYyhzaXplICogc2l6ZW9mKFRjbF9VbmlDaGFyKSk7CiAJCWlmICghb3V0YnVmKSB7CiAJCQlQeUVycl9Ob01lbW9yeSgpOwpAQCAtMjEwMyw4ICsyMTA0LDggQEAKIAlkYXRhID0gUHlNZW1fTkVXKFB5dGhvbkNtZF9DbGllbnREYXRhLCAxKTsKIAlpZiAoIWRhdGEpCiAJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCVB5X1hJTkNSRUYoc2VsZik7Ci0JUHlfWElOQ1JFRihmdW5jKTsKKwlQeV9JTkNSRUYoc2VsZik7CisJUHlfSU5DUkVGKGZ1bmMpOwogCWRhdGEtPnNlbGYgPSBzZWxmcHRyOwogCWRhdGEtPmZ1bmMgPSBmdW5jOwogCQpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9fdHlwZXNtb2R1bGUuYyBiL01vZHVsZXMvX3R5cGVzbW9kdWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2ZjJiOQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvX3R5cGVzbW9kdWxlLmMKQEAgLTAsMCArMSw5NCBAQAorLyogVGhpcyBleHRlbnNpb24gbW9kdWxlIGV4cG9zZXMgc29tZSB0eXBlcyB0aGF0IGFyZSBvbmx5IGF2YWlsYWJsZSBhdCB0aGUKKyAqIEMgbGV2ZWwuICBJdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIHRocm91Z2ggdGhlIFB5dGhvbgorICogbGV2ZWwgdHlwZXMgbW9kdWxlcywgd2hpY2ggaW1wb3J0cyB0aGlzLgorICovCisKKyNpbmNsdWRlICJQeXRob24uaCIKKyNpbmNsdWRlICJzdHJ1Y3RtZW1iZXIuaCIKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBQeU9iamVjdF9IRUFECisgICAgaW50IG1lbWJlcjsKK30gSGVscGVyOworCitzdGF0aWMgUHlNZW1iZXJEZWYgaGVscGVyX21lbWJlcnNbXSA9IHsKKyAgICB7ICJtZW1iZXIiLCBUX0lOVCwgIG9mZnNldG9mKEhlbHBlciwgbWVtYmVyKSwgUkVBRE9OTFksCisgICAgICBQeURvY19TVFIoIkEgbWVtYmVyIGRlc2NyaXB0b3IiKQorICAgIH0sCisgICAgeyBOVUxMIH0KK307CisKK3N0YXRpYyBQeU9iamVjdCAqCitoZWxwZXJfZ2V0dGVyKEhlbHBlciAqc2VsZiwgdm9pZCAqdW51c2VkKSAKK3sKKyAgICBQeV9SRVRVUk5fTk9ORTsKK30KKworc3RhdGljIFB5R2V0U2V0RGVmIGhlbHBlcl9nZXRzZXRbXSA9IHsKKyAgICB7ICJnZXR0ZXIiLCAoZ2V0dGVyKWhlbHBlcl9nZXR0ZXIsIE5VTEwsCisgICAgICBQeURvY19TVFIoIkEgZ2V0c2V0IGRlc2NyaXB0b3IiKSwKKyAgICB9LAorICAgIHsgTlVMTCB9Cit9OworCitzdGF0aWMgUHlUeXBlT2JqZWN0IEhlbHBlclR5cGUgPSB7CisgICAgUHlPYmplY3RfSEVBRF9JTklUKE5VTEwpCisgICAgMCwJCQkJCQkvKiBvYl9zaXplICovCisgICAgIl90eXBlcy5IZWxwZXIiLAkJCQkvKiB0cF9uYW1lICovCisgICAgc2l6ZW9mKEhlbHBlciksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9iYXNpY3NpemUgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2l0ZW1zaXplICovCisgICAgMCwJCQkJCQkvKiB0cF9kZWFsbG9jICovCisgICAgMCwJCQkJCQkvKiB0cF9wcmludCAqLworICAgIDAsCQkJCQkJLyogdHBfZ2V0YXR0ciAqLworICAgIDAsCQkJCQkJLyogdHBfc2V0YXR0ciAqLworICAgIDAsCQkJCQkJLyogdHBfY29tcGFyZSAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmVwciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCisgICAgMCwJCQkJCQkvKiB0cF9hc19zZXF1ZW5jZSAqLworICAgIDAsCQkJCQkJLyogdHBfYXNfbWFwcGluZyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLworICAgIDAsICAgICAgICAgICAgICAJCQkJLyogdHBfY2FsbCAqLworICAgIDAsICAgICAgICAgIAkJCQkvKiB0cF9zdHIgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldGF0dHJvICovCisgICAgMCwJCQkJCQkvKiB0cF9zZXRhdHRybyAqLworICAgIDAsCQkJCQkJLyogdHBfYXNfYnVmZmVyICovCisgICAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9mbGFncyAqLworICAgIDAsICAgICAgCQkJCQkvKiB0cF9kb2MgKi8KKyAgICAwLAkJCQkJCS8qIHRwX3RyYXZlcnNlICovCisgICAgMCwJCQkJCQkvKiB0cF9jbGVhciAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KKyAgICAwLAkJCQkJCS8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisgICAgMCwJCQkJCQkvKiB0cF9pdGVyICovCisgICAgMCwJCQkJCQkvKiB0cF9pdGVybmV4dCAqLworICAgIDAsICAgICAgCQkJCQkvKiB0cF9tZXRob2RzICovCisgICAgaGVscGVyX21lbWJlcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCisgICAgaGVscGVyX2dldHNldCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRzZXQgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2Jhc2UgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2RpY3QgKi8KKyAgICAwLAkJCQkJCS8qIHRwX2Rlc2NyX2dldCAqLworICAgIDAsCQkJCQkJLyogdHBfZGVzY3Jfc2V0ICovCisgICAgMCwJCQkJCQkvKiB0cF9kaWN0b2Zmc2V0ICovCisgICAgMCwJCQkJCQkvKiB0cF9pbml0ICovCisgICAgMCwJCQkJCQkvKiB0cF9hbGxvYyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCisgICAgMCwJCQkJCQkvKiB0cF9mcmVlICovCit9OworCitQeU1PRElOSVRfRlVOQworaW5pdF90eXBlcyh2b2lkKQoreworICAgIFB5T2JqZWN0ICptOworCisgICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfdHlwZXMiLCBOVUxMLCAiQSB0eXBlcyBtb2R1bGUgaGVscGVyIik7CisgICAgaWYgKCFtKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoUHlUeXBlX1JlYWR5KCZIZWxwZXJUeXBlKSA8IDApCisgICAgICAgIHJldHVybjsKKworICAgIFB5X0lOQ1JFRigmSGVscGVyVHlwZSk7CisgICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJIZWxwZXIiLCAoUHlPYmplY3QgKikmSGVscGVyVHlwZSk7Cit9CisKKyAgICAKZGlmZiAtLWdpdCBhL01vZHVsZXMvX3dlYWtyZWYuYyBiL01vZHVsZXMvX3dlYWtyZWYuYwppbmRleCAyZGZkYzE0Li4xNzEyZjEyIDEwMDY0NAotLS0gYS9Nb2R1bGVzL193ZWFrcmVmLmMKKysrIGIvTW9kdWxlcy9fd2Vha3JlZi5jCkBAIC0xNyw3ICsxNyw3IEBACiAgICAgaWYgKFB5VHlwZV9TVVBQT1JUU19XRUFLUkVGUyhvYmplY3QtPm9iX3R5cGUpKSB7CiAgICAgICAgIFB5V2Vha1JlZmVyZW5jZSAqKmxpc3QgPSBHRVRfV0VBS1JFRlNfTElTVFBUUihvYmplY3QpOwogCi0gICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKF9QeVdlYWtyZWZfR2V0V2Vha3JlZkNvdW50KCpsaXN0KSk7CisgICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Tc2l6ZV90KF9QeVdlYWtyZWZfR2V0V2Vha3JlZkNvdW50KCpsaXN0KSk7CiAgICAgfQogICAgIGVsc2UKICAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoMCk7CkBAIC0zNywxMiArMzcsMTIgQEAKIAogICAgIGlmIChQeVR5cGVfU1VQUE9SVFNfV0VBS1JFRlMob2JqZWN0LT5vYl90eXBlKSkgewogICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKipsaXN0ID0gR0VUX1dFQUtSRUZTX0xJU1RQVFIob2JqZWN0KTsKLSAgICAgICAgbG9uZyBjb3VudCA9IF9QeVdlYWtyZWZfR2V0V2Vha3JlZkNvdW50KCpsaXN0KTsKKyAgICAgICAgUHlfc3NpemVfdCBjb3VudCA9IF9QeVdlYWtyZWZfR2V0V2Vha3JlZkNvdW50KCpsaXN0KTsKIAogICAgICAgICByZXN1bHQgPSBQeUxpc3RfTmV3KGNvdW50KTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBQeVdlYWtSZWZlcmVuY2UgKmN1cnJlbnQgPSAqbGlzdDsKLSAgICAgICAgICAgIGxvbmcgaTsKKyAgICAgICAgICAgIFB5X3NzaXplX3QgaTsKICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CiAgICAgICAgICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKHJlc3VsdCwgaSwgKFB5T2JqZWN0ICopIGN1cnJlbnQpOwogICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihjdXJyZW50KTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvYXJyYXltb2R1bGUuYyBiL01vZHVsZXMvYXJyYXltb2R1bGUuYwppbmRleCAxMDBiMzQxLi5iNzM5Y2M4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2FycmF5bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9hcnJheW1vZHVsZS5jCkBAIC0xMCw5ICsxMCw5IEBACiAjaWZkZWYgU1REQ19IRUFERVJTCiAjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZWxzZSAvKiAhU1REQ19IRUFERVJTICovCi0jaWZuZGVmIERPTlRfSEFWRV9TWVNfVFlQRVNfSAorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4JCS8qIEZvciBzaXplX3QgKi8KLSNlbmRpZiAvKiBET05UX0hBVkVfU1lTX1RZUEVTX0ggKi8KKyNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCiAjZW5kaWYgLyogIVNURENfSEVBREVSUyAqLwogCiBzdHJ1Y3QgYXJyYXlvYmplY3Q7IC8qIEZvcndhcmQgKi8KQEAgLTE3ODUsNiArMTc4NSw3IEBACiAJKHJlYWRidWZmZXJwcm9jKWFycmF5X2J1ZmZlcl9nZXRyZWFkYnVmLAogCSh3cml0ZWJ1ZmZlcnByb2MpYXJyYXlfYnVmZmVyX2dldHdyaXRlYnVmLAogCShzZWdjb3VudHByb2MpYXJyYXlfYnVmZmVyX2dldHNlZ2NvdW50LAorCU5VTEwsCiB9OwogCiBzdGF0aWMgUHlPYmplY3QgKgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9iaW5hc2NpaS5jIGIvTW9kdWxlcy9iaW5hc2NpaS5jCmluZGV4IDcxYTk2MjQuLjNiMmM4YjIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvYmluYXNjaWkuYworKysgYi9Nb2R1bGVzL2JpbmFzY2lpLmMKQEAgLTkwOSw3ICs5MDksNyBAQAogCWNoYXIqIHJldGJ1ZjsKIAlQeV9zc2l6ZV90IGksIGo7CiAKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInQjOmIyYV9oZXgiLCAmYXJnYnVmLCAmYXJnbGVuKSkKKwlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjOmIyYV9oZXgiLCAmYXJnYnVmLCAmYXJnbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR2YWwgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBhcmdsZW4qMik7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jIGIvTW9kdWxlcy9iejJtb2R1bGUuYwppbmRleCA5NTc2ODk1Li5iMDA3NWEwIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2J6Mm1vZHVsZS5jCisrKyBiL01vZHVsZXMvYnoybW9kdWxlLmMKQEAgLTEzMDMsNyArMTMwMywxMSBAQAogCQkJCWJyZWFrOwogCiAJCQljYXNlICdVJzoKKyNpZmRlZiBfX1ZNUworCQkJCXNlbGYtPmZfdW5pdl9uZXdsaW5lID0gMDsKKyNlbHNlCiAJCQkJc2VsZi0+Zl91bml2X25ld2xpbmUgPSAxOworI2VuZGlmCiAJCQkJYnJlYWs7CiAKIAkJCWRlZmF1bHQ6CkBAIC0xMzM2LDggKzEzNDAsMTAgQEAKIAogI2lmZGVmIFdJVEhfVEhSRUFECiAJc2VsZi0+bG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKLQlpZiAoIXNlbGYtPmxvY2spCisJaWYgKCFzZWxmLT5sb2NrKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19NZW1vcnlFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBsb2NrIik7CiAJCWdvdG8gZXJyb3I7CisJfQogI2VuZGlmCiAKIAlpZiAobW9kZV9jaGFyID09ICdyJykKQEAgLTEzNTksMTAgKzEzNjUsMTIgQEAKIAlyZXR1cm4gMDsKIAogZXJyb3I6Ci0JUHlfREVDUkVGKHNlbGYtPmZpbGUpOworCVB5X0NMRUFSKHNlbGYtPmZpbGUpOwogI2lmZGVmIFdJVEhfVEhSRUFECi0JaWYgKHNlbGYtPmxvY2spCisJaWYgKHNlbGYtPmxvY2spIHsKIAkJUHlUaHJlYWRfZnJlZV9sb2NrKHNlbGYtPmxvY2spOworCQlzZWxmLT5sb2NrID0gTlVMTDsKKwl9CiAjZW5kaWYKIAlyZXR1cm4gLTE7CiB9CkBAIC0xNTYyLDcgKzE1NzAsNyBAQAogCQl9CiAJfQogCi0JX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoaW50KShCWlNfVE9UQUxfT1VUKGJ6cykgLSB0b3RhbG91dCkpOworCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKFB5X3NzaXplX3QpKEJaU19UT1RBTF9PVVQoYnpzKSAtIHRvdGFsb3V0KSk7CiAKIAlSRUxFQVNFX0xPQ0soc2VsZik7CiAJcmV0dXJuIHJldDsKQEAgLTE2MjgsNyArMTYzNiw3IEBACiAJfQogCiAJaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKGludCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKKwkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKIAogCVJFTEVBU0VfTE9DSyhzZWxmKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTY3MCw4ICsxNjc4LDEwIEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogCXNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKCFzZWxmLT5sb2NrKQorCWlmICghc2VsZi0+bG9jaykgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwogCQlnb3RvIGVycm9yOworCX0KICNlbmRpZgogCiAJbWVtc2V0KCZzZWxmLT5ienMsIDAsIHNpemVvZihiel9zdHJlYW0pKTsKQEAgLTE2ODYsOCArMTY5NiwxMCBAQAogCXJldHVybiAwOwogZXJyb3I6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKKwlpZiAoc2VsZi0+bG9jaykgewogCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisJCXNlbGYtPmxvY2sgPSBOVUxMOworCX0KICNlbmRpZgogCXJldHVybiAtMTsKIH0KQEAgLTE4NTIsNyArMTg2NCw3IEBACiAJfQogCiAJaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKGludCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKKwkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdCkoQlpTX1RPVEFMX09VVChienMpIC0gdG90YWxvdXQpKTsKIAogCVJFTEVBU0VfTE9DSyhzZWxmKTsKIAlyZXR1cm4gcmV0OwpAQCAtMTg4Miw4ICsxODk0LDEwIEBACiAKICNpZmRlZiBXSVRIX1RIUkVBRAogCXNlbGYtPmxvY2sgPSBQeVRocmVhZF9hbGxvY2F0ZV9sb2NrKCk7Ci0JaWYgKCFzZWxmLT5sb2NrKQorCWlmICghc2VsZi0+bG9jaykgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfTWVtb3J5RXJyb3IsICJ1bmFibGUgdG8gYWxsb2NhdGUgbG9jayIpOwogCQlnb3RvIGVycm9yOworCX0KICNlbmRpZgogCiAJc2VsZi0+dW51c2VkX2RhdGEgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCIiKTsKQEAgLTE5MDMsMTAgKzE5MTcsMTIgQEAKIAogZXJyb3I6CiAjaWZkZWYgV0lUSF9USFJFQUQKLQlpZiAoc2VsZi0+bG9jaykKKwlpZiAoc2VsZi0+bG9jaykgewogCQlQeVRocmVhZF9mcmVlX2xvY2soc2VsZi0+bG9jayk7CisJCXNlbGYtPmxvY2sgPSBOVUxMOworCX0KICNlbmRpZgotCVB5X1hERUNSRUYoc2VsZi0+dW51c2VkX2RhdGEpOworCVB5X0NMRUFSKHNlbGYtPnVudXNlZF9kYXRhKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTIwNjEsNyArMjA3Nyw3IEBACiAJfQogCiAJaWYgKGJ6cy0+YXZhaWxfb3V0ICE9IDApCi0JCV9QeVN0cmluZ19SZXNpemUoJnJldCwgKGludClCWlNfVE9UQUxfT1VUKGJ6cykpOworCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChQeV9zc2l6ZV90KUJaU19UT1RBTF9PVVQoYnpzKSk7CiAJQloyX2J6Q29tcHJlc3NFbmQoYnpzKTsKIAogCXJldHVybiByZXQ7CkBAIC0yMTQwLDcgKzIxNTYsNyBAQAogCX0KIAogCWlmIChienMtPmF2YWlsX291dCAhPSAwKQotCQlfUHlTdHJpbmdfUmVzaXplKCZyZXQsIChpbnQpQlpTX1RPVEFMX09VVChienMpKTsKKwkJX1B5U3RyaW5nX1Jlc2l6ZSgmcmV0LCAoUHlfc3NpemVfdClCWlNfVE9UQUxfT1VUKGJ6cykpOwogCUJaMl9iekRlY29tcHJlc3NFbmQoYnpzKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2NQaWNrbGUuYyBiL01vZHVsZXMvY1BpY2tsZS5jCmluZGV4IDBkMjkzNjIuLjI0Yzk4Y2MgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY1BpY2tsZS5jCisrKyBiL01vZHVsZXMvY1BpY2tsZS5jCkBAIC0xOTYsNyArMTk2LDcgQEAKIAlmb3IgKGkgPSBzZWxmLT5sZW5ndGgsIHAgPSBzZWxmLT5kYXRhICsgY2xlYXJ0bzsKIAkgICAgIC0taSA+PSBjbGVhcnRvOwogCSAgICAgcCsrKSB7Ci0JCVB5X0RFQ1JFRigqcCk7CisJCVB5X0NMRUFSKCpwKTsKIAl9CiAJc2VsZi0+bGVuZ3RoID0gY2xlYXJ0bzsKIApAQCAtMjA4LDYgKzIwOCw3IEBACiB7CiAJaW50IGJpZ2dlcjsKIAlzaXplX3QgbmJ5dGVzOworCVB5T2JqZWN0ICoqdG1wOwogCiAJYmlnZ2VyID0gc2VsZi0+c2l6ZSA8PCAxOwogCWlmIChiaWdnZXIgPD0gMCkJLyogd2FzIDAsIG9yIG5ldyB2YWx1ZSBvdmVyZmxvd3MgKi8KQEAgLTIxNywxNCArMjE4LDE0IEBACiAJbmJ5dGVzID0gKHNpemVfdCliaWdnZXIgKiBzaXplb2YoUHlPYmplY3QgKik7CiAJaWYgKG5ieXRlcyAvIHNpemVvZihQeU9iamVjdCAqKSAhPSAoc2l6ZV90KWJpZ2dlcikKIAkJZ290byBub21lbW9yeTsKLQlzZWxmLT5kYXRhID0gcmVhbGxvYyhzZWxmLT5kYXRhLCBuYnl0ZXMpOwotCWlmIChzZWxmLT5kYXRhID09IE5VTEwpCisJdG1wID0gcmVhbGxvYyhzZWxmLT5kYXRhLCBuYnl0ZXMpOworCWlmICh0bXAgPT0gTlVMTCkKIAkJZ290byBub21lbW9yeTsKKwlzZWxmLT5kYXRhID0gdG1wOwogCXNlbGYtPnNpemUgPSBiaWdnZXI7CiAJcmV0dXJuIDA7CiAKICAgbm9tZW1vcnk6Ci0Jc2VsZi0+c2l6ZSA9IDA7CiAJUHlFcnJfTm9NZW1vcnkoKTsKIAlyZXR1cm4gLTE7CiB9CkBAIC0yNjM2LDcgKzI2MzcsNyBAQAogCQkJaWYgKGlrID49IGxtIHx8IGlrID09IDApIHsKIAkJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKIAkJCQkJCSJJbnZhbGlkIGdldCBkYXRhIik7Ci0JCQkJcmV0dXJuIE5VTEw7CisJCQkJZ290byBlcnI7CiAJCQl9CiAJCQlpZiAoaGF2ZV9nZXRbaWtdKSAvKiB3aXRoIG1hdGNoaW5nIGdldCAqLwogCQkJCXJzaXplICs9IGlrIDwgMjU2ID8gMiA6IDU7CkBAIC0yNjQ4LDcgKzI2NDksNyBAQAogCQkJKSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUGlja2xpbmdFcnJvciwKIAkJCQkJIlVuZXhwZWN0ZWQgZGF0YSBpbiBpbnRlcm5hbCBsaXN0Iik7Ci0JCQlyZXR1cm4gTlVMTDsKKwkJCWdvdG8gZXJyOwogCQl9CiAKIAkJZWxzZSB7IC8qIHB1dCAqLwpAQCAtMzQwMCwxMSArMzQwMSwxMSBAQAogCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCXN0ciA9IFB5U3RyaW5nX0RlY29kZUVzY2FwZShwLCBsZW4sIE5VTEwsIDAsIE5VTEwpOworCWZyZWUocyk7CiAJaWYgKHN0cikgewogCQlQREFUQV9QVVNIKHNlbGYtPnN0YWNrLCBzdHIsIC0xKTsKIAkJcmVzID0gMDsKIAl9Ci0JZnJlZShzKTsKIAlyZXR1cm4gcmVzOwogCiAgIGluc2VjdXJlOgpAQCAtMzYyOCwxMCArMzYyOSwxNCBAQAogCiAgIGVycjoKIAl7Ci0JCVB5T2JqZWN0ICp0cCwgKnYsICp0YjsKKwkJUHlPYmplY3QgKnRwLCAqdiwgKnRiLCAqdG1wX3ZhbHVlOwogCiAJCVB5RXJyX0ZldGNoKCZ0cCwgJnYsICZ0Yik7Ci0JCWlmICgocj1QeVR1cGxlX1BhY2soMyx2LGNscyxhcmdzKSkpIHsKKwkJdG1wX3ZhbHVlID0gdjsKKwkJLyogTlVMTCBvY2N1cnMgd2hlbiB0aGVyZSB3YXMgYSBLZXlib2FyZEludGVycnVwdCAqLworCQlpZiAodG1wX3ZhbHVlID09IE5VTEwpCisJCQl0bXBfdmFsdWUgPSBQeV9Ob25lOworCQlpZiAoKHIgPSBQeVR1cGxlX1BhY2soMywgdG1wX3ZhbHVlLCBjbHMsIGFyZ3MpKSkgewogCQkJUHlfWERFQ1JFRih2KTsKIAkJCXY9cjsKIAkJfQpAQCAtNDE1OSw2ICs0MTY0LDcgQEAKIAkJaW50IGxpc3RfbGVuOwogCiAJCXNsaWNlPVBkYXRhX3BvcExpc3Qoc2VsZi0+c3RhY2ssIHgpOworCQlpZiAoISBzbGljZSkgcmV0dXJuIC0xOwogCQlsaXN0X2xlbiA9IFB5TGlzdF9HRVRfU0laRShsaXN0KTsKIAkJaT1QeUxpc3RfU2V0U2xpY2UobGlzdCwgbGlzdF9sZW4sIGxpc3RfbGVuLCBzbGljZSk7CiAJCVB5X0RFQ1JFRihzbGljZSk7CkBAIC01MTYzLDYgKzUxNjksOSBAQAogCWlmICghKCBzZWxmLT5tZW1vID0gUHlEaWN0X05ldygpKSkKIAkJZ290byBlcnI7CiAKKwlpZiAoIXNlbGYtPnN0YWNrKQorCQlnb3RvIGVycjsKKwogCVB5X0lOQ1JFRihmKTsKIAlzZWxmLT5maWxlID0gZjsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jIGIvTW9kdWxlcy9jb2xsZWN0aW9uc21vZHVsZS5jCmluZGV4IDBjN2RjYTYuLmQ3NjFkY2UgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29sbGVjdGlvbnNtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NvbGxlY3Rpb25zbW9kdWxlLmMKQEAgLTEwLDcgKzEwLDcgQEAKIC8qIFRoZSBibG9jayBsZW5ndGggbWF5IGJlIHNldCB0byBhbnkgbnVtYmVyIG92ZXIgMS4gIExhcmdlciBudW1iZXJzCiAgKiByZWR1Y2UgdGhlIG51bWJlciBvZiBjYWxscyB0byB0aGUgbWVtb3J5IGFsbG9jYXRvciBidXQgdGFrZSBtb3JlCiAgKiBtZW1vcnkuICBJZGVhbGx5LCBCTE9DS0xFTiBzaG91bGQgYmUgc2V0IHdpdGggYW4gZXllIHRvIHRoZQotICogbGVuZ3RoIG9mIGEgY2FjaGUgbGluZS4gIAorICogbGVuZ3RoIG9mIGEgY2FjaGUgbGluZS4KICAqLwogCiAjZGVmaW5lIEJMT0NLTEVOIDYyCkBAIC0yMiw5ICsyMiw5IEBACiAgKiBlbGVtZW50IGlzIGF0IGQubGVmdGJsb2NrW2xlZnRpbmRleF0gYW5kIGl0cyBsYXN0IGVsZW1lbnQgaXMgYXQKICAqIGQucmlnaHRibG9ja1tyaWdodGluZGV4XTsgbm90ZSB0aGF0LCB1bmxpa2UgYXMgZm9yIFB5dGhvbiBzbGljZQogICogaW5kaWNlcywgdGhlc2UgaW5kaWNlcyBhcmUgaW5jbHVzaXZlIG9uIGJvdGggZW5kcy4gIEJ5IGJlaW5nIGluY2x1c2l2ZQotICogb24gYm90aCBlbmRzLCBhbGdvcml0aG1zIGZvciBsZWZ0IGFuZCByaWdodCBvcGVyYXRpb25zIGJlY29tZSAKKyAqIG9uIGJvdGggZW5kcywgYWxnb3JpdGhtcyBmb3IgbGVmdCBhbmQgcmlnaHQgb3BlcmF0aW9ucyBiZWNvbWUKICAqIHN5bW1ldHJpY2FsIHdoaWNoIHNpbXBsaWZpZXMgdGhlIGRlc2lnbi4KLSAqIAorICoKICAqIFRoZSBsaXN0IG9mIGJsb2NrcyBpcyBuZXZlciBlbXB0eSwgc28gZC5sZWZ0YmxvY2sgYW5kIGQucmlnaHRibG9jawogICogYXJlIG5ldmVyIGVxdWFsIHRvIE5VTEwuCiAgKgpAQCAtMzcsMTEgKzM3LDExIEBACiAgKiBkLmxlZnRpbmRleCA9PSBDRU5URVIrMTsgYW5kIGQucmlnaHRpbmRleCA9PSBDRU5URVIuCiAgKiBDaGVja2luZyBmb3IgZC5sZW4gPT0gMCBpcyB0aGUgaW50ZW5kZWQgd2F5IHRvIHNlZSB3aGV0aGVyIGQgaXMgZW1wdHkuCiAgKgotICogV2hlbmV2ZXIgZC5sZWZ0YmxvY2sgPT0gZC5yaWdodGJsb2NrLCAKKyAqIFdoZW5ldmVyIGQubGVmdGJsb2NrID09IGQucmlnaHRibG9jaywKICAqICAgICBkLmxlZnRpbmRleCArIGQubGVuIC0gMSA9PSBkLnJpZ2h0aW5kZXguCi0gKiAKKyAqCiAgKiBIb3dldmVyLCB3aGVuIGQubGVmdGJsb2NrICE9IGQucmlnaHRibG9jaywgZC5sZWZ0aW5kZXggYW5kIGQucmlnaHRpbmRleAotICogYmVjb21lIGluZGljZXMgaW50byBkaXN0aW5jdCBibG9ja3MgYW5kIGVpdGhlciBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlIAorICogYmVjb21lIGluZGljZXMgaW50byBkaXN0aW5jdCBibG9ja3MgYW5kIGVpdGhlciBtYXkgYmUgbGFyZ2VyIHRoYW4gdGhlCiAgKiBvdGhlci4KICAqLwogCkBAIC0zODEsNyArMzgxLDcgQEAKIAkJaW50IGNtcCA9IFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbChpdGVtLCB2YWx1ZSwgUHlfRVEpOwogCiAJCWlmIChkZXF1ZS0+bGVuICE9IG4pIHsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLCAKKwkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19JbmRleEVycm9yLAogCQkJCSJkZXF1ZSBtdXRhdGVkIGR1cmluZyByZW1vdmUoKS4iKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CkBAIC05MjAsNyArOTIwLDcgQEAKIAkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5yaWdodGJsb2NrICYmIAorCWFzc2VydCAoIShpdC0+YiA9PSBpdC0+ZGVxdWUtPnJpZ2h0YmxvY2sgJiYKIAkJICBpdC0+aW5kZXggPiBpdC0+ZGVxdWUtPnJpZ2h0aW5kZXgpKTsKIAogCWl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOwpAQCAtMTAxNiw3ICsxMDE2LDcgQEAKIAkJCQkiZGVxdWUgbXV0YXRlZCBkdXJpbmcgaXRlcmF0aW9uIik7CiAJCXJldHVybiBOVUxMOwogCX0KLQlhc3NlcnQgKCEoaXQtPmIgPT0gaXQtPmRlcXVlLT5sZWZ0YmxvY2sgJiYgCisJYXNzZXJ0ICghKGl0LT5iID09IGl0LT5kZXF1ZS0+bGVmdGJsb2NrICYmCiAJCSAgaXQtPmluZGV4IDwgaXQtPmRlcXVlLT5sZWZ0aW5kZXgpKTsKIAogCWl0ZW0gPSBpdC0+Yi0+ZGF0YVtpdC0+aW5kZXhdOwpAQCAtMTExNyw3ICsxMTE3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBkZWZkaWN0X3JlZHVjZShkZWZkaWN0b2JqZWN0ICpkZCkKIHsKLQkvKiBfX3JlZHVjZV9fIG11c3QgcmV0dXJucyBhIDUtdHVwbGUgYXMgZm9sbG93czoKKwkvKiBfX3JlZHVjZV9fIG11c3QgcmV0dXJuIGEgNS10dXBsZSBhcyBmb2xsb3dzOgogCiAJICAgLSBmYWN0b3J5IGZ1bmN0aW9uCiAJICAgLSB0dXBsZSBvZiBhcmdzIGZvciB0aGUgZmFjdG9yeSBmdW5jdGlvbgpAQCAtMTE1NSw2ICsxMTU1LDcgQEAKIAl9CiAJcmVzdWx0ID0gUHlUdXBsZV9QYWNrKDUsIGRkLT5kaWN0Lm9iX3R5cGUsIGFyZ3MsCiAJCQkgICAgICBQeV9Ob25lLCBQeV9Ob25lLCBpdGVtcyk7CisJUHlfREVDUkVGKGl0ZW1zKTsKIAlQeV9ERUNSRUYoYXJncyk7CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL01vZHVsZXMvY29uZmlnLmMuaW4gYi9Nb2R1bGVzL2NvbmZpZy5jLmluCmluZGV4IGY4MTE5OTEuLjhjMjVlZWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY29uZmlnLmMuaW4KKysrIGIvTW9kdWxlcy9jb25maWcuYy5pbgpAQCAtMjgsNiArMjgsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdGltcCh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRnYyh2b2lkKTsKIGV4dGVybiB2b2lkIGluaXRfYXN0KHZvaWQpOworZXh0ZXJuIHZvaWQgaW5pdF90eXBlcyh2b2lkKTsKIAogc3RydWN0IF9pbml0dGFiIF9QeUltcG9ydF9Jbml0dGFiW10gPSB7CiAKQEAgLTQyLDYgKzQzLDkgQEAKIAkvKiBUaGlzIGxpdmVzIGluIFB5dGhvbi9QeXRob24tYXN0LmMgKi8KIAl7Il9hc3QiLCBpbml0X2FzdH0sCiAKKwkvKiBUaGlzIGxpdmVzIGluIFB5dGhvbi9fdHlwZXMuYyAqLworCXsiX3R5cGVzIiwgaW5pdF90eXBlc30sCisKIAkvKiBUaGVzZSBlbnRyaWVzIGFyZSBoZXJlIGZvciBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMgKi8KIAl7Il9fbWFpbl9fIiwgTlVMTH0sCiAJeyJfX2J1aWx0aW5fXyIsIE5VTEx9LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9jcnlwdG1vZHVsZS5jIGIvTW9kdWxlcy9jcnlwdG1vZHVsZS5jCmluZGV4IDA1MGEzNTYuLjYzNzdmODQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvY3J5cHRtb2R1bGUuYworKysgYi9Nb2R1bGVzL2NyeXB0bW9kdWxlLmMKQEAgLTUsNiArNSw5IEBACiAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2lmZGVmIF9fVk1TCisjaW5jbHVkZSA8b3BlbnNzbC9kZXMuaD4KKyNlbmRpZgogCiAvKiBNb2R1bGUgY3J5cHQgKi8KIApAQCAtMTIsNyArMTUsOSBAQAogc3RhdGljIFB5T2JqZWN0ICpjcnlwdF9jcnlwdChQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCiB7CiAJY2hhciAqd29yZCwgKnNhbHQ7IAorI2lmbmRlZiBfX1ZNUwogCWV4dGVybiBjaGFyICogY3J5cHQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworI2VuZGlmCiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNzOmNyeXB0IiwgJndvcmQsICZzYWx0KSkgewogCQlyZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZGxtb2R1bGUuYyBiL01vZHVsZXMvZGxtb2R1bGUuYwppbmRleCAwOTU1NjgxLi41NjIyZWQ5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2RsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9kbG1vZHVsZS5jCkBAIC01LDYgKzUsMTAgQEAKIAogI2luY2x1ZGUgPGRsZmNuLmg+CiAKKyNpZmRlZiBfX1ZNUworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKICNpZm5kZWYgUlRMRF9MQVpZCiAjZGVmaW5lIFJUTERfTEFaWSAxCiAjZW5kaWYKQEAgLTc3LDggKzgxLDggQEAKICAgICAgICAgICAgICAgICAgICAgIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcsIGxvbmcpOwogCWxvbmcgYWxpc3RbMTBdOwogCWxvbmcgcmVzOwotCWludCBpOwotCWludCBuID0gUHlUdXBsZV9TaXplKGFyZ3MpOworCVB5X3NzaXplX3QgaTsKKwlQeV9zc2l6ZV90IG4gPSBQeVR1cGxlX1NpemUoYXJncyk7CiAJaWYgKG4gPCAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJhdCBsZWFzdCBhIG5hbWUgaXMgbmVlZGVkIik7CiAJCXJldHVybiBOVUxMOwpAQCAtMTg2LDYgKzE5MCwyNCBAQAogCQlQeUVycl9TZXRTdHJpbmcoRGxlcnJvciwgZGxlcnJvcigpKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQorI2lmZGVmIF9fVk1TCisJLyogICBVbmRlciBPcGVuVk1TIGRsb3BlbiBkb2Vzbid0IGRvIGFueSBjaGVjaywganVzdCBzYXZlIHRoZSBuYW1lCisJICogZm9yIGxhdGVyIHVzZSwgc28gd2UgaGF2ZSB0byBjaGVjayBpZiB0aGUgZmlsZSBpcyByZWFkYWJsZSwKKwkgKiB0aGUgbmFtZSBjYW4gYmUgYSBsb2dpY2FsIG9yIGEgZmlsZSBmcm9tIFNZUyRTSEFSRS4KKwkgKi8KKwlpZiAoYWNjZXNzKG5hbWUsIFJfT0spKSB7CisJCWNoYXIgZm5hbWVbc3RybGVuKG5hbWUpICsgMjBdOworCQlzdHJjcHkoZm5hbWUsICJTWVMkU0hBUkU6Iik7CisJCXN0cmNhdChmbmFtZSwgbmFtZSk7CisJCXN0cmNhdChmbmFtZSwgIi5FWEUiKTsKKwkJaWYgKGFjY2VzcyhmbmFtZSwgUl9PSykpIHsKKwkJCWRsY2xvc2UoaGFuZGxlKTsKKwkJCVB5RXJyX1NldFN0cmluZyhEbGVycm9yLAorCQkJCSJGaWxlIG5vdCBmb3VuZCBvciBwcm90ZWN0aW9uIHZpb2xhdGlvbiIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisjZW5kaWYKIAlyZXR1cm4gbmV3ZGxvYmplY3QoaGFuZGxlKTsKIH0KIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9NYWtlZmlsZS5pbiBiL01vZHVsZXMvZXhwYXQvTWFrZWZpbGUuaW4KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTA3MzkuLjAwMDAwMDAKLS0tIGEvTW9kdWxlcy9leHBhdC9NYWtlZmlsZS5pbgorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggdG9wLWxldmVsIGNvbmZpZ3VyZSBzY3JpcHQgdG8gcHJvZHVjZSBNYWtlZmlsZQotIwotIyBDb3B5cmlnaHQgMjAwMCBDbGFyayBDb29wZXIKLSMKLSMgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEVYUEFULgotIwotIyAgRVhQQVQgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAotIyAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBMaWNlbnNlIChiYXNlZCBvbiB0aGUgTUlUL1ggbGljZW5zZSkgY29udGFpbmVkCi0jICBpbiB0aGUgZmlsZSBDT1BZSU5HIHRoYXQgY29tZXMgd2l0aCB0aGlzIGRpc3RyaWJ1dGlvbi4KLSMKLSMgRVhQQVQgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKLSMgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCi0jIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KLSMgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKLSMgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKLSMgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKLSMgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBFWFBBVC4KLSMKLQotCi1TSEVMTCA9IEBTSEVMTEAKLQotc3JjZGlyID0gQHNyY2RpckAKLXRvcF9zcmNkaXIgPSBAdG9wX3NyY2RpckAKLVZQQVRIID0gQHNyY2RpckAKLXByZWZpeCA9IEBwcmVmaXhACi1leGVjX3ByZWZpeCA9IEBleGVjX3ByZWZpeEAKLQotYmluZGlyID0gQGJpbmRpckAKLXNiaW5kaXIgPSBAc2JpbmRpckAKLWxpYmV4ZWNkaXIgPSBAbGliZXhlY2RpckAKLWRhdGFkaXIgPSBAZGF0YWRpckAKLXN5c2NvbmZkaXIgPSBAc3lzY29uZmRpckAKLXNoYXJlZHN0YXRlZGlyID0gQHNoYXJlZHN0YXRlZGlyQAotbG9jYWxzdGF0ZWRpciA9IEBsb2NhbHN0YXRlZGlyQAotbGliZGlyID0gQGxpYmRpckAKLWluZm9kaXIgPSBAaW5mb2RpckAKLW1hbmRpciA9IEBtYW5kaXJACi1pbmNsdWRlZGlyID0gQGluY2x1ZGVkaXJACi1vbGRpbmNsdWRlZGlyID0gL3Vzci9pbmNsdWRlCi0KLXN1YmRpciA9IGxpYgotCi10b3BfYnVpbGRkaXIgPSAuLgotCi1JTlNUQUxMID0gQElOU1RBTExACi1JTlNUQUxMX1BST0dSQU0gPSBASU5TVEFMTF9QUk9HUkFNQAotSU5TVEFMTF9TQ1JJUFQgPSBASU5TVEFMTF9TQ1JJUFRACi1JTlNUQUxMX0RBVEEgPSBASU5TVEFMTF9EQVRBQAotCi1ob3N0X2FsaWFzID0gQGhvc3RfYWxpYXNACi1ob3N0X3RyaXBsZXQgPSBAaG9zdEAKLUFTID0gQEFTQAotQ0MgPSBAQ0NACi1ETExUT09MID0gQERMTFRPT0xACi1MSUJUT09MID0gQExJQlRPT0xACi1MTl9TID0gQExOX1NACi1PQkpEVU1QID0gQE9CSkRVTVBACi1QQUNLQUdFID0gQFBBQ0tBR0VACi1SQU5MSUIgPSBAUkFOTElCQAotVkVSU0lPTiA9IEBWRVJTSU9OQAotCi1MSUJSQVJZID0gbGliZXhwYXQubGEKLVNPVVJDRVMgPSB4bWxwYXJzZS5jIHhtbHRvay5jIHhtbHJvbGUuYwotT0JKRUNUUyA9ICQoU09VUkNFUzouYz0ubykKLUxUT0JKRUNUUyA9ICQoU09VUkNFUzouYz0ubG8pCi0KLVRFTVBMQVRFUyA9IHhtbHRva19pbXBsLmMgeG1sdG9rX25zLmMKLUFQSUhFQURFUiA9IGV4cGF0LmgKLUhFQURFUlMgPSBhc2NpaS5oIGlhc2NpaXRhYi5oIHV0Zjh0YWIuaCB4bWx0b2suaCBhc2NpaXRhYi5oIGxhdGluMXRhYi5oIFwKLSAgICAgICAgICBuYW1ldGFiLmggeG1sZGVmLmggeG1scm9sZS5oIHhtbHRva19pbXBsLmgKLQotbWtpbnN0YWxsZGlycyA9ICQoU0hFTEwpICQodG9wX3NyY2RpcikvY29uZnRvb2xzL21raW5zdGFsbGRpcnMKLUNPTkZJR19IRUFERVIgPSAuLi9jb25maWcuaAotQ09ORklHX0NMRUFOX0ZJTEVTID0gCi0KLUlOQ0xVREVTID0gLUkkKHNyY2RpcikgLUkuIC1JLi4KLURFRlMgPSBAREVGU0AgLURQQUNLQUdFPSciJChQQUNLQUdFKSInIC1EVkVSU0lPTj0nIiQoUEFDS0FHRSlfJChWRVJTSU9OKSInCi0KLUNQUEZMQUdTID0gQENQUEZMQUdTQAotTERGTEFHUyA9IEBMREZMQUdTQAotTElCUyA9IEBMSUJTQAotQ0ZMQUdTID0gQENGTEFHU0AKLQotTElCUkVWSVNJT04gPSBATElCUkVWSVNJT05ACi1MSUJDVVJSRU5UICA9IEBMSUJDVVJSRU5UQAotTElCQUdFICAgICAgPSBATElCQUdFQAotCi1DT01QSUxFID0gJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykKLUxUQ09NUElMRSA9ICQoTElCVE9PTCkgLS1tb2RlPWNvbXBpbGUgJChDQykgJChERUZTKSAkKElOQ0xVREVTKSAkKENQUEZMQUdTKSAkKENGTEFHUykKLUNDTEQgPSAkKENDKQotTElOSyA9ICQoTElCVE9PTCkgLS1tb2RlPWxpbmsgICQoQ0NMRCkgLXZlcnNpb24taW5mbyAkKExJQkNVUlJFTlQpOiQoTElCUkVWSVNJT04pOiQoTElCQUdFKSAkKENGTEFHUykgJChMREZMQUdTKSAtbyAkQAotRElTVF9DT01NT04gPSAgTWFrZWZpbGUuaW4KLQotCi1ESVNURklMRVMgPSAkKERJU1RfQ09NTU9OKSAkKFNPVVJDRVMpICQoVEVNUExBVEVTKSAkKEFQSUhFQURFUikgJChIRUFERVJTKSAKLQotVEFSID0gZ3RhcgotR1pJUF9FTlYgPSAtLWJlc3QKLQotYWxsOiAkKExJQlJBUlkpCi0KLS5TVUZGSVhFUzogLmMgLmxvIC5vCi0uUEhPTlk6IGFsbCBjbGVhbiBkaXN0Y2xlYW4gbWFpbnRhaW5lci1jbGVhbgotCi0uYy5vOgotCSQoQ09NUElMRSkgLWMgJDwKLQotLmMubG86Ci0JJChMVENPTVBJTEUpIC1jICQ8Ci0KLU1ha2VmaWxlOiAkKHNyY2RpcikvTWFrZWZpbGUuaW4gICQodG9wX2J1aWxkZGlyKS9jb25maWcuc3RhdHVzCi0JY2QgJCh0b3BfYnVpbGRkaXIpIFwKLQkgICYmIENPTkZJR19GSUxFUz0kKHN1YmRpcikvJEAgQ09ORklHX0hFQURFUlM9ICQoU0hFTEwpIC4vY29uZmlnLnN0YXR1cwotCi0kKHRvcF9idWlsZGRpcikvY29uZmlnLnN0YXR1czogJCh0b3BfYnVpbGRkaXIpL2NvbmZpZ3VyZQotCWNkICQodG9wX2J1aWxkZGlyKSAmJiAkKE1BS0UpIGNvbmZpZy5zdGF0dXMKLQotJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oOiAkKHRvcF9idWlsZGRpcikvY29uZmlnLmguaW4KLQljZCAkKHRvcF9idWlsZGRpcikgJiYgJChNQUtFKSBjb25maWcuaAotCi1jbGVhbjoKLQlybSAtZiAkKExJQlJBUlkpICoubyAqLmxvICp+Ci0Jcm0gLXJmIC5saWJzIF9saWJzCi0KLWRpc3RjbGVhbjogY2xlYW4KLQlybSAtZiBNYWtlZmlsZQotCi1tYWludGFpbmVyLWNsZWFuOiBkaXN0Y2xlYW4KLQotY2hlY2s6CSQoU1VCRElSUykKLQlAZWNobwotCUBlY2hvIFRoaXMgcGFja2FnZSBkb2VzIG5vdCB5ZXQgaGF2ZSBhIHJlZ3Jlc3Npb24gdGVzdC4KLQlAZWNobwotCi1pbnN0YWxsOiAkKExJQlJBUlkpICQoQVBJSEVBREVSKQotCSQobWtpbnN0YWxsZGlycykgJChsaWJkaXIpICQoaW5jbHVkZWRpcikKLQkkKExJQlRPT0wpIC0tbW9kZT1pbnN0YWxsICQoSU5TVEFMTCkgJChMSUJSQVJZKSAkKGxpYmRpcikvJChMSUJSQVJZKQotCSQoSU5TVEFMTF9EQVRBKSAkKEFQSUhFQURFUikgJChpbmNsdWRlZGlyKQotCi11bmluc3RhbGw6Ci0JJChMSUJUT09MKSAtLW1vZGU9dW5pbnN0YWxsIHJtIC1mICQobGliZGlyKS8kKExJQlJBUlkpOwotCXJtIC1mICQobGliZGlyKS8kKEFQSUhFQURFUikKLQotJChMSUJSQVJZKTogJChMVE9CSkVDVFMpCi0JJChMSU5LKSAtcnBhdGggJChsaWJkaXIpICQoTERGTEFHUykgJChMVE9CSkVDVFMpCi0KLXhtbHBhcnNlLm8gXAoteG1scGFyc2UubG86IHhtbHBhcnNlLmMgZXhwYXQuaCB4bWxyb2xlLmggeG1sdG9rLmggJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCi0KLXhtbHJvbGUubyBcCi14bWxyb2xlLmxvOiB4bWxyb2xlLmMgYXNjaWkuaCB4bWxyb2xlLmggJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCi0KLXhtbHRvay5vIFwKLXhtbHRvay5sbzogeG1sdG9rLmMgeG1sdG9rX2ltcGwuYyB4bWx0b2tfbnMuYyBcCi0gICAgICAgICAgYXNjaWkuaCBhc2NpaXRhYi5oIGlhc2NpaXRhYi5oIGxhdGluMXRhYi5oIG5hbWV0YWIuaCB1dGY4dGFiLmggXAotICAgICAgICAgIHhtbHRvay5oIHhtbHRva19pbXBsLmggJCh0b3BfYnVpbGRkaXIpL2NvbmZpZy5oCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L2FtaWdhY29uZmlnLmggYi9Nb2R1bGVzL2V4cGF0L2FtaWdhY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc4MWE3MQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvZXhwYXQvYW1pZ2Fjb25maWcuaApAQCAtMCwwICsxLDk2IEBACisjaWZuZGVmIEFNSUdBQ09ORklHX0gKKyNkZWZpbmUgQU1JR0FDT05GSUdfSAorCisvKiAxMjM0ID0gTElMX0VORElBTiwgNDMyMSA9IEJJR0VORElBTiAqLworI2RlZmluZSBCWVRFT1JERVIgNDMyMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGJjb3B5JyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9CQ09QWSAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8Y2hlY2suaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9DSEVDS19ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9ETEZDTl9ICisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZmNudGwuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRkNOVExfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZ2V0cGFnZXNpemUnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfR0VUUEFHRVNJWkUKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBtZW1tb3ZlJyBmdW5jdGlvbi4gKi8KKyNkZWZpbmUgSEFWRV9NRU1NT1ZFIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxtZW1vcnkuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9NRU1PUllfSAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSBhIHdvcmtpbmcgYG1tYXAnIHN5c3RlbSBjYWxsLiAqLworI3VuZGVmIEhBVkVfTU1BUAorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0ZGludC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TVERJTlRfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkbGliLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NURExJQl9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmdzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR1NfSCAxCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RyaW5nLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NUUklOR19IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKworLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNkZWZpbmUgSEFWRV9VTklTVERfSCAxCisKKy8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLworI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAiZXhwYXQtYnVnc0BtYWlsLmxpYmV4cGF0Lm9yZyIKKworLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLworI2RlZmluZSBQQUNLQUdFX05BTUUgImV4cGF0IgorCisvKiBEZWZpbmUgdG8gdGhlIGZ1bGwgbmFtZSBhbmQgdmVyc2lvbiBvZiB0aGlzIHBhY2thZ2UuICovCisjZGVmaW5lIFBBQ0tBR0VfU1RSSU5HICJleHBhdCAxLjk1LjgiCisKKy8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KKyN1bmRlZiBQQUNLQUdFX1RBUk5BTUUKKworLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KKyNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIxLjk1LjgiCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLworI2RlZmluZSBTVERDX0hFQURFUlMgMQorCisvKiB3aGV0aGVyIGJ5dGVvcmRlciBpcyBiaWdlbmRpYW4gKi8KKyNkZWZpbmUgV09SRFNfQklHRU5ESUFOCisKKy8qIERlZmluZSB0byBzcGVjaWZ5IGhvdyBtdWNoIGNvbnRleHQgdG8gcmV0YWluIGFyb3VuZCB0aGUgY3VycmVudCBwYXJzZQorICAgcG9pbnQuICovCisjZGVmaW5lIFhNTF9DT05URVhUX0JZVEVTIDEwMjQKKworLyogRGVmaW5lIHRvIG1ha2UgcGFyYW1ldGVyIGVudGl0eSBwYXJzaW5nIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI2RlZmluZSBYTUxfRFRECisKKy8qIERlZmluZSB0byBtYWtlIFhNTCBOYW1lc3BhY2VzIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlLiAqLworI2RlZmluZSBYTUxfTlMKKworLyogRGVmaW5lIHRvIGVtcHR5IGlmIGBjb25zdCcgZG9lcyBub3QgY29uZm9ybSB0byBBTlNJIEMuICovCisjdW5kZWYgY29uc3QKKworLyogRGVmaW5lIHRvIGBsb25nJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBvZmZfdAorCisvKiBEZWZpbmUgdG8gYHVuc2lnbmVkJyBpZiA8c3lzL3R5cGVzLmg+IGRvZXMgbm90IGRlZmluZS4gKi8KKyN1bmRlZiBzaXplX3QKKworCisjZW5kaWYgIC8qIEFNSUdBQ09ORklHX0ggKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvZXhwYXQvZXhwYXQuaCBiL01vZHVsZXMvZXhwYXQvZXhwYXQuaAppbmRleCBlY2JhOTJlLi5jZjExM2VlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L2V4cGF0LmgKKysrIGIvTW9kdWxlcy9leHBhdC9leHBhdC5oCkBAIC0yLDggKzIsOCBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKLSNpZm5kZWYgWG1sUGFyc2VfSU5DTFVERUQKLSNkZWZpbmUgWG1sUGFyc2VfSU5DTFVERUQgMQorI2lmbmRlZiBFeHBhdF9JTkNMVURFRAorI2RlZmluZSBFeHBhdF9JTkNMVURFRCAxCiAKICNpZmRlZiBfX1ZNUwogLyogICAgICAwICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMgICAgICAwICAgICAgICAxICAgICAgICAgMiAgICAgICAgIDMKQEAgLTE3LDYgKzE3LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSAiZXhwYXRfZXh0ZXJuYWwuaCIKIAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCiBzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdDsKIHR5cGVkZWYgc3RydWN0IFhNTF9QYXJzZXJTdHJ1Y3QgKlhNTF9QYXJzZXI7CiAKQEAgLTg3LDcgKzkxLDExIEBACiAgIFhNTF9FUlJPUl9OT1RfU1VTUEVOREVELAogICBYTUxfRVJST1JfQUJPUlRFRCwKICAgWE1MX0VSUk9SX0ZJTklTSEVELAotICBYTUxfRVJST1JfU1VTUEVORF9QRQorICBYTUxfRVJST1JfU1VTUEVORF9QRSwKKyAgLyogQWRkZWQgaW4gMi4wLiAqLworICBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTCwKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX1BSRUZJWF9YTUxOUywKKyAgWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkkKIH07CiAKIGVudW0gWE1MX0NvbnRlbnRfVHlwZSB7CkBAIC0yMDUsOCArMjEzLDggQEAKICAgIFVSSSwgdGhlIG5hbWVzcGFjZSBzZXBhcmF0b3IgY2hhcmFjdGVyLCBhbmQgdGhlIGxvY2FsIHBhcnQgb2YgdGhlCiAgICBuYW1lLiAgSWYgdGhlIG5hbWVzcGFjZSBzZXBhcmF0b3IgaXMgJ1wwJyB0aGVuIHRoZSBuYW1lc3BhY2UgVVJJCiAgICBhbmQgdGhlIGxvY2FsIHBhcnQgd2lsbCBiZSBjb25jYXRlbmF0ZWQgd2l0aG91dCBhbnkgc2VwYXJhdG9yLgotICAgV2hlbiBhIG5hbWVzcGFjZSBpcyBub3QgZGVjbGFyZWQsIHRoZSBuYW1lIGFuZCBwcmVmaXggd2lsbCBiZQotICAgcGFzc2VkIHRocm91Z2ggd2l0aG91dCBleHBhbnNpb24uCisgICBJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHVzZSB0aGUgc2VwYXJhdG9yICdcMCcgd2l0aCBuYW1lc3BhY2UKKyAgIHRyaXBsZXRzIChzZWUgWE1MX1NldFJldHVybk5TVHJpcGxldCkuCiAqLwogWE1MUEFSU0VBUEkoWE1MX1BhcnNlcikKIFhNTF9QYXJzZXJDcmVhdGVOUyhjb25zdCBYTUxfQ2hhciAqZW5jb2RpbmcsIFhNTF9DaGFyIG5hbWVzcGFjZVNlcGFyYXRvcik7CkBAIC04OTcsOSArOTA1LDkgQEAKICAgIHdhcyBkZXRlY3RlZDsgb3RoZXJ3aXNlIHRoZSBsb2NhdGlvbiBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIGxhc3QKICAgIHBhcnNlIGV2ZW50LCBhcyBkZXNjcmliZWQgYWJvdmUuCiAqLwotWE1MUEFSU0VBUEkoaW50KSBYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIoWE1MX1BhcnNlciBwYXJzZXIpOwotWE1MUEFSU0VBUEkoaW50KSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7Ci1YTUxQQVJTRUFQSShsb25nKSBYTUxfR2V0Q3VycmVudEJ5dGVJbmRleChYTUxfUGFyc2VyIHBhcnNlcik7CitYTUxQQVJTRUFQSShYTUxfU2l6ZSkgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyKFhNTF9QYXJzZXIgcGFyc2VyKTsKK1hNTFBBUlNFQVBJKFhNTF9TaXplKSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcik7CitYTUxQQVJTRUFQSShYTUxfSW5kZXgpIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4KFhNTF9QYXJzZXIgcGFyc2VyKTsKIAogLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGN1cnJlbnQgZXZlbnQuCiAgICBSZXR1cm5zIDAgaWYgdGhlIGV2ZW50IGlzIGluIGFuIGludGVybmFsIGVudGl0eS4KQEAgLTk3NCw3ICs5ODIsOCBAQAogICBYTUxfRkVBVFVSRV9DT05URVhUX0JZVEVTLAogICBYTUxfRkVBVFVSRV9NSU5fU0laRSwKICAgWE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9DSEFSLAotICBYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSCisgIFhNTF9GRUFUVVJFX1NJWkVPRl9YTUxfTENIQVIsCisgIFhNTF9GRUFUVVJFX05TCiAgIC8qIEFkZGl0aW9uYWwgZmVhdHVyZXMgbXVzdCBiZSBhZGRlZCB0byB0aGUgZW5kIG9mIHRoaXMgZW51bS4gKi8KIH07CiAKQEAgLTk5MywxMiArMTAwMiwxMiBAQAogICAgcmVsZWFzZXMuIE1pY3JvIGlzIGJ1bXBlZCB3aXRoIGVhY2ggcmVsZWFzZSwgYW5kIHNldCB0byAwIHdpdGggZWFjaAogICAgY2hhbmdlIHRvIG1ham9yIG9yIG1pbm9yIHZlcnNpb24uCiAqLwotI2RlZmluZSBYTUxfTUFKT1JfVkVSU0lPTiAxCi0jZGVmaW5lIFhNTF9NSU5PUl9WRVJTSU9OIDk1Ci0jZGVmaW5lIFhNTF9NSUNST19WRVJTSU9OIDgKKyNkZWZpbmUgWE1MX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBYTUxfTUlOT1JfVkVSU0lPTiAwCisjZGVmaW5lIFhNTF9NSUNST19WRVJTSU9OIDAKIAogI2lmZGVmIF9fY3BsdXNwbHVzCiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIG5vdCBYbWxQYXJzZV9JTkNMVURFRCAqLworI2VuZGlmIC8qIG5vdCBFeHBhdF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9leHBhdF9leHRlcm5hbC5oIGIvTW9kdWxlcy9leHBhdC9leHBhdF9leHRlcm5hbC5oCmluZGV4IDQxNDVjYWMuLmYwNTQwMTQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQvZXhwYXRfZXh0ZXJuYWwuaAorKysgYi9Nb2R1bGVzL2V4cGF0L2V4cGF0X2V4dGVybmFsLmgKQEAgLTIsOCArMiwxNSBAQAogICAgU2VlIHRoZSBmaWxlIENPUFlJTkcgZm9yIGNvcHlpbmcgcGVybWlzc2lvbi4KICovCiAKKyNpZm5kZWYgRXhwYXRfRXh0ZXJuYWxfSU5DTFVERUQKKyNkZWZpbmUgRXhwYXRfRXh0ZXJuYWxfSU5DTFVERUQgMQorCiAvKiBFeHRlcm5hbCBBUEkgZGVmaW5pdGlvbnMgKi8KIAorLyogTmFtZXNwYWNlIGV4dGVybmFsIHN5bWJvbHMgdG8gYWxsb3cgbXVsdGlwbGUgbGliZXhwYXQgdmVyc2lvbiB0bworICAgY28tZXhpc3QuICovCisjaW5jbHVkZSAicHlleHBhdG5zLmgiCisKICNpZiBkZWZpbmVkKF9NU0NfRVhURU5TSU9OUykgJiYgIWRlZmluZWQoX19CRU9TX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCiAjZGVmaW5lIFhNTF9VU0VfTVNDX0VYVEVOU0lPTlMgMQogI2VuZGlmCkBAIC02Miw2ICs2OSw3IEBACiAjZW5kaWYKICNlbmRpZiAgLyogbm90IGRlZmluZWQgWE1MX1NUQVRJQyAqLwogCisKIC8qIElmIHdlIGRpZG4ndCBkZWZpbmUgaXQgYWJvdmUsIGRlZmluZSBpdCBhd2F5OiAqLwogI2lmbmRlZiBYTUxJTVBPUlQKICNkZWZpbmUgWE1MSU1QT1JUCkBAIC05MCwzICs5OCwyMiBAQAogdHlwZWRlZiBjaGFyIFhNTF9DaGFyOwogdHlwZWRlZiBjaGFyIFhNTF9MQ2hhcjsKICNlbmRpZiAvKiBYTUxfVU5JQ09ERSAqLworCisjaWZkZWYgWE1MX0xBUkdFX1NJWkUgIC8qIFVzZSBsYXJnZSBpbnRlZ2VycyBmb3IgZmlsZS9zdHJlYW0gcG9zaXRpb25zLiAqLworI2lmIGRlZmluZWQoWE1MX1VTRV9NU0NfRVhURU5TSU9OUykgJiYgX01TQ19WRVIgPCAxNDAwCit0eXBlZGVmIF9faW50NjQgWE1MX0luZGV4OyAKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCBYTUxfU2l6ZTsKKyNlbHNlCit0eXBlZGVmIGxvbmcgbG9uZyBYTUxfSW5kZXg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBYTUxfU2l6ZTsKKyNlbmRpZgorI2Vsc2UKK3R5cGVkZWYgbG9uZyBYTUxfSW5kZXg7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgWE1MX1NpemU7CisjZW5kaWYgLyogWE1MX0xBUkdFX1NJWkUgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIG5vdCBFeHBhdF9FeHRlcm5hbF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC9weWV4cGF0bnMuaCBiL01vZHVsZXMvZXhwYXQvcHlleHBhdG5zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiZDM0MQotLS0gL2Rldi9udWxsCisrKyBiL01vZHVsZXMvZXhwYXQvcHlleHBhdG5zLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwNS0yMDA2IEFjdGl2ZVN0YXRlIFNvZnR3YXJlIEluYy4KKyAqCisgKiBOYW1lc3BhY2UgYWxsIGV4cGF0IGV4cG9ydGVkIHN5bWJvbHMgdG8gYXZvaWQgZHluYW1pYyBsb2FkaW5nIHN5bWJvbAorICogY29sbGlzaW9ucyB3aGVuIGVtYmVkZGluZyBQeXRob24uCisgKgorICogVGhlIFByb2JsZW06CisgKiAtIHlvdSBlbWJlZCBQeXRob24gaW4gc29tZSBhcHAKKyAqIC0gdGhlIGFwcCBkeW5hbWljYWxseSBsb2FkcyBsaWJleHBhdCBvZiB2ZXJzaW9uIFgKKyAqIC0gdGhlIGVtYmVkZGVkIFB5dGhvbiBpbXBvcnRzIHB5ZXhwYXQgKHdoaWNoIHdhcyBidWlsdCBhZ2FpbnN0CisgKiAgIGxpYmV4cGF0IHZlcnNpb24gWCtuKQorICogLS0+IHB5ZXhwYXQgZ2V0cyB0aGUgZXhwYXQgc3ltYm9scyBmcm9tIHRoZSBhbHJlYWR5IGxvYWRlZCBhbmQgKm9sZGVyKgorICogICAgIGxpYmV4cGF0OiBjcmFzaCAoU3BlY2lmaWNhbGx5IHRoZSBjcmFzaCB3ZSBvYnNlcnZlZCB3YXMgaW4KKyAqICAgICBnZXR0aW5nIGFuIG9sZCBYTUxfRXJyb3JTdHJpbmcgKGZyb20geG1scGFyc2UuYykgYW5kIHRoZW4gY2FsbGluZworICogICAgIGl0IHdpdGggbmV3ZXIgdmFsdWVzIGluIHRoZSBYTUxfRXJyb3IgZW51bToKKyAqCisgKiAgICAgICAvLyBweWV4cGF0LmMsIGxpbmUgMTk3MAorICogICAgICAgLi4uCisgKiAgICAgICAvLyBBZGRlZCBpbiBFeHBhdCAxLjk1LjcuCisgKiAgICAgICBNWUNPTlNUKFhNTF9FUlJPUl9VTkJPVU5EX1BSRUZJWCk7CisgKiAgICAgICAuLi4KKyAqCisgKgorICogVGhlIFNvbHV0aW9uOgorICogUHJlZml4IGFsbCBhIGV4cG9ydGVkIHN5bWJvbHMgd2l0aCAiUHlFeHBhdF8iLiBUaGlzIGlzIHNpbWlsYXIgdG8KKyAqIHdoYXQgTW96aWxsYSBkb2VzIGZvciBzb21lIGNvbW1vbiBsaWJzOgorICogaHR0cDovL2x4ci5tb3ppbGxhLm9yZy9zZWFtb25rZXkvc291cmNlL21vZHVsZXMvbGliaW1nL3BuZy9tb3pwbmdjb25mLmgjMTE1CisgKgorICogVGhlIGxpc3Qgb2YgcmVsZXZhbnQgZXhwb3J0ZWQgc3ltYm9scyBjYW4gYmUgaGFkIHdpdGggdGhpcyBjb21tYW5kOgorICogCisgICAgICAgbm0gcHlleHBhdC5zbyBcCisgICAgICAgICAgIHwgZ3JlcCAtdiAiIFthLXpCVUFdICIgXAorICAgICAgICAgICB8IGdyZXAgLXYgIl9maW5pXHxfaW5pdFx8aW5pdHB5ZXhwYXQiCisgKgorICogSWYgYW55IG9mIHRob3NlIHN5bWJvbHMgYXJlIE5PVCBwcmVmaXhlZCB3aXRoICJQeUV4cGF0XyIgdGhlbgorICogYSAjZGVmaW5lIHNob3VsZCBiZSBhZGRlZCBmb3IgaXQgaGVyZS4KKyAqLworCisjaWZuZGVmIFBZRVhQQVROU19ICisjZGVmaW5lIFBZRVhQQVROU19ICisKKyNkZWZpbmUgWE1MX0RlZmF1bHRDdXJyZW50ICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9EZWZhdWx0Q3VycmVudAorI2RlZmluZSBYTUxfRXJyb3JTdHJpbmcgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0Vycm9yU3RyaW5nCisjZGVmaW5lIFhNTF9FeHBhdFZlcnNpb24gICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfRXhwYXRWZXJzaW9uCisjZGVmaW5lIFhNTF9FeHBhdFZlcnNpb25JbmZvICAgICAgICAgICAgUHlFeHBhdF9YTUxfRXhwYXRWZXJzaW9uSW5mbworI2RlZmluZSBYTUxfRXh0ZXJuYWxFbnRpdHlQYXJzZXJDcmVhdGUgIFB5RXhwYXRfWE1MX0V4dGVybmFsRW50aXR5UGFyc2VyQ3JlYXRlCisjZGVmaW5lIFhNTF9GcmVlQ29udGVudE1vZGVsICAgICAgICAgICAgUHlFeHBhdF9YTUxfRnJlZUNvbnRlbnRNb2RlbAorI2RlZmluZSBYTUxfR2V0QmFzZSAgICAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0dldEJhc2UKKyNkZWZpbmUgWE1MX0dldEJ1ZmZlciAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9HZXRCdWZmZXIKKyNkZWZpbmUgWE1MX0dldEN1cnJlbnRCeXRlQ291bnQgICAgICAgICBQeUV4cGF0X1hNTF9HZXRDdXJyZW50Qnl0ZUNvdW50CisjZGVmaW5lIFhNTF9HZXRDdXJyZW50Qnl0ZUluZGV4ICAgICAgICAgUHlFeHBhdF9YTUxfR2V0Q3VycmVudEJ5dGVJbmRleAorI2RlZmluZSBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlciAgICAgIFB5RXhwYXRfWE1MX0dldEN1cnJlbnRDb2x1bW5OdW1iZXIKKyNkZWZpbmUgWE1MX0dldEN1cnJlbnRMaW5lTnVtYmVyICAgICAgICBQeUV4cGF0X1hNTF9HZXRDdXJyZW50TGluZU51bWJlcgorI2RlZmluZSBYTUxfR2V0RXJyb3JDb2RlICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0dldEVycm9yQ29kZQorI2RlZmluZSBYTUxfR2V0RmVhdHVyZUxpc3QgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0dldEZlYXR1cmVMaXN0CisjZGVmaW5lIFhNTF9HZXRJZEF0dHJpYnV0ZUluZGV4ICAgICAgICAgUHlFeHBhdF9YTUxfR2V0SWRBdHRyaWJ1dGVJbmRleAorI2RlZmluZSBYTUxfR2V0SW5wdXRDb250ZXh0ICAgICAgICAgICAgIFB5RXhwYXRfWE1MX0dldElucHV0Q29udGV4dAorI2RlZmluZSBYTUxfR2V0UGFyc2luZ1N0YXR1cyAgICAgICAgICAgIFB5RXhwYXRfWE1MX0dldFBhcnNpbmdTdGF0dXMKKyNkZWZpbmUgWE1MX0dldFNwZWNpZmllZEF0dHJpYnV0ZUNvdW50ICBQeUV4cGF0X1hNTF9HZXRTcGVjaWZpZWRBdHRyaWJ1dGVDb3VudAorI2RlZmluZSBYbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmcgICAgIFB5RXhwYXRfWG1sR2V0VXRmMTZJbnRlcm5hbEVuY29kaW5nCisjZGVmaW5lIFhtbEdldFV0ZjE2SW50ZXJuYWxFbmNvZGluZ05TICAgUHlFeHBhdF9YbWxHZXRVdGYxNkludGVybmFsRW5jb2RpbmdOUworI2RlZmluZSBYbWxHZXRVdGY4SW50ZXJuYWxFbmNvZGluZyAgICAgIFB5RXhwYXRfWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmcKKyNkZWZpbmUgWG1sR2V0VXRmOEludGVybmFsRW5jb2RpbmdOUyAgICBQeUV4cGF0X1htbEdldFV0ZjhJbnRlcm5hbEVuY29kaW5nTlMKKyNkZWZpbmUgWG1sSW5pdEVuY29kaW5nICAgICAgICAgICAgICAgICBQeUV4cGF0X1htbEluaXRFbmNvZGluZworI2RlZmluZSBYbWxJbml0RW5jb2RpbmdOUyAgICAgICAgICAgICAgIFB5RXhwYXRfWG1sSW5pdEVuY29kaW5nTlMKKyNkZWZpbmUgWG1sSW5pdFVua25vd25FbmNvZGluZyAgICAgICAgICBQeUV4cGF0X1htbEluaXRVbmtub3duRW5jb2RpbmcKKyNkZWZpbmUgWG1sSW5pdFVua25vd25FbmNvZGluZ05TICAgICAgICBQeUV4cGF0X1htbEluaXRVbmtub3duRW5jb2RpbmdOUworI2RlZmluZSBYTUxfTWVtRnJlZSAgICAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX01lbUZyZWUKKyNkZWZpbmUgWE1MX01lbU1hbGxvYyAgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9NZW1NYWxsb2MKKyNkZWZpbmUgWE1MX01lbVJlYWxsb2MgICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9NZW1SZWFsbG9jCisjZGVmaW5lIFhNTF9QYXJzZSAgICAgICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfUGFyc2UKKyNkZWZpbmUgWE1MX1BhcnNlQnVmZmVyICAgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9QYXJzZUJ1ZmZlcgorI2RlZmluZSBYTUxfUGFyc2VyQ3JlYXRlICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlckNyZWF0ZQorI2RlZmluZSBYTUxfUGFyc2VyQ3JlYXRlX01NICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlckNyZWF0ZV9NTQorI2RlZmluZSBYTUxfUGFyc2VyQ3JlYXRlTlMgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlckNyZWF0ZU5TCisjZGVmaW5lIFhNTF9QYXJzZXJGcmVlICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YTUxfUGFyc2VyRnJlZQorI2RlZmluZSBYTUxfUGFyc2VyUmVzZXQgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1BhcnNlclJlc2V0CisjZGVmaW5lIFhtbFBhcnNlWG1sRGVjbCAgICAgICAgICAgICAgICAgUHlFeHBhdF9YbWxQYXJzZVhtbERlY2wKKyNkZWZpbmUgWG1sUGFyc2VYbWxEZWNsTlMgICAgICAgICAgICAgICBQeUV4cGF0X1htbFBhcnNlWG1sRGVjbE5TCisjZGVmaW5lIFhtbFByb2xvZ1N0YXRlSW5pdCAgICAgICAgICAgICAgUHlFeHBhdF9YbWxQcm9sb2dTdGF0ZUluaXQKKyNkZWZpbmUgWG1sUHJvbG9nU3RhdGVJbml0RXh0ZXJuYWxFbnRpdHkgICAgUHlFeHBhdF9YbWxQcm9sb2dTdGF0ZUluaXRFeHRlcm5hbEVudGl0eQorI2RlZmluZSBYTUxfUmVzdW1lUGFyc2VyICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1Jlc3VtZVBhcnNlcgorI2RlZmluZSBYTUxfU2V0QXR0bGlzdERlY2xIYW5kbGVyICAgICAgIFB5RXhwYXRfWE1MX1NldEF0dGxpc3REZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0QmFzZSAgICAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1NldEJhc2UKKyNkZWZpbmUgWE1MX1NldENkYXRhU2VjdGlvbkhhbmRsZXIgICAgICBQeUV4cGF0X1hNTF9TZXRDZGF0YVNlY3Rpb25IYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlciAgICAgUHlFeHBhdF9YTUxfU2V0Q2hhcmFjdGVyRGF0YUhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldENvbW1lbnRIYW5kbGVyICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRDb21tZW50SGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RGVmYXVsdEhhbmRsZXIgICAgICAgICAgIFB5RXhwYXRfWE1MX1NldERlZmF1bHRIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXREZWZhdWx0SGFuZGxlckV4cGFuZCAgICAgUHlFeHBhdF9YTUxfU2V0RGVmYXVsdEhhbmRsZXJFeHBhbmQKKyNkZWZpbmUgWE1MX1NldERvY3R5cGVEZWNsSGFuZGxlciAgICAgICBQeUV4cGF0X1hNTF9TZXREb2N0eXBlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVsZW1lbnREZWNsSGFuZGxlciAgICAgICBQeUV4cGF0X1hNTF9TZXRFbGVtZW50RGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVsZW1lbnRIYW5kbGVyICAgICAgICAgICBQeUV4cGF0X1hNTF9TZXRFbGVtZW50SGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RW5jb2RpbmcgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1NldEVuY29kaW5nCisjZGVmaW5lIFhNTF9TZXRFbmRDZGF0YVNlY3Rpb25IYW5kbGVyICAgUHlFeHBhdF9YTUxfU2V0RW5kQ2RhdGFTZWN0aW9uSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RW5kRG9jdHlwZURlY2xIYW5kbGVyICAgIFB5RXhwYXRfWE1MX1NldEVuZERvY3R5cGVEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RW5kRWxlbWVudEhhbmRsZXIgICAgICAgIFB5RXhwYXRfWE1MX1NldEVuZEVsZW1lbnRIYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRFbmROYW1lc3BhY2VEZWNsSGFuZGxlciAgUHlFeHBhdF9YTUxfU2V0RW5kTmFtZXNwYWNlRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldEVudGl0eURlY2xIYW5kbGVyICAgICAgICBQeUV4cGF0X1hNTF9TZXRFbnRpdHlEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyIFB5RXhwYXRfWE1MX1NldEV4dGVybmFsRW50aXR5UmVmSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0RXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyQXJnICBQeUV4cGF0X1hNTF9TZXRFeHRlcm5hbEVudGl0eVJlZkhhbmRsZXJBcmcKKyNkZWZpbmUgWE1MX1NldE5hbWVzcGFjZURlY2xIYW5kbGVyICAgICBQeUV4cGF0X1hNTF9TZXROYW1lc3BhY2VEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0Tm90YXRpb25EZWNsSGFuZGxlciAgICAgIFB5RXhwYXRfWE1MX1NldE5vdGF0aW9uRGVjbEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldE5vdFN0YW5kYWxvbmVIYW5kbGVyICAgICBQeUV4cGF0X1hNTF9TZXROb3RTdGFuZGFsb25lSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0UGFyYW1FbnRpdHlQYXJzaW5nICAgICAgIFB5RXhwYXRfWE1MX1NldFBhcmFtRW50aXR5UGFyc2luZworI2RlZmluZSBYTUxfU2V0UHJvY2Vzc2luZ0luc3RydWN0aW9uSGFuZGxlciBQeUV4cGF0X1hNTF9TZXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25IYW5kbGVyCisjZGVmaW5lIFhNTF9TZXRSZXR1cm5OU1RyaXBsZXQgICAgICAgICAgUHlFeHBhdF9YTUxfU2V0UmV0dXJuTlNUcmlwbGV0CisjZGVmaW5lIFhNTF9TZXRTa2lwcGVkRW50aXR5SGFuZGxlciAgICAgUHlFeHBhdF9YTUxfU2V0U2tpcHBlZEVudGl0eUhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFN0YXJ0Q2RhdGFTZWN0aW9uSGFuZGxlciBQeUV4cGF0X1hNTF9TZXRTdGFydENkYXRhU2VjdGlvbkhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFN0YXJ0RG9jdHlwZURlY2xIYW5kbGVyICBQeUV4cGF0X1hNTF9TZXRTdGFydERvY3R5cGVEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0U3RhcnRFbGVtZW50SGFuZGxlciAgICAgIFB5RXhwYXRfWE1MX1NldFN0YXJ0RWxlbWVudEhhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFN0YXJ0TmFtZXNwYWNlRGVjbEhhbmRsZXIgICAgUHlFeHBhdF9YTUxfU2V0U3RhcnROYW1lc3BhY2VEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0VW5rbm93bkVuY29kaW5nSGFuZGxlciAgIFB5RXhwYXRfWE1MX1NldFVua25vd25FbmNvZGluZ0hhbmRsZXIKKyNkZWZpbmUgWE1MX1NldFVucGFyc2VkRW50aXR5RGVjbEhhbmRsZXIgICAgUHlFeHBhdF9YTUxfU2V0VW5wYXJzZWRFbnRpdHlEZWNsSGFuZGxlcgorI2RlZmluZSBYTUxfU2V0VXNlckRhdGEgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1NldFVzZXJEYXRhCisjZGVmaW5lIFhNTF9TZXRYbWxEZWNsSGFuZGxlciAgICAgICAgICAgUHlFeHBhdF9YTUxfU2V0WG1sRGVjbEhhbmRsZXIKKyNkZWZpbmUgWG1sU2l6ZU9mVW5rbm93bkVuY29kaW5nICAgICAgICBQeUV4cGF0X1htbFNpemVPZlVua25vd25FbmNvZGluZworI2RlZmluZSBYTUxfU3RvcFBhcnNlciAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWE1MX1N0b3BQYXJzZXIKKyNkZWZpbmUgWE1MX1VzZUZvcmVpZ25EVEQgICAgICAgICAgICAgICBQeUV4cGF0X1hNTF9Vc2VGb3JlaWduRFRECisjZGVmaW5lIFhNTF9Vc2VQYXJzZXJBc0hhbmRsZXJBcmcgICAgICAgUHlFeHBhdF9YTUxfVXNlUGFyc2VyQXNIYW5kbGVyQXJnCisjZGVmaW5lIFhtbFV0ZjE2RW5jb2RlICAgICAgICAgICAgICAgICAgUHlFeHBhdF9YbWxVdGYxNkVuY29kZQorI2RlZmluZSBYbWxVdGY4RW5jb2RlICAgICAgICAgICAgICAgICAgIFB5RXhwYXRfWG1sVXRmOEVuY29kZQorCisKKyNlbmRpZiAvKiAhUFlFWFBBVE5TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jIGIvTW9kdWxlcy9leHBhdC94bWxwYXJzZS5jCmluZGV4IDQyZDk1YjcuLjg4MjQ3MGQgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1scGFyc2UuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHBhcnNlLmMKQEAgLTgsNiArOCw4IEBACiAjaW5jbHVkZSAid2luY29uZmlnLmgiCiAjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCiAjaW5jbHVkZSAibWFjY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fYW1pZ2FvczRfXykKKyNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChIQVZFX0VYUEFUX0NPTkZJR19IKQogI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgogI2VuZGlmIC8qIG5kZWYgQ09NUElMRURfRlJPTV9EU1AgKi8KQEAgLTQ1Niw3ICs0NTgsNyBAQAogICBjaGFyICptX2J1ZmZlckVuZDsKICAgLyogYWxsb2NhdGVkIGVuZCBvZiBidWZmZXIgKi8KICAgY29uc3QgY2hhciAqbV9idWZmZXJMaW07Ci0gIGxvbmcgbV9wYXJzZUVuZEJ5dGVJbmRleDsKKyAgWE1MX0luZGV4IG1fcGFyc2VFbmRCeXRlSW5kZXg7CiAgIGNvbnN0IGNoYXIgKm1fcGFyc2VFbmRQdHI7CiAgIFhNTF9DaGFyICptX2RhdGFCdWY7CiAgIFhNTF9DaGFyICptX2RhdGFCdWZFbmQ7CkBAIC02NDAsOCArNjQyLDggQEAKICNkZWZpbmUgZ3JvdXBTaXplIChwYXJzZXItPm1fZ3JvdXBTaXplKQogI2RlZmluZSBuYW1lc3BhY2VTZXBhcmF0b3IgKHBhcnNlci0+bV9uYW1lc3BhY2VTZXBhcmF0b3IpCiAjZGVmaW5lIHBhcmVudFBhcnNlciAocGFyc2VyLT5tX3BhcmVudFBhcnNlcikKLSNkZWZpbmUgcGFyc2luZyAocGFyc2VyLT5tX3BhcnNpbmdTdGF0dXMucGFyc2luZykKLSNkZWZpbmUgZmluYWxCdWZmZXIgKHBhcnNlci0+bV9wYXJzaW5nU3RhdHVzLmZpbmFsQnVmZmVyKQorI2RlZmluZSBwc19wYXJzaW5nIChwYXJzZXItPm1fcGFyc2luZ1N0YXR1cy5wYXJzaW5nKQorI2RlZmluZSBwc19maW5hbEJ1ZmZlciAocGFyc2VyLT5tX3BhcnNpbmdTdGF0dXMuZmluYWxCdWZmZXIpCiAjaWZkZWYgWE1MX0RURAogI2RlZmluZSBpc1BhcmFtRW50aXR5IChwYXJzZXItPm1faXNQYXJhbUVudGl0eSkKICNkZWZpbmUgdXNlRm9yZWlnbkRURCAocGFyc2VyLT5tX3VzZUZvcmVpZ25EVEQpCkBAIC04NTIsNyArODU0LDcgQEAKICAgdW5rbm93bkVuY29kaW5nUmVsZWFzZSA9IE5VTEw7CiAgIHVua25vd25FbmNvZGluZ0RhdGEgPSBOVUxMOwogICBwYXJlbnRQYXJzZXIgPSBOVUxMOwotICBwYXJzaW5nID0gWE1MX0lOSVRJQUxJWkVEOworICBwc19wYXJzaW5nID0gWE1MX0lOSVRJQUxJWkVEOwogI2lmZGVmIFhNTF9EVEQKICAgaXNQYXJhbUVudGl0eSA9IFhNTF9GQUxTRTsKICAgdXNlRm9yZWlnbkRURCA9IFhNTF9GQUxTRTsKQEAgLTkxNSw3ICs5MTcsNyBAQAogICAgICBYWFggVGhlcmUncyBubyB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIG9mIHRoZQogICAgICBYWFggcG9zc2libGUgZXJyb3IgY2FzZXMgY2F1c2VkIHRoZSBYTUxfU1RBVFVTX0VSUk9SIHJldHVybi4KICAgKi8KLSAgaWYgKHBhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQorICBpZiAocHNfcGFyc2luZyA9PSBYTUxfUEFSU0lORyB8fCBwc19wYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpCiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgIGlmIChlbmNvZGluZ05hbWUgPT0gTlVMTCkKICAgICBwcm90b2NvbEVuY29kaW5nTmFtZSA9IE5VTEw7CkBAIC0xMTQzLDcgKzExNDUsNyBAQAogewogI2lmZGVmIFhNTF9EVEQKICAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCi0gIGlmIChwYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQogICAgIHJldHVybiBYTUxfRVJST1JfQ0FOVF9DSEFOR0VfRkVBVFVSRV9PTkNFX1BBUlNJTkc7CiAgIHVzZUZvcmVpZ25EVEQgPSB1c2VEVEQ7CiAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKQEAgLTExNTYsNyArMTE1OCw3IEBACiBYTUxfU2V0UmV0dXJuTlNUcmlwbGV0KFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgZG9fbnN0KQogewogICAvKiBibG9jayBhZnRlciBYTUxfUGFyc2UoKS9YTUxfUGFyc2VCdWZmZXIoKSBoYXMgYmVlbiBjYWxsZWQgKi8KLSAgaWYgKHBhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQorICBpZiAocHNfcGFyc2luZyA9PSBYTUxfUEFSU0lORyB8fCBwc19wYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpCiAgICAgcmV0dXJuOwogICBuc190cmlwbGV0cyA9IGRvX25zdCA/IFhNTF9UUlVFIDogWE1MX0ZBTFNFOwogfQpAQCAtMTQwOCw3ICsxNDEwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBYTUxfUGFyYW1FbnRpdHlQYXJzaW5nIHBlUGFyc2luZykKIHsKICAgLyogYmxvY2sgYWZ0ZXIgWE1MX1BhcnNlKCkvWE1MX1BhcnNlQnVmZmVyKCkgaGFzIGJlZW4gY2FsbGVkICovCi0gIGlmIChwYXJzaW5nID09IFhNTF9QQVJTSU5HIHx8IHBhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkKKyAgaWYgKHBzX3BhcnNpbmcgPT0gWE1MX1BBUlNJTkcgfHwgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKQogICAgIHJldHVybiAwOwogI2lmZGVmIFhNTF9EVEQKICAgcGFyYW1FbnRpdHlQYXJzaW5nID0gcGVQYXJzaW5nOwpAQCAtMTQyMSw3ICsxNDIzLDcgQEAKIGVudW0gWE1MX1N0YXR1cyBYTUxDQUxMCiBYTUxfUGFyc2UoWE1MX1BhcnNlciBwYXJzZXIsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4sIGludCBpc0ZpbmFsKQogewotICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOwogICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwpAQCAtMTQyOSwxMSArMTQzMSwxMSBAQAogICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9GSU5JU0hFRDsKICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgZGVmYXVsdDoKLSAgICBwYXJzaW5nID0gWE1MX1BBUlNJTkc7CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOwogICB9CiAKICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgZmluYWxCdWZmZXIgPSAoWE1MX0Jvb2wpaXNGaW5hbDsKKyAgICBwc19maW5hbEJ1ZmZlciA9IChYTUxfQm9vbClpc0ZpbmFsOwogICAgIGlmICghaXNGaW5hbCkKICAgICAgIHJldHVybiBYTUxfU1RBVFVTX09LOwogICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOwpAQCAtMTQ0MSwxOSArMTQ0MywxOSBAQAogCiAgICAgLyogSWYgZGF0YSBhcmUgbGVmdCBvdmVyIGZyb20gbGFzdCBidWZmZXIsIGFuZCB3ZSBub3cga25vdyB0aGF0IHRoZXNlCiAgICAgICAgZGF0YSBhcmUgdGhlIGZpbmFsIGNodW5rIG9mIGlucHV0LCB0aGVuIHdlIGhhdmUgdG8gY2hlY2sgdGhlbSBhZ2FpbgotICAgICAgIHRvIGRldGVjdCBlcnJvcnMgYmFzZWQgb24gdGhpcyBpbmZvcm1hdGlvbi4KKyAgICAgICB0byBkZXRlY3QgZXJyb3JzIGJhc2VkIG9uIHRoYXQgZmFjdC4KICAgICAqLwogICAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOwogCiAgICAgaWYgKGVycm9yQ29kZSA9PSBYTUxfRVJST1JfTk9ORSkgewotICAgICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgICAgWG1sVXBkYXRlUG9zaXRpb24oZW5jb2RpbmcsIHBvc2l0aW9uUHRyLCBidWZmZXJQdHIsICZwb3NpdGlvbik7CiAgICAgICAgIHBvc2l0aW9uUHRyID0gYnVmZmVyUHRyOwogICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CiAgICAgICBjYXNlIFhNTF9JTklUSUFMSVpFRDogCiAgICAgICBjYXNlIFhNTF9QQVJTSU5HOgotICAgICAgICBwYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgICAgICBwc19wYXJzaW5nID0gWE1MX0ZJTklTSEVEOwogICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBYTUxfU1RBVFVTX09LOwpAQCAtMTQ3MCw3ICsxNDcyLDcgQEAKICAgICBlbnVtIFhNTF9FcnJvciByZXN1bHQ7CiAgICAgcGFyc2VFbmRCeXRlSW5kZXggKz0gbGVuOwogICAgIHBvc2l0aW9uUHRyID0gczsKLSAgICBmaW5hbEJ1ZmZlciA9IChYTUxfQm9vbClpc0ZpbmFsOworICAgIHBzX2ZpbmFsQnVmZmVyID0gKFhNTF9Cb29sKWlzRmluYWw7CiAKICAgICBlcnJvckNvZGUgPSBwcm9jZXNzb3IocGFyc2VyLCBzLCBwYXJzZUVuZFB0ciA9IHMgKyBsZW4sICZlbmQpOwogCkBAIC0xNDgwLDcgKzE0ODIsNyBAQAogICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgICAgfQogICAgIGVsc2UgewotICAgICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CiAgICAgICAgIGJyZWFrOwpAQCAtMTQ4OCwxNCArMTQ5MCwxMyBAQAogICAgICAgY2FzZSBYTUxfUEFSU0lORzoKICAgICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19PSzsKICAgICAgICAgaWYgKGlzRmluYWwpIHsKLSAgICAgICAgICBwYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CiAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KIAogICAgIFhtbFVwZGF0ZVBvc2l0aW9uKGVuY29kaW5nLCBwb3NpdGlvblB0ciwgZW5kLCAmcG9zaXRpb24pOwotICAgIHBvc2l0aW9uUHRyID0gZW5kOwogICAgIG5MZWZ0T3ZlciA9IHMgKyBsZW4gLSBlbmQ7CiAgICAgaWYgKG5MZWZ0T3ZlcikgewogICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IG5MZWZ0T3ZlciA+IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgewpAQCAtMTUxOCw5ICsxNTE5LDEzIEBACiAgICAgICAgIGJ1ZmZlckxpbSA9IGJ1ZmZlciArIGxlbiAqIDI7CiAgICAgICB9CiAgICAgICBtZW1jcHkoYnVmZmVyLCBlbmQsIG5MZWZ0T3Zlcik7Ci0gICAgICBidWZmZXJQdHIgPSBidWZmZXI7Ci0gICAgICBidWZmZXJFbmQgPSBidWZmZXIgKyBuTGVmdE92ZXI7CiAgICAgfQorICAgIGJ1ZmZlclB0ciA9IGJ1ZmZlcjsKKyAgICBidWZmZXJFbmQgPSBidWZmZXIgKyBuTGVmdE92ZXI7CisgICAgcG9zaXRpb25QdHIgPSBidWZmZXJQdHI7CisgICAgcGFyc2VFbmRQdHIgPSBidWZmZXJFbmQ7CisgICAgZXZlbnRQdHIgPSBidWZmZXJQdHI7CisgICAgZXZlbnRFbmRQdHIgPSBidWZmZXJQdHI7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogI2VuZGlmICAvKiBub3QgZGVmaW5lZCBYTUxfQ09OVEVYVF9CWVRFUyAqLwpAQCAtMTU0MSw3ICsxNTQ2LDcgQEAKICAgY29uc3QgY2hhciAqc3RhcnQ7CiAgIGVudW0gWE1MX1N0YXR1cyByZXN1bHQgPSBYTUxfU1RBVFVTX09LOwogCi0gIHN3aXRjaCAocGFyc2luZykgeworICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9TVVNQRU5ERUQ7CiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CkBAIC0xNTQ5LDcgKzE1NTQsNyBAQAogICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9GSU5JU0hFRDsKICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgZGVmYXVsdDoKLSAgICBwYXJzaW5nID0gWE1MX1BBUlNJTkc7CisgICAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOwogICB9CiAKICAgc3RhcnQgPSBidWZmZXJQdHI7CkBAIC0xNTU3LDcgKzE1NjIsNyBAQAogICBidWZmZXJFbmQgKz0gbGVuOwogICBwYXJzZUVuZFB0ciA9IGJ1ZmZlckVuZDsKICAgcGFyc2VFbmRCeXRlSW5kZXggKz0gbGVuOwotICBmaW5hbEJ1ZmZlciA9IChYTUxfQm9vbClpc0ZpbmFsOworICBwc19maW5hbEJ1ZmZlciA9IChYTUxfQm9vbClpc0ZpbmFsOwogCiAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIHN0YXJ0LCBwYXJzZUVuZFB0ciwgJmJ1ZmZlclB0cik7CiAKQEAgLTE1NjcsMTQgKzE1NzIsMTQgQEAKICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgfQogICBlbHNlIHsKLSAgICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgICByZXN1bHQgPSBYTUxfU1RBVFVTX1NVU1BFTkRFRDsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgWE1MX0lOSVRJQUxJWkVEOiAKICAgICBjYXNlIFhNTF9QQVJTSU5HOgogICAgICAgaWYgKGlzRmluYWwpIHsKLSAgICAgICAgcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgIH0KICAgICBkZWZhdWx0OiA7ICAvKiBzaG91bGQgbm90IGhhcHBlbiAqLwpAQCAtMTU4OSw3ICsxNTk0LDcgQEAKIHZvaWQgKiBYTUxDQUxMCiBYTUxfR2V0QnVmZmVyKFhNTF9QYXJzZXIgcGFyc2VyLCBpbnQgbGVuKQogewotICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOwogICAgIHJldHVybiBOVUxMOwpAQCAtMTYwMSw5ICsxNjA2LDkgQEAKIAogICBpZiAobGVuID4gYnVmZmVyTGltIC0gYnVmZmVyRW5kKSB7CiAgICAgLyogRklYTUUgYXZvaWQgaW50ZWdlciBvdmVyZmxvdyAqLwotICAgIGludCBuZWVkZWRTaXplID0gbGVuICsgKGJ1ZmZlckVuZCAtIGJ1ZmZlclB0cik7CisgICAgaW50IG5lZWRlZFNpemUgPSBsZW4gKyAoaW50KShidWZmZXJFbmQgLSBidWZmZXJQdHIpOwogI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCi0gICAgaW50IGtlZXAgPSBidWZmZXJQdHIgLSBidWZmZXI7CisgICAgaW50IGtlZXAgPSAoaW50KShidWZmZXJQdHIgLSBidWZmZXIpOwogCiAgICAgaWYgKGtlZXAgPiBYTUxfQ09OVEVYVF9CWVRFUykKICAgICAgIGtlZXAgPSBYTUxfQ09OVEVYVF9CWVRFUzsKQEAgLTE2MTIsNyArMTYxNyw3IEBACiAgICAgaWYgKG5lZWRlZFNpemUgIDw9IGJ1ZmZlckxpbSAtIGJ1ZmZlcikgewogI2lmZGVmIFhNTF9DT05URVhUX0JZVEVTCiAgICAgICBpZiAoa2VlcCA8IGJ1ZmZlclB0ciAtIGJ1ZmZlcikgewotICAgICAgICBpbnQgb2Zmc2V0ID0gKGJ1ZmZlclB0ciAtIGJ1ZmZlcikgLSBrZWVwOworICAgICAgICBpbnQgb2Zmc2V0ID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKSAtIGtlZXA7CiAgICAgICAgIG1lbW1vdmUoYnVmZmVyLCAmYnVmZmVyW29mZnNldF0sIGJ1ZmZlckVuZCAtIGJ1ZmZlclB0ciArIGtlZXApOwogICAgICAgICBidWZmZXJFbmQgLT0gb2Zmc2V0OwogICAgICAgICBidWZmZXJQdHIgLT0gb2Zmc2V0OwpAQCAtMTYyNSw3ICsxNjMwLDcgQEAKICAgICB9CiAgICAgZWxzZSB7CiAgICAgICBjaGFyICpuZXdCdWY7Ci0gICAgICBpbnQgYnVmZmVyU2l6ZSA9IGJ1ZmZlckxpbSAtIGJ1ZmZlclB0cjsKKyAgICAgIGludCBidWZmZXJTaXplID0gKGludCkoYnVmZmVyTGltIC0gYnVmZmVyUHRyKTsKICAgICAgIGlmIChidWZmZXJTaXplID09IDApCiAgICAgICAgIGJ1ZmZlclNpemUgPSBJTklUX0JVRkZFUl9TSVpFOwogICAgICAgZG8gewpAQCAtMTYzOSw3ICsxNjQ0LDcgQEAKICAgICAgIGJ1ZmZlckxpbSA9IG5ld0J1ZiArIGJ1ZmZlclNpemU7CiAjaWZkZWYgWE1MX0NPTlRFWFRfQllURVMKICAgICAgIGlmIChidWZmZXJQdHIpIHsKLSAgICAgICAgaW50IGtlZXAgPSBidWZmZXJQdHIgLSBidWZmZXI7CisgICAgICAgIGludCBrZWVwID0gKGludCkoYnVmZmVyUHRyIC0gYnVmZmVyKTsKICAgICAgICAgaWYgKGtlZXAgPiBYTUxfQ09OVEVYVF9CWVRFUykKICAgICAgICAgICBrZWVwID0gWE1MX0NPTlRFWFRfQllURVM7CiAgICAgICAgIG1lbWNweShuZXdCdWYsICZidWZmZXJQdHJbLWtlZXBdLCBidWZmZXJFbmQgLSBidWZmZXJQdHIgKyBrZWVwKTsKQEAgLTE2NjgsMTMgKzE2NzMsMTMgQEAKIGVudW0gWE1MX1N0YXR1cyBYTUxDQUxMCiBYTUxfU3RvcFBhcnNlcihYTUxfUGFyc2VyIHBhcnNlciwgWE1MX0Jvb2wgcmVzdW1hYmxlKQogewotICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgIGNhc2UgWE1MX1NVU1BFTkRFRDoKICAgICBpZiAocmVzdW1hYmxlKSB7CiAgICAgICBlcnJvckNvZGUgPSBYTUxfRVJST1JfU1VTUEVOREVEOwogICAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgICAgfQotICAgIHBhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CisgICAgcHNfcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKICAgICBicmVhazsKICAgY2FzZSBYTUxfRklOSVNIRUQ6CiAgICAgZXJyb3JDb2RlID0gWE1MX0VSUk9SX0ZJTklTSEVEOwpAQCAtMTY4NywxMCArMTY5MiwxMCBAQAogICAgICAgICByZXR1cm4gWE1MX1NUQVRVU19FUlJPUjsKICAgICAgIH0KICNlbmRpZgotICAgICAgcGFyc2luZyA9IFhNTF9TVVNQRU5ERUQ7CisgICAgICBwc19wYXJzaW5nID0gWE1MX1NVU1BFTkRFRDsKICAgICB9CiAgICAgZWxzZQotICAgICAgcGFyc2luZyA9IFhNTF9GSU5JU0hFRDsKKyAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CiAgIH0KICAgcmV0dXJuIFhNTF9TVEFUVVNfT0s7CiB9CkBAIC0xNzAwLDExICsxNzA1LDExIEBACiB7CiAgIGVudW0gWE1MX1N0YXR1cyByZXN1bHQgPSBYTUxfU1RBVFVTX09LOwogCi0gIGlmIChwYXJzaW5nICE9IFhNTF9TVVNQRU5ERUQpIHsKKyAgaWYgKHBzX3BhcnNpbmcgIT0gWE1MX1NVU1BFTkRFRCkgewogICAgIGVycm9yQ29kZSA9IFhNTF9FUlJPUl9OT1RfU1VTUEVOREVEOwogICAgIHJldHVybiBYTUxfU1RBVFVTX0VSUk9SOwogICB9Ci0gIHBhcnNpbmcgPSBYTUxfUEFSU0lORzsKKyAgcHNfcGFyc2luZyA9IFhNTF9QQVJTSU5HOwogCiAgIGVycm9yQ29kZSA9IHByb2Nlc3NvcihwYXJzZXIsIGJ1ZmZlclB0ciwgcGFyc2VFbmRQdHIsICZidWZmZXJQdHIpOwogCkBAIC0xNzE0LDE0ICsxNzE5LDE0IEBACiAgICAgcmV0dXJuIFhNTF9TVEFUVVNfRVJST1I7CiAgIH0KICAgZWxzZSB7Ci0gICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgY2FzZSBYTUxfU1VTUEVOREVEOgogICAgICAgcmVzdWx0ID0gWE1MX1NUQVRVU19TVVNQRU5ERUQ7CiAgICAgICBicmVhazsKICAgICBjYXNlIFhNTF9JTklUSUFMSVpFRDogCiAgICAgY2FzZSBYTUxfUEFSU0lORzoKLSAgICAgIGlmIChmaW5hbEJ1ZmZlcikgewotICAgICAgICBwYXJzaW5nID0gWE1MX0ZJTklTSEVEOworICAgICAgaWYgKHBzX2ZpbmFsQnVmZmVyKSB7CisgICAgICAgIHBzX3BhcnNpbmcgPSBYTUxfRklOSVNIRUQ7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICB9CiAgICAgZGVmYXVsdDogOwpAQCAtMTc0Niw3ICsxNzUxLDcgQEAKICAgcmV0dXJuIGVycm9yQ29kZTsKIH0KIAotbG9uZyBYTUxDQUxMCitYTUxfSW5kZXggWE1MQ0FMTAogWE1MX0dldEN1cnJlbnRCeXRlSW5kZXgoWE1MX1BhcnNlciBwYXJzZXIpCiB7CiAgIGlmIChldmVudFB0cikKQEAgLTE3NTgsNyArMTc2Myw3IEBACiBYTUxfR2V0Q3VycmVudEJ5dGVDb3VudChYTUxfUGFyc2VyIHBhcnNlcikKIHsKICAgaWYgKGV2ZW50RW5kUHRyICYmIGV2ZW50UHRyKQotICAgIHJldHVybiBldmVudEVuZFB0ciAtIGV2ZW50UHRyOworICAgIHJldHVybiAoaW50KShldmVudEVuZFB0ciAtIGV2ZW50UHRyKTsKICAgcmV0dXJuIDA7CiB9CiAKQEAgLTE3NjcsMTUgKzE3NzIsMTUgQEAKIHsKICNpZmRlZiBYTUxfQ09OVEVYVF9CWVRFUwogICBpZiAoZXZlbnRQdHIgJiYgYnVmZmVyKSB7Ci0gICAgKm9mZnNldCA9IGV2ZW50UHRyIC0gYnVmZmVyOwotICAgICpzaXplICAgPSBidWZmZXJFbmQgLSBidWZmZXI7CisgICAgKm9mZnNldCA9IChpbnQpKGV2ZW50UHRyIC0gYnVmZmVyKTsKKyAgICAqc2l6ZSAgID0gKGludCkoYnVmZmVyRW5kIC0gYnVmZmVyKTsKICAgICByZXR1cm4gYnVmZmVyOwogICB9CiAjZW5kaWYgLyogZGVmaW5lZCBYTUxfQ09OVEVYVF9CWVRFUyAqLwogICByZXR1cm4gKGNoYXIgKikgMDsKIH0KIAotaW50IFhNTENBTEwKK1hNTF9TaXplIFhNTENBTEwKIFhNTF9HZXRDdXJyZW50TGluZU51bWJlcihYTUxfUGFyc2VyIHBhcnNlcikKIHsKICAgaWYgKGV2ZW50UHRyICYmIGV2ZW50UHRyID49IHBvc2l0aW9uUHRyKSB7CkBAIC0xNzg1LDcgKzE3OTAsNyBAQAogICByZXR1cm4gcG9zaXRpb24ubGluZU51bWJlciArIDE7CiB9CiAKLWludCBYTUxDQUxMCitYTUxfU2l6ZSBYTUxDQUxMCiBYTUxfR2V0Q3VycmVudENvbHVtbk51bWJlcihYTUxfUGFyc2VyIHBhcnNlcikKIHsKICAgaWYgKGV2ZW50UHRyICYmIGV2ZW50UHRyID49IHBvc2l0aW9uUHRyKSB7CkBAIC0xODM2LDcgKzE4NDEsNyBAQAogY29uc3QgWE1MX0xDaGFyICogWE1MQ0FMTAogWE1MX0Vycm9yU3RyaW5nKGVudW0gWE1MX0Vycm9yIGNvZGUpCiB7Ci0gIHN0YXRpYyBjb25zdCBYTUxfTENoYXIgKm1lc3NhZ2VbXSA9IHsKKyAgc3RhdGljIGNvbnN0IFhNTF9MQ2hhciogY29uc3QgbWVzc2FnZVtdID0gewogICAgIDAsCiAgICAgWE1MX0woIm91dCBvZiBtZW1vcnkiKSwKICAgICBYTUxfTCgic3ludGF4IGVycm9yIiksCkBAIC0xODU0LDcgKzE4NTksNyBAQAogICAgIFhNTF9MKCJyZWZlcmVuY2UgdG8gaW52YWxpZCBjaGFyYWN0ZXIgbnVtYmVyIiksCiAgICAgWE1MX0woInJlZmVyZW5jZSB0byBiaW5hcnkgZW50aXR5IiksCiAgICAgWE1MX0woInJlZmVyZW5jZSB0byBleHRlcm5hbCBlbnRpdHkgaW4gYXR0cmlidXRlIiksCi0gICAgWE1MX0woInhtbCBkZWNsYXJhdGlvbiBub3QgYXQgc3RhcnQgb2YgZXh0ZXJuYWwgZW50aXR5IiksCisgICAgWE1MX0woIlhNTCBvciB0ZXh0IGRlY2xhcmF0aW9uIG5vdCBhdCBzdGFydCBvZiBlbnRpdHkiKSwKICAgICBYTUxfTCgidW5rbm93biBlbmNvZGluZyIpLAogICAgIFhNTF9MKCJlbmNvZGluZyBzcGVjaWZpZWQgaW4gWE1MIGRlY2xhcmF0aW9uIGlzIGluY29ycmVjdCIpLAogICAgIFhNTF9MKCJ1bmNsb3NlZCBDREFUQSBzZWN0aW9uIiksCkBAIC0xODc0LDcgKzE4NzksMTAgQEAKICAgICBYTUxfTCgicGFyc2VyIG5vdCBzdXNwZW5kZWQiKSwKICAgICBYTUxfTCgicGFyc2luZyBhYm9ydGVkIiksCiAgICAgWE1MX0woInBhcnNpbmcgZmluaXNoZWQiKSwKLSAgICBYTUxfTCgiY2Fubm90IHN1c3BlbmQgaW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eSIpCisgICAgWE1MX0woImNhbm5vdCBzdXNwZW5kIGluIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkiKSwKKyAgICBYTUxfTCgicmVzZXJ2ZWQgcHJlZml4ICh4bWwpIG11c3Qgbm90IGJlIHVuZGVjbGFyZWQgb3IgYm91bmQgdG8gYW5vdGhlciBuYW1lc3BhY2UgbmFtZSIpLAorICAgIFhNTF9MKCJyZXNlcnZlZCBwcmVmaXggKHhtbG5zKSBtdXN0IG5vdCBiZSBkZWNsYXJlZCBvciB1bmRlY2xhcmVkIiksCisgICAgWE1MX0woInByZWZpeCBtdXN0IG5vdCBiZSBib3VuZCB0byBvbmUgb2YgdGhlIHJlc2VydmVkIG5hbWVzcGFjZSBuYW1lcyIpCiAgIH07CiAgIGlmIChjb2RlID4gMCAmJiBjb2RlIDwgc2l6ZW9mKG1lc3NhZ2UpL3NpemVvZihtZXNzYWdlWzBdKSkKICAgICByZXR1cm4gbWVzc2FnZVtjb2RlXTsKQEAgLTE5MTYsOSArMTkyNCwxMSBAQAogY29uc3QgWE1MX0ZlYXR1cmUgKiBYTUxDQUxMCiBYTUxfR2V0RmVhdHVyZUxpc3Qodm9pZCkKIHsKLSAgc3RhdGljIFhNTF9GZWF0dXJlIGZlYXR1cmVzW10gPSB7Ci0gICAge1hNTF9GRUFUVVJFX1NJWkVPRl9YTUxfQ0hBUiwgIFhNTF9MKCJzaXplb2YoWE1MX0NoYXIpIiksIDB9LAotICAgIHtYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0xDSEFSLCBYTUxfTCgic2l6ZW9mKFhNTF9MQ2hhcikiKSwgMH0sCisgIHN0YXRpYyBjb25zdCBYTUxfRmVhdHVyZSBmZWF0dXJlc1tdID0geworICAgIHtYTUxfRkVBVFVSRV9TSVpFT0ZfWE1MX0NIQVIsICBYTUxfTCgic2l6ZW9mKFhNTF9DaGFyKSIpLAorICAgICBzaXplb2YoWE1MX0NoYXIpfSwKKyAgICB7WE1MX0ZFQVRVUkVfU0laRU9GX1hNTF9MQ0hBUiwgWE1MX0woInNpemVvZihYTUxfTENoYXIpIiksCisgICAgIHNpemVvZihYTUxfTENoYXIpfSwKICNpZmRlZiBYTUxfVU5JQ09ERQogICAgIHtYTUxfRkVBVFVSRV9VTklDT0RFLCAgICAgICAgICBYTUxfTCgiWE1MX1VOSUNPREUiKSwgMH0sCiAjZW5kaWYKQEAgLTE5MzUsMTEgKzE5NDUsMTIgQEAKICNpZmRlZiBYTUxfTUlOX1NJWkUKICAgICB7WE1MX0ZFQVRVUkVfTUlOX1NJWkUsICAgICAgICAgWE1MX0woIlhNTF9NSU5fU0laRSIpLCAwfSwKICNlbmRpZgorI2lmZGVmIFhNTF9OUworICAgIHtYTUxfRkVBVFVSRV9OUywgICAgICAgICAgICAgICBYTUxfTCgiWE1MX05TIiksIDB9LAorI2VuZGlmCiAgICAge1hNTF9GRUFUVVJFX0VORCwgICAgICAgICAgICAgIE5VTEwsIDB9CiAgIH07CiAKLSAgZmVhdHVyZXNbMF0udmFsdWUgPSBzaXplb2YoWE1MX0NoYXIpOwotICBmZWF0dXJlc1sxXS52YWx1ZSA9IHNpemVvZihYTUxfTENoYXIpOwogICByZXR1cm4gZmVhdHVyZXM7CiB9CiAKQEAgLTIwMDAsNyArMjAxMSw3IEBACiAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplbmRQdHIpCiB7CiAgIGVudW0gWE1MX0Vycm9yIHJlc3VsdCA9IGRvQ29udGVudChwYXJzZXIsIDAsIGVuY29kaW5nLCBzdGFydCwgZW5kLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhcHNfZmluYWxCdWZmZXIpOwogICBpZiAocmVzdWx0ID09IFhNTF9FUlJPUl9OT05FKSB7CiAgICAgaWYgKCFzdG9yZVJhd05hbWVzKHBhcnNlcikpCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PX01FTU9SWTsKQEAgLTIwMzYsMjEgKzIwNDcsMjEgQEAKICAgICAgICBkb0NvbnRlbnQgKGJ5IGRldGVjdGluZyBYTUxfVE9LX05PTkUpIHdpdGhvdXQgcHJvY2Vzc2luZyBhbnkgeG1sIHRleHQKICAgICAgICBkZWNsYXJhdGlvbiAtIGNhdXNpbmcgdGhlIGVycm9yIFhNTF9FUlJPUl9NSVNQTEFDRURfWE1MX1BJIGluIGRvQ29udGVudC4KICAgICAqLwotICAgIGlmIChuZXh0ID09IGVuZCAmJiAhZmluYWxCdWZmZXIpIHsKKyAgICBpZiAobmV4dCA9PSBlbmQgJiYgIXBzX2ZpbmFsQnVmZmVyKSB7CiAgICAgICAqZW5kUHRyID0gbmV4dDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CiAgICAgc3RhcnQgPSBuZXh0OwogICAgIGJyZWFrOwogICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICBpZiAoIWZpbmFsQnVmZmVyKSB7CisgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgewogICAgICAgKmVuZFB0ciA9IHN0YXJ0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIH0KICAgICBldmVudFB0ciA9IHN0YXJ0OwogICAgIHJldHVybiBYTUxfRVJST1JfVU5DTE9TRURfVE9LRU47CiAgIGNhc2UgWE1MX1RPS19QQVJUSUFMX0NIQVI6Ci0gICAgaWYgKCFmaW5hbEJ1ZmZlcikgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIpIHsKICAgICAgICplbmRQdHIgPSBzdGFydDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CkBAIC0yMDgwLDcgKzIwOTEsNyBAQAogICAgICAgcmVzdWx0ID0gcHJvY2Vzc1htbERlY2wocGFyc2VyLCAxLCBzdGFydCwgbmV4dCk7CiAgICAgICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQogICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCiAgICAgICAgICplbmRQdHIgPSBuZXh0OwogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0yMDkyLDEzICsyMTAzLDEzIEBACiAgICAgfQogICAgIGJyZWFrOwogICBjYXNlIFhNTF9UT0tfUEFSVElBTDoKLSAgICBpZiAoIWZpbmFsQnVmZmVyKSB7CisgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgewogICAgICAgKmVuZFB0ciA9IHN0YXJ0OwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIH0KICAgICByZXR1cm4gWE1MX0VSUk9SX1VOQ0xPU0VEX1RPS0VOOwogICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgotICAgIGlmICghZmluYWxCdWZmZXIpIHsKKyAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyKSB7CiAgICAgICAqZW5kUHRyID0gc3RhcnQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CiAgICAgfQpAQCAtMjExNiw3ICsyMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQogewogICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NvbnRlbnQocGFyc2VyLCAxLCBlbmNvZGluZywgc3RhcnQsIGVuZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRQdHIsIChYTUxfQm9vbCkhZmluYWxCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKICAgaWYgKHJlc3VsdCA9PSBYTUxfRVJST1JfTk9ORSkgewogICAgIGlmICghc3RvcmVSYXdOYW1lcyhwYXJzZXIpKQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT19NRU1PUlk7CkBAIC0yMzE1LDEyICsyMzI2LDEyIEBACiAgICAgICAgICAgICBYbWxDb252ZXJ0KGVuYywKICAgICAgICAgICAgICAgICAgICAgICAgJmZyb21QdHIsIHJhd05hbWVFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgIChJQ0hBUiAqKikmdG9QdHIsIChJQ0hBUiAqKXRhZy0+YnVmRW5kIC0gMSk7Ci0gICAgICAgICAgICBjb252TGVuID0gdG9QdHIgLSAoWE1MX0NoYXIgKil0YWctPmJ1ZjsKKyAgICAgICAgICAgIGNvbnZMZW4gPSAoaW50KSh0b1B0ciAtIChYTUxfQ2hhciAqKXRhZy0+YnVmKTsKICAgICAgICAgICAgIGlmIChmcm9tUHRyID09IHJhd05hbWVFbmQpIHsKICAgICAgICAgICAgICAgdGFnLT5uYW1lLnN0ckxlbiA9IGNvbnZMZW47CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmU2l6ZSA9ICh0YWctPmJ1ZkVuZCAtIHRhZy0+YnVmKSA8PCAxOworICAgICAgICAgICAgYnVmU2l6ZSA9IChpbnQpKHRhZy0+YnVmRW5kIC0gdGFnLT5idWYpIDw8IDE7CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGNoYXIgKnRlbXAgPSAoY2hhciAqKVJFQUxMT0ModGFnLT5idWYsIGJ1ZlNpemUpOwogICAgICAgICAgICAgICBpZiAodGVtcCA9PSBOVUxMKQpAQCAtMjUwOCwxMiArMjUxOSwxMiBAQAogICAgICAgICAgIElDSEFSICpkYXRhUHRyID0gKElDSEFSICopZGF0YUJ1ZjsKICAgICAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwogICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGRhdGFQdHIgLSAoSUNIQVIgKilkYXRhQnVmKSk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKillbmQgLSAoWE1MX0NoYXIgKilzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoWE1MX0NoYXIgKillbmQgLSAoWE1MX0NoYXIgKilzKSk7CiAgICAgICB9CiAgICAgICBlbHNlIGlmIChkZWZhdWx0SGFuZGxlcikKICAgICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgZW5kKTsKQEAgLTI1MzgsNyArMjU0OSw3IEBACiAgICAgICAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIG5leHQsICZkYXRhUHRyLCAoSUNIQVIgKilkYXRhQnVmRW5kKTsKICAgICAgICAgICAgICpldmVudEVuZFBQID0gczsKICAgICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsIGRhdGFCdWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShkYXRhUHRyIC0gKElDSEFSICopZGF0YUJ1ZikpOwogICAgICAgICAgICAgaWYgKHMgPT0gbmV4dCkKICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAqZXZlbnRQUCA9IHM7CkBAIC0yNTQ3LDcgKzI1NTgsNyBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgY2hhcmFjdGVyRGF0YUhhbmRsZXIoaGFuZGxlckFyZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKilzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChYTUxfQ2hhciAqKW5leHQgLSAoWE1MX0NoYXIgKilzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgoWE1MX0NoYXIgKiluZXh0IC0gKFhNTF9DaGFyICopcykpOwogICAgICAgfQogICAgICAgZWxzZSBpZiAoZGVmYXVsdEhhbmRsZXIpCiAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwpAQCAtMjU2Niw3ICsyNTc3LDcgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICAqZXZlbnRQUCA9IHMgPSBuZXh0OwotICAgIHN3aXRjaCAocGFyc2luZykgeworICAgIHN3aXRjaCAocHNfcGFyc2luZykgewogICAgIGNhc2UgWE1MX1NVU1BFTkRFRDogCiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0yODIyLDcgKzI4MzMsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFzdGVwKQogICAgICAgICAgICAgICBzdGVwID0gUFJPQkVfU1RFUCh1cmlIYXNoLCBtYXNrLCBuc0F0dHNQb3dlcik7Ci0gICAgICAgICAgICBqIDwgc3RlcCA/ICggaiArPSBuc0F0dHNTaXplIC0gc3RlcCkgOiAoaiAtPSBzdGVwKTsKKyAgICAgICAgICAgIGogPCBzdGVwID8gKGogKz0gbnNBdHRzU2l6ZSAtIHN0ZXApIDogKGogLT0gc3RlcCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTI4NDUsOCArMjg1NiwxMCBAQAogICAgICAgICBuc0F0dHNbal0uaGFzaCA9IHVyaUhhc2g7CiAgICAgICAgIG5zQXR0c1tqXS51cmlOYW1lID0gczsKIAotICAgICAgICBpZiAoIS0tblByZWZpeGVzKQorICAgICAgICBpZiAoIS0tblByZWZpeGVzKSB7CisgICAgICAgICAgaSArPSAyOwogICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgICB9CiAgICAgICBlbHNlICAvKiBub3QgcHJlZml4ZWQgKi8KICAgICAgICAgKChYTUxfQ2hhciAqKXMpWy0xXSA9IDA7ICAvKiBjbGVhciBmbGFnICovCkBAIC0yODc5LDE0ICsyODkyLDE0IEBACiAgIHByZWZpeExlbiA9IDA7CiAgIGlmIChuc190cmlwbGV0cyAmJiBiaW5kaW5nLT5wcmVmaXgtPm5hbWUpIHsKICAgICBmb3IgKDsgYmluZGluZy0+cHJlZml4LT5uYW1lW3ByZWZpeExlbisrXTspCi0gICAgICA7CisgICAgICA7ICAvKiBwcmVmaXhMZW4gaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdG9yICovCiAgIH0KICAgdGFnTmFtZVB0ci0+bG9jYWxQYXJ0ID0gbG9jYWxQYXJ0OwogICB0YWdOYW1lUHRyLT51cmlMZW4gPSBiaW5kaW5nLT51cmlMZW47CiAgIHRhZ05hbWVQdHItPnByZWZpeCA9IGJpbmRpbmctPnByZWZpeC0+bmFtZTsKICAgdGFnTmFtZVB0ci0+cHJlZml4TGVuID0gcHJlZml4TGVuOwogICBmb3IgKGkgPSAwOyBsb2NhbFBhcnRbaSsrXTspCi0gICAgOworICAgIDsgIC8qIGkgaW5jbHVkZXMgbnVsbCB0ZXJtaW5hdG9yICovCiAgIG4gPSBpICsgYmluZGluZy0+dXJpTGVuICsgcHJlZml4TGVuOwogICBpZiAobiA+IGJpbmRpbmctPnVyaUFsbG9jKSB7CiAgICAgVEFHICpwOwpAQCAtMjkwMSwxMiArMjkxNCwxMyBAQAogICAgIEZSRUUoYmluZGluZy0+dXJpKTsKICAgICBiaW5kaW5nLT51cmkgPSB1cmk7CiAgIH0KKyAgLyogaWYgbmFtZXNwYWNlU2VwYXJhdG9yICE9ICdcMCcgdGhlbiB1cmkgaW5jbHVkZXMgaXQgYWxyZWFkeSAqLwogICB1cmkgPSBiaW5kaW5nLT51cmkgKyBiaW5kaW5nLT51cmlMZW47CiAgIG1lbWNweSh1cmksIGxvY2FsUGFydCwgaSAqIHNpemVvZihYTUxfQ2hhcikpOworICAvKiB3ZSBhbHdheXMgaGF2ZSBhIG5hbWVzcGFjZSBzZXBhcmF0b3IgYmV0d2VlbiBsb2NhbFBhcnQgYW5kIHByZWZpeCAqLwogICBpZiAocHJlZml4TGVuKSB7Ci0gICAgdXJpID0gdXJpICsgKGkgLSAxKTsKLSAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQotICAgICAgKnVyaSA9IG5hbWVzcGFjZVNlcGFyYXRvcjsKKyAgICB1cmkgKz0gaSAtIDE7CisgICAgKnVyaSA9IG5hbWVzcGFjZVNlcGFyYXRvcjsgIC8qIHJlcGxhY2UgbnVsbCB0ZXJtaW5hdG9yICovCiAgICAgbWVtY3B5KHVyaSArIDEsIGJpbmRpbmctPnByZWZpeC0+bmFtZSwgcHJlZml4TGVuICogc2l6ZW9mKFhNTF9DaGFyKSk7CiAgIH0KICAgdGFnTmFtZVB0ci0+c3RyID0gYmluZGluZy0+dXJpOwpAQCAtMjkyMCw2ICsyOTM0LDI2IEBACiBhZGRCaW5kaW5nKFhNTF9QYXJzZXIgcGFyc2VyLCBQUkVGSVggKnByZWZpeCwgY29uc3QgQVRUUklCVVRFX0lEICphdHRJZCwKICAgICAgICAgICAgY29uc3QgWE1MX0NoYXIgKnVyaSwgQklORElORyAqKmJpbmRpbmdzUHRyKQogeworICBzdGF0aWMgY29uc3QgWE1MX0NoYXIgeG1sTmFtZXNwYWNlW10gPSB7CisgICAgJ2gnLCAndCcsICd0JywgJ3AnLCAnOicsICcvJywgJy8nLAorICAgICd3JywgJ3cnLCAndycsICcuJywgJ3cnLCAnMycsICcuJywgJ28nLCAncicsICdnJywgJy8nLAorICAgICdYJywgJ00nLCAnTCcsICcvJywgJzEnLCAnOScsICc5JywgJzgnLCAnLycsCisgICAgJ24nLCAnYScsICdtJywgJ2UnLCAncycsICdwJywgJ2EnLCAnYycsICdlJywgJ1wwJworICB9OworICBzdGF0aWMgY29uc3QgaW50IHhtbExlbiA9IAorICAgIChpbnQpc2l6ZW9mKHhtbE5hbWVzcGFjZSkvc2l6ZW9mKFhNTF9DaGFyKSAtIDE7CisgIHN0YXRpYyBjb25zdCBYTUxfQ2hhciB4bWxuc05hbWVzcGFjZVtdID0geworICAgICdoJywgJ3QnLCAndCcsICdwJywgJzonLCAnLycsICcvJywKKyAgICAndycsICd3JywgJ3cnLCAnLicsICd3JywgJzMnLCAnLicsICdvJywgJ3InLCAnZycsICcvJywKKyAgICAnMicsICcwJywgJzAnLCAnMCcsICcvJywgJ3gnLCAnbScsICdsJywgJ24nLCAncycsICcvJywgJ1wwJworICB9OworICBzdGF0aWMgY29uc3QgaW50IHhtbG5zTGVuID0gCisgICAgKGludClzaXplb2YoeG1sbnNOYW1lc3BhY2UpL3NpemVvZihYTUxfQ2hhcikgLSAxOworCisgIFhNTF9Cb29sIG11c3RCZVhNTCA9IFhNTF9GQUxTRTsKKyAgWE1MX0Jvb2wgaXNYTUwgPSBYTUxfVFJVRTsKKyAgWE1MX0Jvb2wgaXNYTUxOUyA9IFhNTF9UUlVFOworICAKICAgQklORElORyAqYjsKICAgaW50IGxlbjsKIApAQCAtMjkyNyw4ICsyOTYxLDM5IEBACiAgIGlmICgqdXJpID09IFhNTF9UKCdcMCcpICYmIHByZWZpeC0+bmFtZSkKICAgICByZXR1cm4gWE1MX0VSUk9SX1VOREVDTEFSSU5HX1BSRUZJWDsKIAotICBmb3IgKGxlbiA9IDA7IHVyaVtsZW5dOyBsZW4rKykKLSAgICA7CisgIGlmIChwcmVmaXgtPm5hbWUKKyAgICAgICYmIHByZWZpeC0+bmFtZVswXSA9PSBYTUxfVCgneCcpCisgICAgICAmJiBwcmVmaXgtPm5hbWVbMV0gPT0gWE1MX1QoJ20nKQorICAgICAgJiYgcHJlZml4LT5uYW1lWzJdID09IFhNTF9UKCdsJykpIHsKKworICAgIC8qIE5vdCBhbGxvd2VkIHRvIGJpbmQgeG1sbnMgKi8KKyAgICBpZiAocHJlZml4LT5uYW1lWzNdID09IFhNTF9UKCduJykKKyAgICAgICAgJiYgcHJlZml4LT5uYW1lWzRdID09IFhNTF9UKCdzJykKKyAgICAgICAgJiYgcHJlZml4LT5uYW1lWzVdID09IFhNTF9UKCdcMCcpKQorICAgICAgcmV0dXJuIFhNTF9FUlJPUl9SRVNFUlZFRF9QUkVGSVhfWE1MTlM7CisKKyAgICBpZiAocHJlZml4LT5uYW1lWzNdID09IFhNTF9UKCdcMCcpKQorICAgICAgbXVzdEJlWE1MID0gWE1MX1RSVUU7CisgIH0KKworICBmb3IgKGxlbiA9IDA7IHVyaVtsZW5dOyBsZW4rKykgeworICAgIGlmIChpc1hNTCAmJiAobGVuID4geG1sTGVuIHx8IHVyaVtsZW5dICE9IHhtbE5hbWVzcGFjZVtsZW5dKSkKKyAgICAgIGlzWE1MID0gWE1MX0ZBTFNFOworCisgICAgaWYgKCFtdXN0QmVYTUwgJiYgaXNYTUxOUyAKKyAgICAgICAgJiYgKGxlbiA+IHhtbG5zTGVuIHx8IHVyaVtsZW5dICE9IHhtbG5zTmFtZXNwYWNlW2xlbl0pKQorICAgICAgaXNYTUxOUyA9IFhNTF9GQUxTRTsKKyAgfQorICBpc1hNTCA9IGlzWE1MICYmIGxlbiA9PSB4bWxMZW47CisgIGlzWE1MTlMgPSBpc1hNTE5TICYmIGxlbiA9PSB4bWxuc0xlbjsKKworICBpZiAobXVzdEJlWE1MICE9IGlzWE1MKQorICAgIHJldHVybiBtdXN0QmVYTUwgPyBYTUxfRVJST1JfUkVTRVJWRURfUFJFRklYX1hNTAorICAgICAgICAgICAgICAgICAgICAgOiBYTUxfRVJST1JfUkVTRVJWRURfTkFNRVNQQUNFX1VSSTsKKworICBpZiAoaXNYTUxOUykKKyAgICByZXR1cm4gWE1MX0VSUk9SX1JFU0VSVkVEX05BTUVTUEFDRV9VUkk7CisKICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvcikKICAgICBsZW4rKzsKICAgaWYgKGZyZWVCaW5kaW5nTGlzdCkgewpAQCAtMjk4NSw3ICszMDUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQogewogICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0NkYXRhU2VjdGlvbihwYXJzZXIsIGVuY29kaW5nLCAmc3RhcnQsIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKICAgICByZXR1cm4gcmVzdWx0OwogICBpZiAoc3RhcnQpIHsKQEAgLTMwNDQsNyArMzEwOSw3IEBACiAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogICAgICAgKnN0YXJ0UHRyID0gbmV4dDsKICAgICAgICpuZXh0UHRyID0gbmV4dDsKLSAgICAgIGlmIChwYXJzaW5nID09IFhNTF9GSU5JU0hFRCkKKyAgICAgIGlmIChwc19wYXJzaW5nID09IFhNTF9GSU5JU0hFRCkKICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9BQk9SVEVEOwogICAgICAgZWxzZQogICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0zMDY0LDcgKzMxMjksNyBAQAogICAgICAgICAgICAgWG1sQ29udmVydChlbmMsICZzLCBuZXh0LCAmZGF0YVB0ciwgKElDSEFSICopZGF0YUJ1ZkVuZCk7CiAgICAgICAgICAgICAqZXZlbnRFbmRQUCA9IG5leHQ7CiAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhSGFuZGxlcihoYW5kbGVyQXJnLCBkYXRhQnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKICAgICAgICAgICAgIGlmIChzID09IG5leHQpCiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgKmV2ZW50UFAgPSBzOwpAQCAtMzA3Myw3ICszMTM4LDcgQEAKICAgICAgICAgZWxzZQogICAgICAgICAgIGNoYXJhY3RlckRhdGFIYW5kbGVyKGhhbmRsZXJBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFhNTF9DaGFyICopcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoWE1MX0NoYXIgKiluZXh0IC0gKFhNTF9DaGFyICopcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKFhNTF9DaGFyICopbmV4dCAtIChYTUxfQ2hhciAqKXMpKTsKICAgICAgIH0KICAgICAgIGVsc2UgaWYgKGRlZmF1bHRIYW5kbGVyKQogICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jLCBzLCBuZXh0KTsKQEAgLTMxMDAsNyArMzE2NSw3IEBACiAgICAgfQogCiAgICAgKmV2ZW50UFAgPSBzID0gbmV4dDsKLSAgICBzd2l0Y2ggKHBhcnNpbmcpIHsKKyAgICBzd2l0Y2ggKHBzX3BhcnNpbmcpIHsKICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6CiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0zMTI0LDcgKzMxODksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqZW5kUHRyKQogewogICBlbnVtIFhNTF9FcnJvciByZXN1bHQgPSBkb0lnbm9yZVNlY3Rpb24ocGFyc2VyLCBlbmNvZGluZywgJnN0YXJ0LCBlbmQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kUHRyLCAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIGlmIChyZXN1bHQgIT0gWE1MX0VSUk9SX05PTkUpCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgaWYgKHN0YXJ0KSB7CkBAIC0zMTY5LDcgKzMyMzQsNyBAQAogICAgICAgcmVwb3J0RGVmYXVsdChwYXJzZXIsIGVuYywgcywgbmV4dCk7CiAgICAgKnN0YXJ0UHRyID0gbmV4dDsKICAgICAqbmV4dFB0ciA9IG5leHQ7Ci0gICAgaWYgKHBhcnNpbmcgPT0gWE1MX0ZJTklTSEVEKQorICAgIGlmIChwc19wYXJzaW5nID09IFhNTF9GSU5JU0hFRCkKICAgICAgIHJldHVybiBYTUxfRVJST1JfQUJPUlRFRDsKICAgICBlbHNlCiAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PTkU7CkBAIC0zNDA5LDcgKzM0NzQsNyBAQAogICAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgc3RhcnQsIGVuZCwgJm5leHQpOwogICAgIGV2ZW50RW5kUHRyID0gbmV4dDsKICAgICBpZiAodG9rIDw9IDApIHsKLSAgICAgIGlmICghZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlciAmJiB0b2sgIT0gWE1MX1RPS19JTlZBTElEKSB7CiAgICAgICAgICpuZXh0UHRyID0gczsKICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgICAgfQpAQCAtMzQzMiw3ICszNDk3LDcgQEAKICAgICAgIHJlc3VsdCA9IHByb2Nlc3NYbWxEZWNsKHBhcnNlciwgMCwgc3RhcnQsIG5leHQpOwogICAgICAgaWYgKHJlc3VsdCAhPSBYTUxfRVJST1JfTk9ORSkKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIHN3aXRjaCAocGFyc2luZykgeworICAgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgICBjYXNlIFhNTF9TVVNQRU5ERUQ6IAogICAgICAgICAqbmV4dFB0ciA9IG5leHQ7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKQEAgLTM0NTIsNyArMzUxNyw3IEBACiAgICAgICAgdGhlbiwgd2hlbiB0aGlzIHJvdXRpbmUgaXMgZW50ZXJlZCB0aGUgbmV4dCB0aW1lLCBYbWxQcm9sb2dUb2sgd2lsbAogICAgICAgIHJldHVybiBYTUxfVE9LX0lOVkFMSUQsIHNpbmNlIHRoZSBCT00gaXMgc3RpbGwgaW4gdGhlIGJ1ZmZlcgogICAgICovCi0gICAgZWxzZSBpZiAodG9rID09IFhNTF9UT0tfQk9NICYmIG5leHQgPT0gZW5kICYmICFmaW5hbEJ1ZmZlcikgeworICAgIGVsc2UgaWYgKHRvayA9PSBYTUxfVE9LX0JPTSAmJiBuZXh0ID09IGVuZCAmJiAhcHNfZmluYWxCdWZmZXIpIHsKICAgICAgICpuZXh0UHRyID0gbmV4dDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICB9CkBAIC0zNDcyLDcgKzM1MzcsNyBAQAogCiAgIHRvayA9IFhtbFByb2xvZ1RvayhlbmNvZGluZywgcywgZW5kLCAmbmV4dCk7CiAgIGlmICh0b2sgPD0gMCkgewotICAgIGlmICghZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgeworICAgIGlmICghcHNfZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgewogICAgICAgKm5leHRQdHIgPSBzOwogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgIH0KQEAgLTM0OTksNyArMzU2NCw3IEBACiAKICAgcHJvY2Vzc29yID0gcHJvbG9nUHJvY2Vzc29yOwogICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIAotICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFmaW5hbEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsKIH0KIAogc3RhdGljIGVudW0gWE1MX0Vycm9yIFBUUkNBTEwKQEAgLTM1MTYsNyArMzU4MSw3IEBACiAgIGZvciAoOzspIHsKICAgICB0b2sgPSBYbWxQcm9sb2dUb2soZW5jLCBzdGFydCwgZW5kLCAmbmV4dCk7CiAgICAgaWYgKHRvayA8PSAwKSB7Ci0gICAgICBpZiAoIWZpbmFsQnVmZmVyICYmIHRvayAhPSBYTUxfVE9LX0lOVkFMSUQpIHsKKyAgICAgIGlmICghcHNfZmluYWxCdWZmZXIgJiYgdG9rICE9IFhNTF9UT0tfSU5WQUxJRCkgewogICAgICAgICAqbmV4dFB0ciA9IHM7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIH0KQEAgLTM1NDksNyArMzYxNCw3IEBACiAgIGNvbnN0IGNoYXIgKm5leHQgPSBzOwogICBpbnQgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKICAgcmV0dXJuIGRvUHJvbG9nKHBhcnNlciwgZW5jb2RpbmcsIHMsIGVuZCwgdG9rLCBuZXh0LCAKLSAgICAgICAgICAgICAgICAgIG5leHRQdHIsIChYTUxfQm9vbCkhZmluYWxCdWZmZXIpOworICAgICAgICAgICAgICAgICAgbmV4dFB0ciwgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiB9CiAKIHN0YXRpYyBlbnVtIFhNTF9FcnJvcgpAQCAtMzczOCw3ICszODAzLDggQEAKICAgICAgICovCiAjaWZkZWYgWE1MX0RURAogICAgICAgaWYgKGRvY3R5cGVTeXNpZCB8fCB1c2VGb3JlaWduRFREKSB7Ci0gICAgICAgIGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gWE1MX1RSVUU7IC8qIHdoZW4gZG9jVHlwZVN5c2lkID09IE5VTEwgKi8KKyAgICAgICAgWE1MX0Jvb2wgaGFkUGFyYW1FbnRpdHlSZWZzID0gZHRkLT5oYXNQYXJhbUVudGl0eVJlZnM7CisgICAgICAgIGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gWE1MX1RSVUU7CiAgICAgICAgIGlmIChwYXJhbUVudGl0eVBhcnNpbmcgJiYgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSB7CiAgICAgICAgICAgRU5USVRZICplbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPnBhcmFtRW50aXRpZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsU3Vic2V0TmFtZSwKQEAgLTM3NTQsMTEgKzM4MjAsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnN5c3RlbUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS0+cHVibGljSWQpKQogICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9FWFRFUk5BTF9FTlRJVFlfSEFORExJTkc7Ci0gICAgICAgICAgaWYgKGR0ZC0+cGFyYW1FbnRpdHlSZWFkICYmCi0gICAgICAgICAgICAgICFkdGQtPnN0YW5kYWxvbmUgJiYKLSAgICAgICAgICAgICAgbm90U3RhbmRhbG9uZUhhbmRsZXIgJiYKLSAgICAgICAgICAgICAgIW5vdFN0YW5kYWxvbmVIYW5kbGVyKGhhbmRsZXJBcmcpKQotICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyAgICAgICAgICBpZiAoZHRkLT5wYXJhbUVudGl0eVJlYWQpIHsKKyAgICAgICAgICAgIGlmICghZHRkLT5zdGFuZGFsb25lICYmIAorICAgICAgICAgICAgICAgIG5vdFN0YW5kYWxvbmVIYW5kbGVyICYmIAorICAgICAgICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKKyAgICAgICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT1RfU1RBTkRBTE9ORTsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogaWYgd2UgZGlkbid0IHJlYWQgdGhlIGZvcmVpZ24gRFREIHRoZW4gdGhpcyBtZWFucyB0aGF0IHRoZXJlCisgICAgICAgICAgICAgaXMgbm8gZXh0ZXJuYWwgc3Vic2V0IGFuZCB3ZSBtdXN0IHJlc2V0IGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzCisgICAgICAgICAgKi8KKyAgICAgICAgICBlbHNlIGlmICghZG9jdHlwZVN5c2lkKQorICAgICAgICAgICAgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMgPSBoYWRQYXJhbUVudGl0eVJlZnM7CiAgICAgICAgICAgLyogZW5kIG9mIERURCAtIG5vIG5lZWQgdG8gdXBkYXRlIGR0ZC0+a2VlcFByb2Nlc3NpbmcgKi8KICAgICAgICAgfQogICAgICAgICB1c2VGb3JlaWduRFREID0gWE1MX0ZBTFNFOwpAQCAtMzc3NSw2ICszODQ3LDcgQEAKICAgICAgICAgIGxhc3QgY2hhbmNlIHRvIHJlYWQgdGhlIGZvcmVpZ24gRFRECiAgICAgICAqLwogICAgICAgaWYgKHVzZUZvcmVpZ25EVEQpIHsKKyAgICAgICAgWE1MX0Jvb2wgaGFkUGFyYW1FbnRpdHlSZWZzID0gZHRkLT5oYXNQYXJhbUVudGl0eVJlZnM7CiAgICAgICAgIGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gWE1MX1RSVUU7CiAgICAgICAgIGlmIChwYXJhbUVudGl0eVBhcnNpbmcgJiYgZXh0ZXJuYWxFbnRpdHlSZWZIYW5kbGVyKSB7CiAgICAgICAgICAgRU5USVRZICplbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPnBhcmFtRW50aXRpZXMsCkBAIC0zNzkwLDExICszODYzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LT5zeXN0ZW1JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHktPnB1YmxpY0lkKSkKICAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfRVhURVJOQUxfRU5USVRZX0hBTkRMSU5HOwotICAgICAgICAgIGlmIChkdGQtPnBhcmFtRW50aXR5UmVhZCAmJgotICAgICAgICAgICAgICAhZHRkLT5zdGFuZGFsb25lICYmCi0gICAgICAgICAgICAgIG5vdFN0YW5kYWxvbmVIYW5kbGVyICYmCi0gICAgICAgICAgICAgICFub3RTdGFuZGFsb25lSGFuZGxlcihoYW5kbGVyQXJnKSkKLSAgICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9UX1NUQU5EQUxPTkU7CisgICAgICAgICAgaWYgKGR0ZC0+cGFyYW1FbnRpdHlSZWFkKSB7CisgICAgICAgICAgICBpZiAoIWR0ZC0+c3RhbmRhbG9uZSAmJgorICAgICAgICAgICAgICAgIG5vdFN0YW5kYWxvbmVIYW5kbGVyICYmCisgICAgICAgICAgICAgICAgIW5vdFN0YW5kYWxvbmVIYW5kbGVyKGhhbmRsZXJBcmcpKQorICAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX05PVF9TVEFOREFMT05FOworICAgICAgICAgIH0KKyAgICAgICAgICAvKiBpZiB3ZSBkaWRuJ3QgcmVhZCB0aGUgZm9yZWlnbiBEVEQgdGhlbiB0aGlzIG1lYW5zIHRoYXQgdGhlcmUKKyAgICAgICAgICAgICBpcyBubyBleHRlcm5hbCBzdWJzZXQgYW5kIHdlIG11c3QgcmVzZXQgZHRkLT5oYXNQYXJhbUVudGl0eVJlZnMKKyAgICAgICAgICAqLworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGR0ZC0+aGFzUGFyYW1FbnRpdHlSZWZzID0gaGFkUGFyYW1FbnRpdHlSZWZzOwogICAgICAgICAgIC8qIGVuZCBvZiBEVEQgLSBubyBuZWVkIHRvIHVwZGF0ZSBkdGQtPmtlZXBQcm9jZXNzaW5nICovCiAgICAgICAgIH0KICAgICAgIH0KQEAgLTM5MzUsNyArNDAxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgLSBlbmMtPm1pbkJ5dGVzUGVyQ2hhcik7CiAgICAgICAgIGlmIChkZWNsRW50aXR5KSB7CiAgICAgICAgICAgZGVjbEVudGl0eS0+dGV4dFB0ciA9IHBvb2xTdGFydCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOwotICAgICAgICAgIGRlY2xFbnRpdHktPnRleHRMZW4gPSBwb29sTGVuZ3RoKCZkdGQtPmVudGl0eVZhbHVlUG9vbCk7CisgICAgICAgICAgZGVjbEVudGl0eS0+dGV4dExlbiA9IChpbnQpKHBvb2xMZW5ndGgoJmR0ZC0+ZW50aXR5VmFsdWVQb29sKSk7CiAgICAgICAgICAgcG9vbEZpbmlzaCgmZHRkLT5lbnRpdHlWYWx1ZVBvb2wpOwogICAgICAgICAgIGlmIChlbnRpdHlEZWNsSGFuZGxlcikgewogICAgICAgICAgICAgKmV2ZW50RW5kUFAgPSBzOwpAQCAtNDQ5Niw3ICs0NTc1LDcgQEAKICAgICBpZiAoaGFuZGxlRGVmYXVsdCAmJiBkZWZhdWx0SGFuZGxlcikKICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHMsIG5leHQpOwogCi0gICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgY2FzZSBYTUxfU1VTUEVOREVEOiAKICAgICAgICpuZXh0UHRyID0gbmV4dDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKQEAgLTQ1MjcsNyArNDYwNiw3IEBACiAgICAgY2FzZSAtWE1MX1RPS19QUk9MT0dfUzoKICAgICAgIGlmIChkZWZhdWx0SGFuZGxlcikgewogICAgICAgICByZXBvcnREZWZhdWx0KHBhcnNlciwgZW5jb2RpbmcsIHMsIG5leHQpOwotICAgICAgICBpZiAocGFyc2luZyA9PSBYTUxfRklOSVNIRUQpCisgICAgICAgIGlmIChwc19wYXJzaW5nID09IFhNTF9GSU5JU0hFRCkKICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0FCT1JURUQ7CiAgICAgICB9CiAgICAgICAqbmV4dFB0ciA9IG5leHQ7CkBAIC00NTUxLDEzICs0NjMwLDEzIEBACiAgICAgICBldmVudFB0ciA9IG5leHQ7CiAgICAgICByZXR1cm4gWE1MX0VSUk9SX0lOVkFMSURfVE9LRU47CiAgICAgY2FzZSBYTUxfVE9LX1BBUlRJQUw6Ci0gICAgICBpZiAoIWZpbmFsQnVmZmVyKSB7CisgICAgICBpZiAoIXBzX2ZpbmFsQnVmZmVyKSB7CiAgICAgICAgICpuZXh0UHRyID0gczsKICAgICAgICAgcmV0dXJuIFhNTF9FUlJPUl9OT05FOwogICAgICAgfQogICAgICAgcmV0dXJuIFhNTF9FUlJPUl9VTkNMT1NFRF9UT0tFTjsKICAgICBjYXNlIFhNTF9UT0tfUEFSVElBTF9DSEFSOgotICAgICAgaWYgKCFmaW5hbEJ1ZmZlcikgeworICAgICAgaWYgKCFwc19maW5hbEJ1ZmZlcikgewogICAgICAgICAqbmV4dFB0ciA9IHM7CiAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKICAgICAgIH0KQEAgLTQ1NjYsNyArNDY0NSw3IEBACiAgICAgICByZXR1cm4gWE1MX0VSUk9SX0pVTktfQUZURVJfRE9DX0VMRU1FTlQ7CiAgICAgfQogICAgIGV2ZW50UHRyID0gcyA9IG5leHQ7Ci0gICAgc3dpdGNoIChwYXJzaW5nKSB7CisgICAgc3dpdGNoIChwc19wYXJzaW5nKSB7CiAgICAgY2FzZSBYTUxfU1VTUEVOREVEOiAKICAgICAgICpuZXh0UHRyID0gbmV4dDsKICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9ORTsKQEAgLTQ2MTksOCArNDY5OCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRFbmQsICZuZXh0LCBYTUxfRkFMU0UpOwogCiAgIGlmIChyZXN1bHQgPT0gWE1MX0VSUk9SX05PTkUpIHsKLSAgICBpZiAodGV4dEVuZCAhPSBuZXh0ICYmIHBhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkgewotICAgICAgZW50aXR5LT5wcm9jZXNzZWQgPSBuZXh0IC0gdGV4dFN0YXJ0OworICAgIGlmICh0ZXh0RW5kICE9IG5leHQgJiYgcHNfcGFyc2luZyA9PSBYTUxfU1VTUEVOREVEKSB7CisgICAgICBlbnRpdHktPnByb2Nlc3NlZCA9IChpbnQpKG5leHQgLSB0ZXh0U3RhcnQpOwogICAgICAgcHJvY2Vzc29yID0gaW50ZXJuYWxFbnRpdHlQcm9jZXNzb3I7CiAgICAgfQogICAgIGVsc2UgewpAQCAtNDY2NSw4ICs0NzQ0LDggQEAKIAogICBpZiAocmVzdWx0ICE9IFhNTF9FUlJPUl9OT05FKQogICAgIHJldHVybiByZXN1bHQ7Ci0gIGVsc2UgaWYgKHRleHRFbmQgIT0gbmV4dCAmJiBwYXJzaW5nID09IFhNTF9TVVNQRU5ERUQpIHsKLSAgICBlbnRpdHktPnByb2Nlc3NlZCA9IG5leHQgLSAoY2hhciAqKWVudGl0eS0+dGV4dFB0cjsKKyAgZWxzZSBpZiAodGV4dEVuZCAhPSBuZXh0ICYmIHBzX3BhcnNpbmcgPT0gWE1MX1NVU1BFTkRFRCkgeworICAgIGVudGl0eS0+cHJvY2Vzc2VkID0gKGludCkobmV4dCAtIChjaGFyICopZW50aXR5LT50ZXh0UHRyKTsKICAgICByZXR1cm4gcmVzdWx0OwogICB9CiAgIGVsc2UgewpAQCAtNDY4Myw3ICs0NzYyLDcgQEAKICAgICBwcm9jZXNzb3IgPSBwcm9sb2dQcm9jZXNzb3I7CiAgICAgdG9rID0gWG1sUHJvbG9nVG9rKGVuY29kaW5nLCBzLCBlbmQsICZuZXh0KTsKICAgICByZXR1cm4gZG9Qcm9sb2cocGFyc2VyLCBlbmNvZGluZywgcywgZW5kLCB0b2ssIG5leHQsIG5leHRQdHIsIAotICAgICAgICAgICAgICAgICAgICAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgKFhNTF9Cb29sKSFwc19maW5hbEJ1ZmZlcik7CiAgIH0KICAgZWxzZQogI2VuZGlmIC8qIFhNTF9EVEQgKi8KQEAgLTQ2OTEsNyArNDc3MCw3IEBACiAgICAgcHJvY2Vzc29yID0gY29udGVudFByb2Nlc3NvcjsKICAgICAvKiBzZWUgZXh0ZXJuYWxFbnRpdHlDb250ZW50UHJvY2Vzc29yIHZzIGNvbnRlbnRQcm9jZXNzb3IgKi8KICAgICByZXR1cm4gZG9Db250ZW50KHBhcnNlciwgcGFyZW50UGFyc2VyID8gMSA6IDAsIGVuY29kaW5nLCBzLCBlbmQsCi0gICAgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIWZpbmFsQnVmZmVyKTsgCisgICAgICAgICAgICAgICAgICAgICBuZXh0UHRyLCAoWE1MX0Jvb2wpIXBzX2ZpbmFsQnVmZmVyKTsgCiAgIH0gIAogfQogCkBAIC00ODAwLDkgKzQ4NzksOCBAQAogICAgICAgICAgIHJldHVybiBYTUxfRVJST1JfTk9fTUVNT1JZOwogICAgICAgICBlbnRpdHkgPSAoRU5USVRZICopbG9va3VwKCZkdGQtPmdlbmVyYWxFbnRpdGllcywgbmFtZSwgMCk7CiAgICAgICAgIHBvb2xEaXNjYXJkKCZ0ZW1wMlBvb2wpOwotICAgICAgICAvKiBmaXJzdCwgZGV0ZXJtaW5lIGlmIGEgY2hlY2sgZm9yIGFuIGV4aXN0aW5nIGRlY2xhcmF0aW9uIGlzIG5lZWRlZDsKLSAgICAgICAgICAgaWYgeWVzLCBjaGVjayB0aGF0IHRoZSBlbnRpdHkgZXhpc3RzLCBhbmQgdGhhdCBpdCBpcyBpbnRlcm5hbCwKLSAgICAgICAgICAgb3RoZXJ3aXNlIGNhbGwgdGhlIGRlZmF1bHQgaGFuZGxlciAoaWYgY2FsbGVkIGZyb20gY29udGVudCkKKyAgICAgICAgLyogRmlyc3QsIGRldGVybWluZSBpZiBhIGNoZWNrIGZvciBhbiBleGlzdGluZyBkZWNsYXJhdGlvbiBpcyBuZWVkZWQ7CisgICAgICAgICAgIGlmIHllcywgY2hlY2sgdGhhdCB0aGUgZW50aXR5IGV4aXN0cywgYW5kIHRoYXQgaXQgaXMgaW50ZXJuYWwuCiAgICAgICAgICovCiAgICAgICAgIGlmIChwb29sID09ICZkdGQtPnBvb2wpICAvKiBhcmUgd2UgY2FsbGVkIGZyb20gcHJvbG9nPyAqLwogICAgICAgICAgIGNoZWNrRW50aXR5RGVjbCA9CkBAIC00ODIxLDEzICs0ODk5LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gWE1MX0VSUk9SX0VOVElUWV9ERUNMQVJFRF9JTl9QRTsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghZW50aXR5KSB7Ci0gICAgICAgICAgLyogY2Fubm90IHJlcG9ydCBza2lwcGVkIGVudGl0eSBoZXJlIC0gc2VlIGNvbW1lbnRzIG9uCi0gICAgICAgICAgICAgc2tpcHBlZEVudGl0eUhhbmRsZXIKKyAgICAgICAgICAvKiBDYW5ub3QgcmVwb3J0IHNraXBwZWQgZW50aXR5IGhlcmUgLSBzZWUgY29tbWVudHMgb24KKyAgICAgICAgICAgICBza2lwcGVkRW50aXR5SGFuZGxlci4KICAgICAgICAgICBpZiAoc2tpcHBlZEVudGl0eUhhbmRsZXIpCiAgICAgICAgICAgICBza2lwcGVkRW50aXR5SGFuZGxlcihoYW5kbGVyQXJnLCBuYW1lLCAwKTsKICAgICAgICAgICAqLworICAgICAgICAgIC8qIENhbm5vdCBjYWxsIHRoZSBkZWZhdWx0IGhhbmRsZXIgYmVjYXVzZSB0aGlzIHdvdWxkIGJlCisgICAgICAgICAgICAgb3V0IG9mIHN5bmMgd2l0aCB0aGUgY2FsbCB0byB0aGUgc3RhcnRFbGVtZW50SGFuZGxlci4KICAgICAgICAgICBpZiAoKHBvb2wgPT0gJnRlbXBQb29sKSAmJiBkZWZhdWx0SGFuZGxlcikKICAgICAgICAgICAgIHJlcG9ydERlZmF1bHQocGFyc2VyLCBlbmMsIHB0ciwgbmV4dCk7CisgICAgICAgICAgKi8KICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBpZiAoZW50aXR5LT5vcGVuKSB7CkBAIC01MTI3LDEyICs1MjA4LDEyIEBACiAgICAgICBJQ0hBUiAqZGF0YVB0ciA9IChJQ0hBUiAqKWRhdGFCdWY7CiAgICAgICBYbWxDb252ZXJ0KGVuYywgJnMsIGVuZCwgJmRhdGFQdHIsIChJQ0hBUiAqKWRhdGFCdWZFbmQpOwogICAgICAgKmV2ZW50RW5kUFAgPSBzOwotICAgICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpOworICAgICAgZGVmYXVsdEhhbmRsZXIoaGFuZGxlckFyZywgZGF0YUJ1ZiwgKGludCkoZGF0YVB0ciAtIChJQ0hBUiAqKWRhdGFCdWYpKTsKICAgICAgICpldmVudFBQID0gczsKICAgICB9IHdoaWxlIChzICE9IGVuZCk7CiAgIH0KICAgZWxzZQotICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIChYTUxfQ2hhciAqKXMsIChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpOworICAgIGRlZmF1bHRIYW5kbGVyKGhhbmRsZXJBcmcsIChYTUxfQ2hhciAqKXMsIChpbnQpKChYTUxfQ2hhciAqKWVuZCAtIChYTUxfQ2hhciAqKXMpKTsKIH0KIAogCkBAIC01Mjg2LDcgKzUzNjcsNyBAQAogICAgIGlmICghcG9vbEFwcGVuZENoYXIoJnRlbXBQb29sLCBYTUxfVCgnPScpKSkKICAgICAgIHJldHVybiBOVUxMOwogICAgIGxlbiA9IGR0ZC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlMZW47Ci0gICAgaWYgKG5hbWVzcGFjZVNlcGFyYXRvciAhPSBYTUxfVCgnXDAnKSkKKyAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yKQogICAgICAgbGVuLS07CiAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQogICAgICAgaWYgKCFwb29sQXBwZW5kQ2hhcigmdGVtcFBvb2wsIGR0ZC0+ZGVmYXVsdFByZWZpeC5iaW5kaW5nLT51cmlbaV0pKQpAQCAtNTMxMiw3ICs1MzkzLDcgQEAKICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgWE1MX1QoJz0nKSkpCiAgICAgICByZXR1cm4gTlVMTDsKICAgICBsZW4gPSBwcmVmaXgtPmJpbmRpbmctPnVyaUxlbjsKLSAgICBpZiAobmFtZXNwYWNlU2VwYXJhdG9yICE9IFhNTF9UKCdcMCcpKQorICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpCiAgICAgICBsZW4tLTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICAgICBpZiAoIXBvb2xBcHBlbmRDaGFyKCZ0ZW1wUG9vbCwgcHJlZml4LT5iaW5kaW5nLT51cmlbaV0pKQpAQCAtNjAxNCw3ICs2MDk1LDcgQEAKICAgICB9CiAgIH0KICAgaWYgKHBvb2wtPmJsb2NrcyAmJiBwb29sLT5zdGFydCA9PSBwb29sLT5ibG9ja3MtPnMpIHsKLSAgICBpbnQgYmxvY2tTaXplID0gKHBvb2wtPmVuZCAtIHBvb2wtPnN0YXJ0KSoyOworICAgIGludCBibG9ja1NpemUgPSAoaW50KShwb29sLT5lbmQgLSBwb29sLT5zdGFydCkqMjsKICAgICBwb29sLT5ibG9ja3MgPSAoQkxPQ0sgKikKICAgICAgIHBvb2wtPm1lbS0+cmVhbGxvY19mY24ocG9vbC0+YmxvY2tzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2Zmc2V0b2YoQkxPQ0ssIHMpCkBAIC02MDI4LDcgKzYxMDksNyBAQAogICB9CiAgIGVsc2UgewogICAgIEJMT0NLICp0ZW07Ci0gICAgaW50IGJsb2NrU2l6ZSA9IHBvb2wtPmVuZCAtIHBvb2wtPnN0YXJ0OworICAgIGludCBibG9ja1NpemUgPSAoaW50KShwb29sLT5lbmQgLSBwb29sLT5zdGFydCk7CiAgICAgaWYgKGJsb2NrU2l6ZSA8IElOSVRfQkxPQ0tfU0laRSkKICAgICAgIGJsb2NrU2l6ZSA9IElOSVRfQkxPQ0tfU0laRTsKICAgICBlbHNlCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHJvbGUuYyBiL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCmluZGV4IDI1ODdmZGYuLjE1ZDRkOGYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1scm9sZS5jCkBAIC02LDYgKzYsOCBAQAogI2luY2x1ZGUgIndpbmNvbmZpZy5oIgogI2VsaWYgZGVmaW5lZChNQUNPU19DTEFTU0lDKQogI2luY2x1ZGUgIm1hY2NvbmZpZy5oIgorI2VsaWYgZGVmaW5lZChfX2FtaWdhb3M0X18pCisjaW5jbHVkZSAiYW1pZ2Fjb25maWcuaCIKICNlbHNlCiAjaWZkZWYgSEFWRV9FWFBBVF9DT05GSUdfSAogI2luY2x1ZGUgPGV4cGF0X2NvbmZpZy5oPgpAQCAtNzkzLDcgKzc5NSw3IEBACiAgICAgcmV0dXJuIFhNTF9ST0xFX0FUVExJU1RfTk9ORTsKICAgY2FzZSBYTUxfVE9LX05BTUU6CiAgICAgewotICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKnR5cGVzW10gPSB7CisgICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHR5cGVzW10gPSB7CiAgICAgICAgIEtXX0NEQVRBLAogICAgICAgICBLV19JRCwKICAgICAgICAgS1dfSURSRUYsCmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHRvay5jIGIvTW9kdWxlcy9leHBhdC94bWx0b2suYwppbmRleCA4YjlkOTk3Li5kYjkyMjQ3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHRvay5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1sdG9rLmMKQEAgLTYsNiArNiw4IEBACiAjaW5jbHVkZSAid2luY29uZmlnLmgiCiAjZWxpZiBkZWZpbmVkKE1BQ09TX0NMQVNTSUMpCiAjaW5jbHVkZSAibWFjY29uZmlnLmgiCisjZWxpZiBkZWZpbmVkKF9fYW1pZ2FvczRfXykKKyNpbmNsdWRlICJhbWlnYWNvbmZpZy5oIgogI2Vsc2UKICNpZmRlZiBIQVZFX0VYUEFUX0NPTkZJR19ICiAjaW5jbHVkZSA8ZXhwYXRfY29uZmlnLmg+CkBAIC0xNDUxLDcgKzE0NTMsNyBAQAogc3RhdGljIGludCBGQVNUQ0FMTAogZ2V0RW5jb2RpbmdJbmRleChjb25zdCBjaGFyICpuYW1lKQogewotICBzdGF0aWMgY29uc3QgY2hhciAqZW5jb2RpbmdOYW1lc1tdID0geworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGVuY29kaW5nTmFtZXNbXSA9IHsKICAgICBLV19JU09fODg1OV8xLAogICAgIEtXX1VTX0FTQ0lJLAogICAgIEtXX1VURl84LApAQCAtMTQ4NCw3ICsxNDg2LDcgQEAKIAogCiBzdGF0aWMgaW50Ci1pbml0U2Nhbihjb25zdCBFTkNPRElORyAqKmVuY29kaW5nVGFibGUsCitpbml0U2Nhbihjb25zdCBFTkNPRElORyAqIGNvbnN0ICplbmNvZGluZ1RhYmxlLAogICAgICAgICAgY29uc3QgSU5JVF9FTkNPRElORyAqZW5jLAogICAgICAgICAgaW50IHN0YXRlLAogICAgICAgICAgY29uc3QgY2hhciAqcHRyLApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWx0b2suaCBiL01vZHVsZXMvZXhwYXQveG1sdG9rLmgKaW5kZXggMWVjZDA1Zi4uY2E4NjdhYSAxMDA2NDQKLS0tIGEvTW9kdWxlcy9leHBhdC94bWx0b2suaAorKysgYi9Nb2R1bGVzL2V4cGF0L3htbHRvay5oCkBAIC0xMTEsOCArMTExLDggQEAKIAogdHlwZWRlZiBzdHJ1Y3QgcG9zaXRpb24gewogICAvKiBmaXJzdCBsaW5lIGFuZCBmaXJzdCBjb2x1bW4gYXJlIDAgbm90IDEgKi8KLSAgdW5zaWduZWQgbG9uZyBsaW5lTnVtYmVyOwotICB1bnNpZ25lZCBsb25nIGNvbHVtbk51bWJlcjsKKyAgWE1MX1NpemUgbGluZU51bWJlcjsKKyAgWE1MX1NpemUgY29sdW1uTnVtYmVyOwogfSBQT1NJVElPTjsKIAogdHlwZWRlZiBzdHJ1Y3QgewpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9leHBhdC94bWx0b2tfaW1wbC5jIGIvTW9kdWxlcy9leHBhdC94bWx0b2tfaW1wbC5jCmluZGV4IDQ2NTY5ZmUuLjBlZTU3YWIgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZXhwYXQveG1sdG9rX2ltcGwuYworKysgYi9Nb2R1bGVzL2V4cGF0L3htbHRva19pbXBsLmMKQEAgLTE3MTQsNyArMTcxNCw3IEBACiAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CiAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHB0ciAtIHN0YXJ0OworICAgICAgcmV0dXJuIChpbnQpKHB0ciAtIHN0YXJ0KTsKICAgICB9CiAgIH0KIH0KQEAgLTE3NTAsNyArMTc1MCw3IEBACiAgICAgTEVBRF9DQVNFKDIpIExFQURfQ0FTRSgzKSBMRUFEX0NBU0UoNCkKICN1bmRlZiBMRUFEX0NBU0UKICAgICBjYXNlIEJUX0xGOgotICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAodW5zaWduZWQpLTE7CisgICAgICBwb3MtPmNvbHVtbk51bWJlciA9IChYTUxfU2l6ZSktMTsKICAgICAgIHBvcy0+bGluZU51bWJlcisrOwogICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwogICAgICAgYnJlYWs7CkBAIC0xNzU5LDcgKzE3NTksNyBAQAogICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwogICAgICAgaWYgKHB0ciAhPSBlbmQgJiYgQllURV9UWVBFKGVuYywgcHRyKSA9PSBCVF9MRikKICAgICAgICAgcHRyICs9IE1JTkJQQyhlbmMpOwotICAgICAgcG9zLT5jb2x1bW5OdW1iZXIgPSAodW5zaWduZWQpLTE7CisgICAgICBwb3MtPmNvbHVtbk51bWJlciA9IChYTUxfU2l6ZSktMTsKICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBwdHIgKz0gTUlOQlBDKGVuYyk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL2V4cGF0L3htbHRva19ucy5jIGIvTW9kdWxlcy9leHBhdC94bWx0b2tfbnMuYwppbmRleCA1NjEwZWI5Li5kMmY4OTM4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2V4cGF0L3htbHRva19ucy5jCisrKyBiL01vZHVsZXMvZXhwYXQveG1sdG9rX25zLmMKQEAgLTE5LDcgKzE5LDcgQEAKICNlbmRpZgogfQogCi1zdGF0aWMgY29uc3QgRU5DT0RJTkcgKk5TKGVuY29kaW5ncylbXSA9IHsKK3N0YXRpYyBjb25zdCBFTkNPRElORyAqIGNvbnN0IE5TKGVuY29kaW5ncylbXSA9IHsKICAgJm5zKGxhdGluMV9lbmNvZGluZykuZW5jLAogICAmbnMoYXNjaWlfZW5jb2RpbmcpLmVuYywKICAgJm5zKHV0ZjhfZW5jb2RpbmcpLmVuYywKZGlmZiAtLWdpdCBhL01vZHVsZXMvZmNudGxtb2R1bGUuYyBiL01vZHVsZXMvZmNudGxtb2R1bGUuYwppbmRleCA0NzdhZjA2Li40ZTQ5YTdkIDEwMDY0NAotLS0gYS9Nb2R1bGVzL2ZjbnRsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mY250bG1vZHVsZS5jCkBAIC0yOTAsNyArMjkwLDcgQEAKICJmbG9jayhmZCwgb3BlcmF0aW9uKVxuXAogXG5cCiBQZXJmb3JtIHRoZSBsb2NrIG9wZXJhdGlvbiBvcCBvbiBmaWxlIGRlc2NyaXB0b3IgZmQuICBTZWUgdGhlIFVuaXggXG5cCi1tYW51YWwgZmxvY2soMykgZm9yIGRldGFpbHMuICAoT24gc29tZSBzeXN0ZW1zLCB0aGlzIGZ1bmN0aW9uIGlzXG5cCittYW51YWwgcGFnZSBmb3IgZmxvY2soMykgZm9yIGRldGFpbHMuICAoT24gc29tZSBzeXN0ZW1zLCB0aGlzIGZ1bmN0aW9uIGlzXG5cCiBlbXVsYXRlZCB1c2luZyBmY250bCgpLikiKTsKIAogCkBAIC0zMjcsNyArMzI3LDcgQEAKIAkJCWwubF90eXBlID0gRl9XUkxDSzsKIAkJZWxzZSB7CiAJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKLQkJCQkJInVucmVjb2duaXplZCBmbG9jayBhcmd1bWVudCIpOworCQkJCQkidW5yZWNvZ25pemVkIGxvY2tmIGFyZ3VtZW50Iik7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQogCQlsLmxfc3RhcnQgPSBsLmxfbGVuID0gMDsKZGlmZiAtLWdpdCBhL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMgYi9Nb2R1bGVzL2ZwZWN0bG1vZHVsZS5jCmluZGV4IGM2ZDRmNzcuLjc0MzU0YmEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvZnBlY3RsbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9mcGVjdGxtb2R1bGUuYwpAQCAtNzAsNiArNzAsMTAgQEAKIAogI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCiAjICBpbmNsdWRlIDxpZWVlZnAuaD4KKyNlbGlmIGRlZmluZWQoX19WTVMpCisjZGVmaW5lIF9fTkVXX1NUQVJMRVQKKyNpbmNsdWRlIDxzdGFybGV0Lmg+CisjaW5jbHVkZSA8aWVlZWRlZi5oPgogI2VuZGlmCiAKICNpZm5kZWYgV0FOVF9TSUdGUEVfSEFORExFUgpAQCAtMTkwLDYgKzE5NCwxOSBAQAogCiAvKi0tIERFQyBBTFBIQSBWTVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogI2VsaWYgZGVmaW5lZChfX0FMUEhBKSAmJiBkZWZpbmVkKF9fVk1TKQorCUlFRUUgY2xybXNrOworCUlFRUUgc2V0bXNrOworCWNscm1zay5pZWVlJHFfZmxhZ3MgPQorCQlJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAorCQkgSUVFRSRNX01BUF9VTVo7CisJc2V0bXNrLmllZWUkcV9mbGFncyA9CisJCUlFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfCBJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwKKwkJSUVFRSRNX1RSQVBfRU5BQkxFX09WRjsKKwlzeXMkaWVlZV9zZXRfZnBfY29udHJvbCgmY2xybXNrLCAmc2V0bXNrLCAwKTsKKwlQeU9TX3NldHNpZyhTSUdGUEUsIGhhbmRsZXIpOworCisvKi0tIEhQIElBNjQgVk1TIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNlbGlmIGRlZmluZWQoX19pYTY0KSAmJiBkZWZpbmVkKF9fVk1TKQogICAgIFB5T1Nfc2V0c2lnKFNJR0ZQRSwgaGFuZGxlcik7CiAKIC8qLS0gQ3JheSBVbmljb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCkBAIC0yNDQsNiArMjYxLDE0IEBACiAjaWZkZWYgX19GcmVlQlNEX18KICAgICBmcHJlc2V0c3RpY2t5KGZwZ2V0c3RpY2t5KCkpOwogICAgIGZwc2V0bWFzaygwKTsKKyNlbGlmIGRlZmluZWQoX19WTVMpCisJSUVFRSBjbHJtc2s7CisJIGNscm1zay5pZWVlJHFfZmxhZ3MgPQorCQlJRUVFJE1fVFJBUF9FTkFCTEVfVU5GIHwgIElFRUUkTV9UUkFQX0VOQUJMRV9JTkUgfAorCQlJRUVFJE1fTUFQX1VNWiB8IElFRUUkTV9UUkFQX0VOQUJMRV9JTlYgfAorCQlJRUVFJE1fVFJBUF9FTkFCTEVfRFpFIHwgSUVFRSRNX1RSQVBfRU5BQkxFX09WRiB8CisJCUlFRUUkTV9JTkhFUklUOworCXN5cyRpZWVlX3NldF9mcF9jb250cm9sKCZjbHJtc2ssIDAsIDApOwogI2Vsc2UKICAgICBmcHV0cygiT3BlcmF0aW9uIG5vdCBpbXBsZW1lbnRlZFxuIiwgc3RkZXJyKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9nZXRwYXRoLmMgYi9Nb2R1bGVzL2dldHBhdGguYwppbmRleCA4ZWJhNzMwLi43OGJmYWY5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL2dldHBhdGguYworKysgYi9Nb2R1bGVzL2dldHBhdGguYwpAQCAtOTcsMTkgKzk3LDE5IEBACiAKIAogI2lmbmRlZiBWRVJTSU9OCi0jaWYgZGVmaW5lZChfX1ZNUykKLSNkZWZpbmUgVkVSU0lPTiAiMl8xIgotI2Vsc2UKICNkZWZpbmUgVkVSU0lPTiAiMi4xIgogI2VuZGlmCi0jZW5kaWYKIAogI2lmbmRlZiBWUEFUSAogI2RlZmluZSBWUEFUSCAiLiIKICNlbmRpZgogCiAjaWZuZGVmIFBSRUZJWAotI2RlZmluZSBQUkVGSVggIi91c3IvbG9jYWwiCisjICBpZmRlZiBfX1ZNUworIyAgICBkZWZpbmUgUFJFRklYICIiCisjICBlbHNlCisjICAgIGRlZmluZSBQUkVGSVggIi91c3IvbG9jYWwiCisjICBlbmRpZgogI2VuZGlmCiAKICNpZm5kZWYgRVhFQ19QUkVGSVgKZGlmZiAtLWdpdCBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMgYi9Nb2R1bGVzL2l0ZXJ0b29sc21vZHVsZS5jCmluZGV4IDg2YjFiYmYuLmQ5MTM4OTAgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvaXRlcnRvb2xzbW9kdWxlLmMKKysrIGIvTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYwpAQCAtMzU3LDcgKzM1Nyw3IEBACiB7CiAJaWYgKHRkby0+bmV4dGxpbmsgPT0gTlVMTCkKIAkJdGRvLT5uZXh0bGluayA9IHRlZWRhdGFvYmplY3RfbmV3KHRkby0+aXQpOwotCVB5X0lOQ1JFRih0ZG8tPm5leHRsaW5rKTsKKwlQeV9YSU5DUkVGKHRkby0+bmV4dGxpbmspOwogCXJldHVybiB0ZG8tPm5leHRsaW5rOwogfQogCkBAIC00NjgsNyArNDY4LDcgQEAKIAogCWlmICh0by0+aW5kZXggPj0gTElOS0NFTExTKSB7CiAJCWxpbmsgPSB0ZWVkYXRhb2JqZWN0X2p1bXBsaW5rKHRvLT5kYXRhb2JqKTsKLQkJUHlfWERFQ1JFRih0by0+ZGF0YW9iaik7CisJCVB5X0RFQ1JFRih0by0+ZGF0YW9iaik7CiAJCXRvLT5kYXRhb2JqID0gKHRlZWRhdGFvYmplY3QgKilsaW5rOwogCQl0by0+aW5kZXggPSAwOwogCX0KQEAgLTUyMiw2ICs1MjIsMTIgQEAKIAlpZiAodG8gPT0gTlVMTCkgCiAJCWdvdG8gZG9uZTsKIAl0by0+ZGF0YW9iaiA9ICh0ZWVkYXRhb2JqZWN0ICopdGVlZGF0YW9iamVjdF9uZXcoaXQpOworCWlmICghdG8tPmRhdGFvYmopIHsKKwkJUHlPYmplY3RfR0NfRGVsKHRvKTsKKwkJdG8gPSBOVUxMOworCQlnb3RvIGRvbmU7CisJfQorCiAJdG8tPmluZGV4ID0gMDsKIAl0by0+d2Vha3JlZmxpc3QgPSBOVUxMOwogCVB5T2JqZWN0X0dDX1RyYWNrKHRvKTsKZGlmZiAtLWdpdCBhL01vZHVsZXMvbWFpbi5jIGIvTW9kdWxlcy9tYWluLmMKaW5kZXggMjNhNzYwZi4uM2YzOWM5YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy9tYWluLmMKKysrIGIvTW9kdWxlcy9tYWluLmMKQEAgLTM5LDcgKzM5LDcgQEAKIHN0YXRpYyBpbnQgIG9yaWdfYXJnYzsKIAogLyogY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KLSNkZWZpbmUgQkFTRV9PUFRTICJjOmRFaGltOk9TdHV2Vlc6eFgiCisjZGVmaW5lIEJBU0VfT1BUUyAiYzpkRWhpbTpPU3R1dlZXOnhYPyIKIAogI2lmbmRlZiBSSVNDT1MKICNkZWZpbmUgUFJPR1JBTV9PUFRTIEJBU0VfT1BUUwpAQCAtNjEsNyArNjEsNyBAQAogLWMgY21kIDogcHJvZ3JhbSBwYXNzZWQgaW4gYXMgc3RyaW5nICh0ZXJtaW5hdGVzIG9wdGlvbiBsaXN0KVxuXAogLWQgICAgIDogZGVidWcgb3V0cHV0IGZyb20gcGFyc2VyIChhbHNvIFBZVEhPTkRFQlVHPXgpXG5cCiAtRSAgICAgOiBpZ25vcmUgZW52aXJvbm1lbnQgdmFyaWFibGVzIChzdWNoIGFzIFBZVEhPTlBBVEgpXG5cCi0taCAgICAgOiBwcmludCB0aGlzIGhlbHAgbWVzc2FnZSBhbmQgZXhpdFxuXAorLWggICAgIDogcHJpbnQgdGhpcyBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQgKGFsc28gLS1oZWxwKVxuXAogLWkgICAgIDogaW5zcGVjdCBpbnRlcmFjdGl2ZWx5IGFmdGVyIHJ1bm5pbmcgc2NyaXB0LCAoYWxzbyBQWVRIT05JTlNQRUNUPXgpXG5cCiAgICAgICAgICBhbmQgZm9yY2UgcHJvbXB0cywgZXZlbiBpZiBzdGRpbiBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB0ZXJtaW5hbFxuXAogIjsKQEAgLTc2LDcgKzc2LDcgQEAKIHN0YXRpYyBjaGFyICp1c2FnZV8zID0gIlwKICAgICAgICAgIHNlZSBtYW4gcGFnZSBmb3IgZGV0YWlscyBvbiBpbnRlcm5hbCBidWZmZXJpbmcgcmVsYXRpbmcgdG8gJy11J1xuXAogLXYgICAgIDogdmVyYm9zZSAodHJhY2UgaW1wb3J0IHN0YXRlbWVudHMpIChhbHNvIFBZVEhPTlZFUkJPU0U9eClcblwKLS1WICAgICA6IHByaW50IHRoZSBQeXRob24gdmVyc2lvbiBudW1iZXIgYW5kIGV4aXRcblwKKy1WICAgICA6IHByaW50IHRoZSBQeXRob24gdmVyc2lvbiBudW1iZXIgYW5kIGV4aXQgKGFsc28gLS12ZXJzaW9uKVxuXAogLVcgYXJnIDogd2FybmluZyBjb250cm9sIChhcmcgaXMgYWN0aW9uOm1lc3NhZ2U6Y2F0ZWdvcnk6bW9kdWxlOmxpbmVubylcblwKIC14ICAgICA6IHNraXAgZmlyc3QgbGluZSBvZiBzb3VyY2UsIGFsbG93aW5nIHVzZSBvZiBub24tVW5peCBmb3JtcyBvZiAjIWNtZFxuXAogZmlsZSAgIDogcHJvZ3JhbSByZWFkIGZyb20gc2NyaXB0IGZpbGVcblwKQEAgLTI4MSw2ICsyODEsNyBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgogCQkJaGVscCsrOwogCQkJYnJlYWs7CiAKQEAgLTQzMSw5ICs0MzIsMTAgQEAKIAl9CiAKIAlpZiAobW9kdWxlICE9IE5VTEwpIHsKLQkJLyogQmFja3VwIF9QeU9TX29wdGluZCBhbmQgZm9yY2Ugc3lzLmFydlswXSA9IG1vZHVsZSAqLworCQkvKiBCYWNrdXAgX1B5T1Nfb3B0aW5kIGFuZCBmb3JjZSBzeXMuYXJndlswXSA9ICctYycKKwkJICAgc28gdGhhdCBQeVN5c19TZXRBcmd2IGNvcnJlY3RseSBzZXRzIHN5cy5wYXRoWzBdIHRvICcnKi8KIAkJX1B5T1Nfb3B0aW5kLS07Ci0gICAgICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXSA9IG1vZHVsZTsKKwkJYXJndltfUHlPU19vcHRpbmRdID0gIi1jIjsKIAl9CiAKIAlQeVN5c19TZXRBcmd2KGFyZ2MtX1B5T1Nfb3B0aW5kLCBhcmd2K19QeU9TX29wdGluZCk7CmRpZmYgLS1naXQgYS9Nb2R1bGVzL21tYXBtb2R1bGUuYyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCmluZGV4IGQ3YTg5NDQuLmFmZTk5MTYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvbW1hcG1vZHVsZS5jCisrKyBiL01vZHVsZXMvbW1hcG1vZHVsZS5jCkBAIC01MCw3ICs1MCwxMCBAQAogI2VuZGlmIC8qIFVOSVggKi8KIAogI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX1RZUEVTX0ggKi8KIAogLyogUHJlZmVyIE1BUF9BTk9OWU1PVVMgc2luY2UgTUFQX0FOT04gaXMgZGVwcmVjYXRlZCBhY2NvcmRpbmcgdG8gbWFuIHBhZ2UuICovCiAjaWYgIWRlZmluZWQoTUFQX0FOT05ZTU9VUykgJiYgZGVmaW5lZChNQVBfQU5PTikKZGlmZiAtLWdpdCBhL01vZHVsZXMvcG9zaXhtb2R1bGUuYyBiL01vZHVsZXMvcG9zaXhtb2R1bGUuYwppbmRleCBjMDI4MGRlLi5kOTY4YjZjIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3Bvc2l4bW9kdWxlLmMKKysrIGIvTW9kdWxlcy9wb3NpeG1vZHVsZS5jCkBAIC02NCwxNCArNjQsMjEgQEAKICNpbmNsdWRlICJvc2RlZnMuaCIKICNlbmRpZgogCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmIC8qIEhBVkVfU1lTX1RZUEVTX0ggKi8KKworI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYgLyogSEFWRV9TWVNfU1RBVF9IICovCiAKICNpZmRlZiBIQVZFX1NZU19XQUlUX0gKICNpbmNsdWRlIDxzeXMvd2FpdC5oPgkJLyogRm9yIFdOT0hBTkcgKi8KICNlbmRpZgogCisjaWZkZWYgSEFWRV9TSUdOQUxfSAogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2VuZGlmCiAKICNpZmRlZiBIQVZFX0ZDTlRMX0gKICNpbmNsdWRlIDxmY250bC5oPgpAQCAtMjQ2LDkgKzI1MywxNSBAQAogI2VuZGlmCiAKICNpZmRlZiBfTVNDX1ZFUgorI2lmZGVmIEhBVkVfRElSRUNUX0gKICNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfSU9fSAogI2luY2x1ZGUgPGlvLmg+CisjZW5kaWYKKyNpZmRlZiBIQVZFX1BST0NFU1NfSAogI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbmRpZgogI2luY2x1ZGUgIm9zZGVmcy5oIgogI2RlZmluZSBfV0lOMzJfV0lOTlQgMHgwNDAwCSAgLyogTmVlZGVkIGZvciBDcnlwdG9BUEkgb24gc29tZSBzeXN0ZW1zICovCiAjaW5jbHVkZSA8d2luZG93cy5oPgpAQCAtMTIyNyw3ICsxMjQwLDkgQEAKIAogI2RlZmluZSBJU1NMQVNIQShjKSAoKGMpID09ICdcXCcgfHwgKGMpID09ICcvJykKICNkZWZpbmUgSVNTTEFTSFcoYykgKChjKSA9PSBMJ1xcJyB8fCAoYykgPT0gTCcvJykKKyNpZm5kZWYgQVJSQVlTSVpFCiAjZGVmaW5lIEFSUkFZU0laRShhKSAoc2l6ZW9mKGEpIC8gc2l6ZW9mKGFbMF0pKQorI2VuZGlmCiAKIHN0YXRpYyBCT09MCiBJc1VOQ1Jvb3RBKGNoYXIgKnBhdGgsIGludCBwYXRobGVuKQpAQCAtMTM4Nyw3ICsxNDAyLDcgQEAKIAkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygwKTsKIAkvKiBBY2Nlc3MgaXMgcG9zc2libGUgaWYgZWl0aGVyIHdyaXRlIGFjY2VzcyB3YXNuJ3QgcmVxdWVzdGVkLCBvcgogCSAgIHRoZSBmaWxlIGlzbid0IHJlYWQtb25seS4gKi8KLQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKCEobW9kZSAmIDIpIHx8ICEoYXR0ciAmJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkpOworCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoIShtb2RlICYgMikgfHwgIShhdHRyICYgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkpKTsKICNlbHNlCiAJaW50IHJlczsKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImV0aTphY2Nlc3MiLCAKQEAgLTE4NDcsNiArMTg2MiwxNSBAQAogCQkJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAkJCQlyZXN1bHQgPSBGaW5kTmV4dEZpbGVXKGhGaW5kRmlsZSwgJndGaWxlRGF0YSk7CiAJCQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwkJCQkvKiBGaW5kTmV4dEZpbGUgc2V0cyBlcnJvciB0byBFUlJPUl9OT19NT1JFX0ZJTEVTIGlmCisJCQkJICAgaXQgZ290IHRvIHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeS4gKi8KKwkJCQlpZiAoIXJlc3VsdCAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9OT19NT1JFX0ZJTEVTKSB7CisJCQkJICAgIFB5X0RFQ1JFRihkKTsKKwkJCQkgICAgd2luMzJfZXJyb3JfdW5pY29kZSgiRmluZE5leHRGaWxlVyIsIHduYW1lYnVmKTsKKwkJCQkgICAgRmluZENsb3NlKGhGaW5kRmlsZSk7CisJCQkJICAgIGZyZWUod25hbWVidWYpOworCQkJCSAgICByZXR1cm4gTlVMTDsKKwkJCQl9CiAJCQl9IHdoaWxlIChyZXN1bHQgPT0gVFJVRSk7CiAKIAkJCWlmIChGaW5kQ2xvc2UoaEZpbmRGaWxlKSA9PSBGQUxTRSkgewpAQCAtMTkwNiw2ICsxOTMwLDE0IEBACiAJCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAkJcmVzdWx0ID0gRmluZE5leHRGaWxlKGhGaW5kRmlsZSwgJkZpbGVEYXRhKTsKIAkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKKwkJLyogRmluZE5leHRGaWxlIHNldHMgZXJyb3IgdG8gRVJST1JfTk9fTU9SRV9GSUxFUyBpZgorCQkgICBpdCBnb3QgdG8gdGhlIGVuZCBvZiB0aGUgZGlyZWN0b3J5LiAqLworCQlpZiAoIXJlc3VsdCAmJiBHZXRMYXN0RXJyb3IoKSAhPSBFUlJPUl9OT19NT1JFX0ZJTEVTKSB7CisJCSAgICBQeV9ERUNSRUYoZCk7CisJCSAgICB3aW4zMl9lcnJvcigiRmluZE5leHRGaWxlIiwgbmFtZWJ1Zik7CisJCSAgICBGaW5kQ2xvc2UoaEZpbmRGaWxlKTsKKwkJICAgIHJldHVybiBOVUxMOworCQl9CiAJfSB3aGlsZSAocmVzdWx0ID09IFRSVUUpOwogCiAJaWYgKEZpbmRDbG9zZShoRmluZEZpbGUpID09IEZBTFNFKSB7CkBAIC03ODY3LDYgKzc4OTksNDIgQEAKIH0KICNlbmRpZgogCisjaWZkZWYgX19WTVMKKy8qIFVzZSBvcGVuc3NsIHJhbmRvbSByb3V0aW5lICovCisjaW5jbHVkZSA8b3BlbnNzbC9yYW5kLmg+CitQeURvY19TVFJWQVIodm1zX3VyYW5kb21fX2RvY19fLAorInVyYW5kb20obikgLT4gc3RyXG5cblwKK1JldHVybiBhIHN0cmluZyBvZiBuIHJhbmRvbSBieXRlcyBzdWl0YWJsZSBmb3IgY3J5cHRvZ3JhcGhpYyB1c2UuIik7CisKK3N0YXRpYyBQeU9iamVjdCoKK3Ztc191cmFuZG9tKFB5T2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKK3sKKwlpbnQgaG93TWFueTsKKwlQeU9iamVjdCogcmVzdWx0OworCisJLyogUmVhZCBhcmd1bWVudHMgKi8KKwlpZiAoISBQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJpOnVyYW5kb20iLCAmaG93TWFueSkpCisJCXJldHVybiBOVUxMOworCWlmIChob3dNYW55IDwgMCkKKwkJcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorCQkJCSAgICAibmVnYXRpdmUgYXJndW1lbnQgbm90IGFsbG93ZWQiKTsKKworCS8qIEFsbG9jYXRlIGJ5dGVzICovCisJcmVzdWx0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgaG93TWFueSk7CisJaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisJCS8qIEdldCByYW5kb20gZGF0YSAqLworCQlpZiAoUkFORF9wc2V1ZG9fYnl0ZXMoKHVuc2lnbmVkIGNoYXIqKQorCQkJCSAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXN1bHQpLAorCQkJCSAgICAgIGhvd01hbnkpIDwgMCkgeworCQkJUHlfREVDUkVGKHJlc3VsdCk7CisJCQlyZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCisJCQkJCSAgICAiUkFORF9wc2V1ZG9fYnl0ZXMiKTsKKwkJfQorCX0KKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKIHN0YXRpYyBQeU1ldGhvZERlZiBwb3NpeF9tZXRob2RzW10gPSB7CiAJeyJhY2Nlc3MiLAlwb3NpeF9hY2Nlc3MsIE1FVEhfVkFSQVJHUywgcG9zaXhfYWNjZXNzX19kb2NfX30sCiAjaWZkZWYgSEFWRV9UVFlOQU1FCkBAIC04MTYwLDYgKzgyMjgsOSBAQAogICNpZmRlZiBNU19XSU5ET1dTCiAgCXsidXJhbmRvbSIsIHdpbjMyX3VyYW5kb20sIE1FVEhfVkFSQVJHUywgd2luMzJfdXJhbmRvbV9fZG9jX199LAogICNlbmRpZgorICNpZmRlZiBfX1ZNUworIAl7InVyYW5kb20iLCB2bXNfdXJhbmRvbSwgTUVUSF9WQVJBUkdTLCB2bXNfdXJhbmRvbV9fZG9jX199LAorICNlbmRpZgogCXtOVUxMLAkJTlVMTH0JCSAvKiBTZW50aW5lbCAqLwogfTsKIApkaWZmIC0tZ2l0IGEvTW9kdWxlcy9weWV4cGF0LmMgYi9Nb2R1bGVzL3B5ZXhwYXQuYwppbmRleCA4YTEwYmFiLi42N2Y3MDA3IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3B5ZXhwYXQuYworKysgYi9Nb2R1bGVzL3B5ZXhwYXQuYwpAQCAtMjM4LDYgKzIzOCwxOCBAQAogICAgIHJldHVybiAwOwogfQogCisvKiBEdW1teSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyIHVzZWQgd2hlbiBhbiBlcnJvciAoZXhjZXB0aW9uKSBoYXMKKyAgIGJlZW4gZGV0ZWN0ZWQsIGFuZCB0aGUgYWN0dWFsIHBhcnNpbmcgY2FuIGJlIHRlcm1pbmF0ZWQgZWFybHkuCisgICBUaGlzIGlzIG5lZWRlZCBzaW5jZSBjaGFyYWN0ZXIgZGF0YSBoYW5kbGVyIGNhbid0IGJlIHNhZmVseSByZW1vdmVkCisgICBmcm9tIHdpdGhpbiB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYnV0IGNhbiBiZSByZXBsYWNlZC4gIEl0IGlzCisgICB1c2VkIG9ubHkgZnJvbSB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciB0cmFtcG9saW5lLCBhbmQgbXVzdCBiZQorICAgdXNlZCByaWdodCBhZnRlciBgZmxhZ19lcnJvcigpYCBpcyBjYWxsZWQuICovCitzdGF0aWMgdm9pZAorbm9vcF9jaGFyYWN0ZXJfZGF0YV9oYW5kbGVyKHZvaWQgKnVzZXJEYXRhLCBjb25zdCBYTUxfQ2hhciAqZGF0YSwgaW50IGxlbikgCit7CisgICAgLyogRG8gbm90aGluZy4gKi8KK30KKwogc3RhdGljIHZvaWQKIGZsYWdfZXJyb3IoeG1scGFyc2VvYmplY3QgKnNlbGYpCiB7CkBAIC00NTcsNiArNDY5LDggQEAKICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICAgICAgZmxhZ19lcnJvcihzZWxmKTsKKyAgICAgICAgWE1MX1NldENoYXJhY3RlckRhdGFIYW5kbGVyKHNlbGYtPml0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb3BfY2hhcmFjdGVyX2RhdGFfaGFuZGxlcik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgUHlUdXBsZV9TRVRfSVRFTShhcmdzLCAwLCB0ZW1wKTsKQEAgLTQ2OSw2ICs0ODMsOCBAQAogICAgIFB5X0RFQ1JFRihhcmdzKTsKICAgICBpZiAodGVtcCA9PSBOVUxMKSB7CiAgICAgICAgIGZsYWdfZXJyb3Ioc2VsZik7CisgICAgICAgIFhNTF9TZXRDaGFyYWN0ZXJEYXRhSGFuZGxlcihzZWxmLT5pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub29wX2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIFB5X0RFQ1JFRih0ZW1wKTsKQEAgLTE1NDIsOCArMTU1OCwyMiBAQAogICAgICAgICB4bWxoYW5kbGVyIGNfaGFuZGxlciA9IE5VTEw7CiAgICAgICAgIFB5T2JqZWN0ICp0ZW1wID0gc2VsZi0+aGFuZGxlcnNbaGFuZGxlcm51bV07CiAKLSAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgLyogSWYgdGhpcyBpcyB0aGUgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciwgYW5kIGEgY2hhcmFjdGVyCisgICAgICAgICAgICAgICBkYXRhIGhhbmRsZXIgaXMgYWxyZWFkeSBhY3RpdmUsIHdlIG5lZWQgdG8gYmUgbW9yZQorICAgICAgICAgICAgICAgY2FyZWZ1bC4gIFdoYXQgd2UgY2FuIHNhZmVseSBkbyBpcyByZXBsYWNlIHRoZSBleGlzdGluZworICAgICAgICAgICAgICAgY2hhcmFjdGVyIGRhdGEgaGFuZGxlciBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIGEgbm8tb3AKKyAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWZ1c2UgdG8gY2FsbCBQeXRob24uICBUaGUgZG93bnNpZGUKKyAgICAgICAgICAgICAgIGlzIHRoYXQgdGhpcyBkb2Vzbid0IGNvbXBsZXRlbHkgcmVtb3ZlIHRoZSBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgIGRhdGEgaGFuZGxlciBmcm9tIHRoZSBDIGxheWVyIGlmIHRoZXJlJ3MgYW55IGNhbGxiYWNrCisgICAgICAgICAgICAgICBhY3RpdmUsIHNvIEV4cGF0IGRvZXMgYSBsaXR0bGUgbW9yZSB3b3JrIHRoYW4gaXQKKyAgICAgICAgICAgICAgIG90aGVyd2lzZSB3b3VsZCwgYnV0IHRoYXQncyByZWFsbHkgYW4gb2RkIGNhc2UuICBBIG1vcmUKKyAgICAgICAgICAgICAgIGVsYWJvcmF0ZSBzeXN0ZW0gb2YgaGFuZGxlcnMgYW5kIHN0YXRlIGNvdWxkIHJlbW92ZSB0aGUKKyAgICAgICAgICAgICAgIEMgaGFuZGxlciBtb3JlIGVmZmVjdGl2ZWx5LiAqLworICAgICAgICAgICAgaWYgKGhhbmRsZXJudW0gPT0gQ2hhcmFjdGVyRGF0YSAmJiBzZWxmLT5pbl9jYWxsYmFjaykKKyAgICAgICAgICAgICAgICBjX2hhbmRsZXIgPSBub29wX2NoYXJhY3Rlcl9kYXRhX2hhbmRsZXI7CiAgICAgICAgICAgICB2ID0gTlVMTDsKKyAgICAgICAgfQogICAgICAgICBlbHNlIGlmICh2ICE9IE5VTEwpIHsKICAgICAgICAgICAgIFB5X0lOQ1JFRih2KTsKICAgICAgICAgICAgIGNfaGFuZGxlciA9IGhhbmRsZXJfaW5mb1toYW5kbGVybnVtXS5oYW5kbGVyOwpkaWZmIC0tZ2l0IGEvTW9kdWxlcy9yZWFkbGluZS5jIGIvTW9kdWxlcy9yZWFkbGluZS5jCmluZGV4IDhmZGEyMjguLjkyZjJkMWYgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvcmVhZGxpbmUuYworKysgYi9Nb2R1bGVzL3JlYWRsaW5lLmMKQEAgLTIwLDYgKzIwLDEyIEBACiAjaW5jbHVkZSA8bG9jYWxlLmg+CiAjZW5kaWYKIAorI2lmZGVmIFNBVkVfTE9DQUxFCisjICBkZWZpbmUgUkVTVE9SRV9MT0NBTEUoc2wpIHsgc2V0bG9jYWxlKExDX0NUWVBFLCBzbCk7IGZyZWUoc2wpOyB9CisjZWxzZQorIyAgZGVmaW5lIFJFU1RPUkVfTE9DQUxFKHNsKSAKKyNlbmRpZgorCiAvKiBHTlUgcmVhZGxpbmUgZGVmaW5pdGlvbnMgKi8KICN1bmRlZiBIQVZFX0NPTkZJR19IIC8qIEVsc2UgcmVhZGxpbmUvY2hhcmRlZnMuaCBpbmNsdWRlcyBzdHJpbmdzLmggKi8KICNpbmNsdWRlIDxyZWFkbGluZS9yZWFkbGluZS5oPgpAQCAtNzIzLDEwICs3MjksNyBAQAogCSAqLwogCXJsX2luaXRpYWxpemUoKTsKIAotI2lmZGVmIFNBVkVfTE9DQUxFCi0Jc2V0bG9jYWxlKExDX0NUWVBFLCBzYXZlZF9sb2NhbGUpOyAvKiBSZXN0b3JlIGxvY2FsZSAqLwotCWZyZWUoc2F2ZWRfbG9jYWxlKTsKLSNlbmRpZgorCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKIH0KIAogLyogV3JhcHBlciBhcm91bmQgR05VIHJlYWRsaW5lIHRoYXQgaGFuZGxlcyBzaWduYWxzIGRpZmZlcmVudGx5LiAqLwpAQCAtODY0LDcgKzg2Nyw4IEBACiAJcCA9IHJlYWRsaW5lX3VudGlsX2VudGVyX29yX3NpZ25hbChwcm9tcHQsICZzaWduYWwpOwogCQogCS8qIHdlIGdvdCBhbiBpbnRlcnJ1cHQgc2lnbmFsICovCi0JaWYoc2lnbmFsKSB7CisJaWYgKHNpZ25hbCkgeworCQlSRVNUT1JFX0xPQ0FMRShzYXZlZF9sb2NhbGUpCiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtODczLDYgKzg3Nyw3IEBACiAJCXAgPSBQeU1lbV9NYWxsb2MoMSk7CiAJCWlmIChwICE9IE5VTEwpCiAJCQkqcCA9ICdcMCc7CisJCVJFU1RPUkVfTE9DQUxFKHNhdmVkX2xvY2FsZSkKIAkJcmV0dXJuIHA7CiAJfQogCkBAIC05MDUsMTAgKzkxMCw3IEBACiAJCXBbbisxXSA9ICdcMCc7CiAJfQogCWZyZWUocSk7Ci0jaWZkZWYgU0FWRV9MT0NBTEUKLQlzZXRsb2NhbGUoTENfQ1RZUEUsIHNhdmVkX2xvY2FsZSk7IC8qIFJlc3RvcmUgbG9jYWxlICovCi0JZnJlZShzYXZlZF9sb2NhbGUpOwotI2VuZGlmCisJUkVTVE9SRV9MT0NBTEUoc2F2ZWRfbG9jYWxlKQogCXJldHVybiBwOwogfQogCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jIGIvTW9kdWxlcy9zZWxlY3Rtb2R1bGUuYwppbmRleCBkZmE0ZTg1Li45ZWFhZTg0IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NlbGVjdG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc2VsZWN0bW9kdWxlLmMKQEAgLTM2LDcgKzM2LDcgQEAKIGV4dGVybiB2b2lkIGJ6ZXJvKHZvaWQgKiwgaW50KTsKICNlbmRpZgogCi0jaWZuZGVmIERPTlRfSEFWRV9TWVNfVFlQRVNfSAorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNlbmRpZgogCkBAIC00NiwxNCArNDYsMTQgQEAKICNlbmRpZgogCiAjaWZkZWYgTVNfV0lORE9XUwotI2luY2x1ZGUgPHdpbnNvY2suaD4KKyMgIGluY2x1ZGUgPHdpbnNvY2suaD4KICNlbHNlCi0jaWZkZWYgX19CRU9TX18KLSNpbmNsdWRlIDxuZXQvc29ja2V0Lmg+Ci0jZGVmaW5lIFNPQ0tFVCBpbnQKLSNlbHNlCi0jZGVmaW5lIFNPQ0tFVCBpbnQKLSNlbmRpZgorIyAgZGVmaW5lIFNPQ0tFVCBpbnQKKyMgIGlmZGVmIF9fQkVPU19fCisjICAgIGluY2x1ZGUgPG5ldC9zb2NrZXQuaD4KKyMgIGVsaWYgZGVmaW5lZChfX1ZNUykKKyMgICAgaW5jbHVkZSA8c29ja2V0Lmg+CisjICBlbmRpZgogI2VuZGlmCiAKIApAQCAtNjY4LDcgKzY2OCw3IEBACiB0aGF0IGFyZSByZWFkeS5cblwKIFxuXAogKioqIElNUE9SVEFOVCBOT1RJQ0UgKioqXG5cCi1PbiBXaW5kb3dzLCBvbmx5IHNvY2tldHMgYXJlIHN1cHBvcnRlZDsgb24gVW5peCwgYWxsIGZpbGUgZGVzY3JpcHRvcnMuIik7CitPbiBXaW5kb3dzIGFuZCBPcGVuVk1TLCBvbmx5IHNvY2tldHMgYXJlIHN1cHBvcnRlZDsgb24gVW5peCwgYWxsIGZpbGUgZGVzY3JpcHRvcnMuIik7CiAKIHN0YXRpYyBQeU1ldGhvZERlZiBzZWxlY3RfbWV0aG9kc1tdID0gewogICAgIHsic2VsZWN0IiwJc2VsZWN0X3NlbGVjdCwgTUVUSF9WQVJBUkdTLCBzZWxlY3RfZG9jfSwKQEAgLTY4Miw3ICs2ODIsNyBAQAogIlRoaXMgbW9kdWxlIHN1cHBvcnRzIGFzeW5jaHJvbm91cyBJL08gb24gbXVsdGlwbGUgZmlsZSBkZXNjcmlwdG9ycy5cblwKIFxuXAogKioqIElNUE9SVEFOVCBOT1RJQ0UgKioqXG5cCi1PbiBXaW5kb3dzLCBvbmx5IHNvY2tldHMgYXJlIHN1cHBvcnRlZDsgb24gVW5peCwgYWxsIGZpbGUgZGVzY3JpcHRvcnMuIik7CitPbiBXaW5kb3dzIGFuZCBPcGVuVk1TLCBvbmx5IHNvY2tldHMgYXJlIHN1cHBvcnRlZDsgb24gVW5peCwgYWxsIGZpbGUgZGVzY3JpcHRvcnMuIik7CiAKIFB5TU9ESU5JVF9GVU5DCiBpbml0c2VsZWN0KHZvaWQpCmRpZmYgLS1naXQgYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jIGIvTW9kdWxlcy9zb2NrZXRtb2R1bGUuYwppbmRleCAyNjJhYmU4Li5iYjk5YmRlIDEwMDY0NAotLS0gYS9Nb2R1bGVzL3NvY2tldG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc29ja2V0bW9kdWxlLmMKQEAgLTE2MSw3ICsxNjEsOCBAQAogICAgKHRoaXMgaW5jbHVkZXMgdGhlIGdldGFkZHJpbmZvIGVtdWxhdGlvbikgcHJvdGVjdCBhY2Nlc3Mgd2l0aCBhIGxvY2suICovCiAjaWYgZGVmaW5lZChXSVRIX1RIUkVBRCkgJiYgKGRlZmluZWQoX19BUFBMRV9fKSB8fCBcCiAgICAgKGRlZmluZWQoX19GcmVlQlNEX18pICYmIF9fRnJlZUJTRF92ZXJzaW9uKzAgPCA1MDMwMDApIHx8IFwKLSAgICBkZWZpbmVkKF9fT3BlbkJTRF9fKSB8fCBkZWZpbmVkKF9fTmV0QlNEX18pIHx8ICFkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pKQorICAgIGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgfHwgXAorICAgIGRlZmluZWQoX19WTVMpIHx8ICFkZWZpbmVkKEhBVkVfR0VUQUREUklORk8pKQogI2RlZmluZSBVU0VfR0VUQUREUklORk9fTE9DSwogI2VuZGlmCiAKQEAgLTE4NiwxNSArMTg3LDggQEAKICNlbmRpZgogCiAjaWYgZGVmaW5lZChfX1ZNUykKLSNpZiAhIGRlZmluZWQoX1NPQ0tBRERSX0xFTikKLSMgICBpZmRlZiBnZXRhZGRyaW5mbwotIyAgICAgIHVuZGVmIGdldGFkZHJpbmZvCi0jICAgZW5kaWYKLSMgIGluY2x1ZGUgIlRDUElQX0lPQ1RMX1JPVVRJTkUiCi0jZWxzZQogIyAgaW5jbHVkZSA8aW9jdGwuaD4KICNlbmRpZgotI2VuZGlmCiAKICNpZiBkZWZpbmVkKFBZT1NfT1MyKQogIyBkZWZpbmUgIElOQ0xfRE9TCkBAIC0yMzQsNyArMjI4LDkgQEAKICNlbmRpZgogCiAvKiBHZW5lcmljIGluY2x1ZGVzICovCisjaWZkZWYgSEFWRV9TWVNfVFlQRVNfSAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCiAKIC8qIEdlbmVyaWMgc29ja2V0IG9iamVjdCBkZWZpbml0aW9ucyBhbmQgaW5jbHVkZXMgKi8KICNkZWZpbmUgUHlTb2NrZXRfQlVJTERJTkdfU09DS0VUCkBAIC0yNzAsNyArMjY2LDkgQEAKICNlbHNlCiAKIC8qIE1TX1dJTkRPV1MgaW5jbHVkZXMgKi8KLSMgaW5jbHVkZSA8ZmNudGwuaD4KKyMgaWZkZWYgSEFWRV9GQ05UTF9ICisjICBpbmNsdWRlIDxmY250bC5oPgorIyBlbmRpZgogCiAjZW5kaWYKIApAQCAtMjkwLDcgKzI4OCw3IEBACiAgICAqIF9TU19BTElHTlNJWkUgaXMgZGVmaW5lZCBpbiBzeXMvc29ja2V0LmggYnkgNi41LjIxLAogICAgKiBmb3IgZXhhbXBsZSwgYnV0IG5vdCBieSA2LjUuMTAuCiAgICAqLwotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI+MTIwMAorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVI+MTIwMQogICAvKiBEbyBub3QgaW5jbHVkZSBhZGRyaW5mby5oIGZvciBNU1ZDNyBvciBncmVhdGVyLiAnYWRkcmluZm8nIGFuZAogICAgKiBFQUlfKiBjb25zdGFudHMgYXJlIGRlZmluZWQgaW4gKHRoZSBhbHJlYWR5IGluY2x1ZGVkKSB3czJ0Y3BpcC5oLgogICAgKi8KQEAgLTM1OSwxMSArMzU3LDYgQEAKICNkZWZpbmUgU09DS0VUQ0xPU0UgY2xvc2UKICNlbmRpZgogCi0jaWZkZWYgX19WTVMKLS8qIFRDUC9JUCBTZXJ2aWNlcyBmb3IgVk1TIHVzZXMgYSBtYXhpbXVtIHNlbmQvcmV2YyBidWZmZXIgbGVuZ3RoIG9mIDY1NTM1ICovCi0jZGVmaW5lIFNFR01FTlRfU0laRSA2NTUzNQotI2VuZGlmCi0KICNpZiBkZWZpbmVkKEhBVkVfQkxVRVRPT1RIX0gpIHx8IGRlZmluZWQoSEFWRV9CTFVFVE9PVEhfQkxVRVRPT1RIX0gpCiAjZGVmaW5lIFVTRV9CTFVFVE9PVEggMQogI2lmIGRlZmluZWQoX19GcmVlQlNEX18pCkBAIC0zNzQsNiArMzY3LDE0IEBACiAjZGVmaW5lIF9CVF9TT0NLQUREUl9NRU1CKHMsIHByb3RvKSAmKChzKS0+c29ja19hZGRyKQogI2RlZmluZSBfQlRfTDJfTUVNQihzYSwgbWVtYikgKChzYSktPmwyY2FwXyMjbWVtYikKICNkZWZpbmUgX0JUX1JDX01FTUIoc2EsIG1lbWIpICgoc2EpLT5yZmNvbW1fIyNtZW1iKQorI2VsaWYgZGVmaW5lZChfX05ldEJTRF9fKQorI2RlZmluZSBzb2NrYWRkcl9sMiBzb2NrYWRkcl9idAorI2RlZmluZSBzb2NrYWRkcl9yYyBzb2NrYWRkcl9idAorI2RlZmluZSBzb2NrYWRkcl9zY28gc29ja2FkZHJfYnQKKyNkZWZpbmUgX0JUX1NPQ0tBRERSX01FTUIocywgcHJvdG8pICYoKHMpLT5zb2NrX2FkZHIpCisjZGVmaW5lIF9CVF9MMl9NRU1CKHNhLCBtZW1iKSAoKHNhKS0+YnRfIyNtZW1iKQorI2RlZmluZSBfQlRfUkNfTUVNQihzYSwgbWVtYikgKChzYSktPmJ0XyMjbWVtYikKKyNkZWZpbmUgX0JUX1NDT19NRU1CKHNhLCBtZW1iKSAoKHNhKS0+YnRfIyNtZW1iKQogI2Vsc2UKICNkZWZpbmUgX0JUX1NPQ0tBRERSX01FTUIocywgcHJvdG8pICgmKChzKS0+c29ja19hZGRyKS5idF8jI3Byb3RvKQogI2RlZmluZSBfQlRfTDJfTUVNQihzYSwgbWVtYikgKChzYSktPmwyXyMjbWVtYikKQEAgLTM4Miw2ICszODMsMTEgQEAKICNlbmRpZgogI2VuZGlmCiAKKyNpZmRlZiBfX1ZNUworLyogVENQL0lQIFNlcnZpY2VzIGZvciBWTVMgdXNlcyBhIG1heGltdW0gc2VuZC9yZWN2IGJ1ZmZlciBsZW5ndGggKi8KKyNkZWZpbmUgU0VHTUVOVF9TSVpFICgzMiAqIDEwMjQgLTEpCisjZW5kaWYKKwogLyoKICAqIENvbnN0YW50cyBmb3IgZ2V0bmFtZWluZm8oKQogICovCkBAIC00MTMsMTQgKzQxOSwyNCBAQAogICAgdGhlcmUgaGFzIHRvIGJlIGEgY2lyY3VsYXIgcmVmZXJlbmNlLiAqLwogc3RhdGljIFB5VHlwZU9iamVjdCBzb2NrX3R5cGU7CiAKLS8qIENhbiB3ZSBjYWxsIHNlbGVjdCgpIHdpdGggdGhpcyBzb2NrZXQgd2l0aG91dCBhIGJ1ZmZlciBvdmVycnVuPyAqLworI2lmIGRlZmluZWQoSEFWRV9QT0xMX0gpCisjaW5jbHVkZSA8cG9sbC5oPgorI2VsaWYgZGVmaW5lZChIQVZFX1NZU19QT0xMX0gpCisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNlbmRpZgorCiAjaWZkZWYgUHlfU09DS0VUX0ZEX0NBTl9CRV9HRV9GRF9TRVRTSVpFCiAvKiBQbGF0Zm9ybSBjYW4gc2VsZWN0IGZpbGUgZGVzY3JpcHRvcnMgYmV5b25kIEZEX1NFVFNJWkUgKi8KICNkZWZpbmUgSVNfU0VMRUNUQUJMRShzKSAxCisjZWxpZiBkZWZpbmVkKEhBVkVfUE9MTCkKKy8qIEluc3RlYWQgb2Ygc2VsZWN0KCksIHdlJ2xsIHVzZSBwb2xsKCkgc2luY2UgcG9sbCgpIHdvcmtzIG9uIGFueSBmZC4gKi8KKyNkZWZpbmUgSVNfU0VMRUNUQUJMRShzKSAxCisvKiBDYW4gd2UgY2FsbCBzZWxlY3QoKSB3aXRoIHRoaXMgc29ja2V0IHdpdGhvdXQgYSBidWZmZXIgb3ZlcnJ1bj8gKi8KICNlbHNlCiAvKiBQT1NJWCBzYXlzIHNlbGVjdGluZyBmaWxlIGRlc2NyaXB0b3JzIGJleW9uZCBGRF9TRVRTSVpFCi0gICBoYXMgdW5kZWZpbmVkIGJlaGF2aW91ci4gKi8KLSNkZWZpbmUgSVNfU0VMRUNUQUJMRShzKSAoKHMpLT5zb2NrX2ZkIDwgRkRfU0VUU0laRSkKKyAgIGhhcyB1bmRlZmluZWQgYmVoYXZpb3VyLiAgSWYgdGhlcmUncyBubyB0aW1lb3V0IGxlZnQsIHdlIGRvbid0IGhhdmUgdG8KKyAgIGNhbGwgc2VsZWN0LCBzbyBpdCdzIGEgc2FmZSwgbGl0dGxlIHdoaXRlIGxpZS4gKi8KKyNkZWZpbmUgSVNfU0VMRUNUQUJMRShzKSAoKHMpLT5zb2NrX2ZkIDwgRkRfU0VUU0laRSB8fCBzLT5zb2NrX3RpbWVvdXQgPD0gMC4wKQogI2VuZGlmCiAKIHN0YXRpYyBQeU9iamVjdCoKQEAgLTYxNiw2ICs2MzIsMzAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAorI2lmZGVmIF9fVk1TCisvKiBGdW5jdGlvbiB0byBzZW5kIGluIHNlZ21lbnRzICovCitzdGF0aWMgaW50CitzZW5kc2VnbWVudGVkKGludCBzb2NrX2ZkLCBjaGFyICpidWYsIGludCBsZW4sIGludCBmbGFncykKK3sKKwlpbnQgbiA9IDA7CisJaW50IHJlbWFpbmluZyA9IGxlbjsKKworCXdoaWxlIChyZW1haW5pbmcgPiAwKSB7CisJCXVuc2lnbmVkIGludCBzZWdtZW50OworCisJCXNlZ21lbnQgPSAocmVtYWluaW5nID49IFNFR01FTlRfU0laRSA/IFNFR01FTlRfU0laRSA6IHJlbWFpbmluZyk7CisJCW4gPSBzZW5kKHNvY2tfZmQsIGJ1Ziwgc2VnbWVudCwgZmxhZ3MpOworCQlpZiAobiA8IDApIHsKKwkJCXJldHVybiBuOworCQl9CisJCXJlbWFpbmluZyAtPSBzZWdtZW50OworCQlidWYgKz0gc2VnbWVudDsKKwl9IC8qIGVuZCB3aGlsZSAqLworCisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCiAvKiBGdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBzZXR0aW5nIG9mIHNvY2tldCBibG9ja2luZyBtb2RlCiAgICBpbnRlcm5hbGx5LiBibG9jayA9ICgxIHwgMCkuICovCiBzdGF0aWMgaW50CkBAIC02NDAsOCArNjgwLDggQEAKIAlpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAoY2FkZHJfdCkmYmxvY2ssIHNpemVvZihibG9jaykpOwogI2VsaWYgZGVmaW5lZChfX1ZNUykKIAlibG9jayA9ICFibG9jazsKLQlpb2N0bChzLT5zb2NrX2ZkLCBGSU9OQklPLCAoY2hhciAqKSZibG9jayk7Ci0jZWxzZSAgLyogIVBZT1NfT1MyICYmICFfVk1TICovCisJaW9jdGwocy0+c29ja19mZCwgRklPTkJJTywgKHVuc2lnbmVkIGludCAqKSZibG9jayk7CisjZWxzZSAgLyogIVBZT1NfT1MyICYmICFfX1ZNUyAqLwogCWRlbGF5X2ZsYWcgPSBmY250bChzLT5zb2NrX2ZkLCBGX0dFVEZMLCAwKTsKIAlpZiAoYmxvY2spCiAJCWRlbGF5X2ZsYWcgJj0gKH5PX05PTkJMT0NLKTsKQEAgLTY2NCwxNiArNzA0LDE0IEBACiAJcmV0dXJuIDE7CiB9CiAKLS8qIERvIGEgc2VsZWN0KCkgb24gdGhlIHNvY2tldCwgaWYgbmVjZXNzYXJ5IChzb2NrX3RpbWVvdXQgPiAwKS4KKy8qIERvIGEgc2VsZWN0KCkvcG9sbCgpIG9uIHRoZSBzb2NrZXQsIGlmIG5lY2Vzc2FyeSAoc29ja190aW1lb3V0ID4gMCkuCiAgICBUaGUgYXJndW1lbnQgd3JpdGluZyBpbmRpY2F0ZXMgdGhlIGRpcmVjdGlvbi4KICAgIFRoaXMgZG9lcyBub3QgcmFpc2UgYW4gZXhjZXB0aW9uOyB3ZSdsbCBsZXQgb3VyIGNhbGxlciBkbyB0aGF0CiAgICBhZnRlciB0aGV5J3ZlIHJlYWNxdWlyZWQgdGhlIGludGVycHJldGVyIGxvY2suCi0gICBSZXR1cm5zIDEgb24gdGltZW91dCwgMCBvdGhlcndpc2UuICovCisgICBSZXR1cm5zIDEgb24gdGltZW91dCwgLTEgb24gZXJyb3IsIDAgb3RoZXJ3aXNlLiAqLwogc3RhdGljIGludAogaW50ZXJuYWxfc2VsZWN0KFB5U29ja2V0U29ja09iamVjdCAqcywgaW50IHdyaXRpbmcpCiB7Ci0JZmRfc2V0IGZkczsKLQlzdHJ1Y3QgdGltZXZhbCB0djsKIAlpbnQgbjsKIAogCS8qIE5vdGhpbmcgdG8gZG8gdW5sZXNzIHdlJ3JlIGluIHRpbWVvdXQgbW9kZSAobm90IG5vbi1ibG9ja2luZykgKi8KQEAgLTY4NCwxNyArNzIyLDQwIEBACiAJaWYgKHMtPnNvY2tfZmQgPCAwKQogCQlyZXR1cm4gMDsKIAotCS8qIENvbnN0cnVjdCB0aGUgYXJndW1lbnRzIHRvIHNlbGVjdCAqLwotCXR2LnR2X3NlYyA9IChpbnQpcy0+c29ja190aW1lb3V0OwotCXR2LnR2X3VzZWMgPSAoaW50KSgocy0+c29ja190aW1lb3V0IC0gdHYudHZfc2VjKSAqIDFlNik7Ci0JRkRfWkVSTygmZmRzKTsKLQlGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7CisJLyogUHJlZmVyIHBvbGwsIGlmIGF2YWlsYWJsZSwgc2luY2UgeW91IGNhbiBwb2xsKCkgYW55IGZkCisJICogd2hpY2ggY2FuJ3QgYmUgZG9uZSB3aXRoIHNlbGVjdCgpLiAqLworI2lmZGVmIEhBVkVfUE9MTAorCXsKKwkJc3RydWN0IHBvbGxmZCBwb2xsZmQ7CisJCWludCB0aW1lb3V0OwogCi0JLyogU2VlIGlmIHRoZSBzb2NrZXQgaXMgcmVhZHkgKi8KLQlpZiAod3JpdGluZykKLQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsIE5VTEwsICZmZHMsIE5VTEwsICZ0dik7Ci0JZWxzZQotCQluID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgJmZkcywgTlVMTCwgTlVMTCwgJnR2KTsKKwkJcG9sbGZkLmZkID0gcy0+c29ja19mZDsKKwkJcG9sbGZkLmV2ZW50cyA9IHdyaXRpbmcgPyBQT0xMT1VUIDogUE9MTElOOworCisJCS8qIHMtPnNvY2tfdGltZW91dCBpcyBpbiBzZWNvbmRzLCB0aW1lb3V0IGluIG1zICovCisJCXRpbWVvdXQgPSAoaW50KShzLT5zb2NrX3RpbWVvdXQgKiAxMDAwICsgMC41KTsgCisJCW4gPSBwb2xsKCZwb2xsZmQsIDEsIHRpbWVvdXQpOworCX0KKyNlbHNlCisJeworCQkvKiBDb25zdHJ1Y3QgdGhlIGFyZ3VtZW50cyB0byBzZWxlY3QgKi8KKwkJZmRfc2V0IGZkczsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCXR2LnR2X3NlYyA9IChpbnQpcy0+c29ja190aW1lb3V0OworCQl0di50dl91c2VjID0gKGludCkoKHMtPnNvY2tfdGltZW91dCAtIHR2LnR2X3NlYykgKiAxZTYpOworCQlGRF9aRVJPKCZmZHMpOworCQlGRF9TRVQocy0+c29ja19mZCwgJmZkcyk7CisKKwkJLyogU2VlIGlmIHRoZSBzb2NrZXQgaXMgcmVhZHkgKi8KKwkJaWYgKHdyaXRpbmcpCisJCQluID0gc2VsZWN0KHMtPnNvY2tfZmQrMSwgTlVMTCwgJmZkcywgTlVMTCwgJnR2KTsKKwkJZWxzZQorCQkJbiA9IHNlbGVjdChzLT5zb2NrX2ZkKzEsICZmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJfQorI2VuZGlmCisJCisJaWYgKG4gPCAwKQorCQlyZXR1cm4gLTE7CiAJaWYgKG4gPT0gMCkKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CkBAIC0xNDk0LDcgKzE1NTUsNyBAQAogCQkJICAgICAgICZhZGRybGVuKTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQpIHsKKwlpZiAodGltZW91dCA9PSAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xNzIxLDYgKzE3ODIsOCBAQAogCQlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoZmxhZyk7CiAJfQogI2lmZGVmIF9fVk1TCisJLyogc29ja2xlbl90IGlzIHVuc2lnbmVkIHNvIG5vIG5lZ2F0aXZlIHRlc3QgaXMgbmVlZGVkLAorCSAgIHRlc3QgYnVmbGVuID09IDAgaXMgcHJldmlvdXNseSBkb25lICovCiAJaWYgKGJ1ZmxlbiA+IDEwMjQpIHsKICNlbHNlCiAJaWYgKGJ1ZmxlbiA8PSAwIHx8IGJ1ZmxlbiA+IDEwMjQpIHsKQEAgLTE4NjMsOSArMTkyNiwxNSBAQAogCWlmIChzLT5zb2NrX3RpbWVvdXQgPiAwLjApIHsKIAkJaWYgKHJlcyA8IDAgJiYgZXJybm8gPT0gRUlOUFJPR1JFU1MgJiYgSVNfU0VMRUNUQUJMRShzKSkgewogCQkJdGltZW91dCA9IGludGVybmFsX3NlbGVjdChzLCAxKTsKLQkJCXJlcyA9IGNvbm5lY3Qocy0+c29ja19mZCwgYWRkciwgYWRkcmxlbik7Ci0JCQlpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSVNDT05OKQotCQkJCXJlcyA9IDA7CisJCQlpZiAodGltZW91dCA9PSAwKSB7CisJCQkJcmVzID0gY29ubmVjdChzLT5zb2NrX2ZkLCBhZGRyLCBhZGRybGVuKTsKKwkJCQlpZiAocmVzIDwgMCAmJiBlcnJubyA9PSBFSVNDT05OKQorCQkJCQlyZXMgPSAwOworCQkJfQorCQkJZWxzZSBpZiAodGltZW91dCA9PSAtMSkKKwkJCQlyZXMgPSBlcnJubzsJCS8qIGhhZCBlcnJvciAqLworCQkJZWxzZQorCQkJCXJlcyA9IEVXT1VMREJMT0NLOwkvKiB0aW1lZCBvdXQgKi8KIAkJfQogCX0KIApAQCAtMTg5NSw3ICsxOTY0LDcgQEAKIAlyZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIGFkZHIsIGFkZHJsZW4sICZ0aW1lb3V0KTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQpIHsKKwlpZiAodGltZW91dCA9PSAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0xOTI5LDYgKzE5OTgsMTMgQEAKIAlyZXMgPSBpbnRlcm5hbF9jb25uZWN0KHMsIGFkZHIsIGFkZHJsZW4sICZ0aW1lb3V0KTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCisJLyogU2lnbmFscyBhcmUgbm90IGVycm9ycyAodGhvdWdoIHRoZXkgbWF5IHJhaXNlIGV4Y2VwdGlvbnMpLiAgQWRhcHRlZAorCSAgIGZyb20gUHlFcnJfU2V0RnJvbUVycm5vV2l0aEZpbGVuYW1lT2JqZWN0KCkuICovCisjaWZkZWYgRUlOVFIKKwlpZiAocmVzID09IEVJTlRSICYmIFB5RXJyX0NoZWNrU2lnbmFscygpKQorCQlyZXR1cm4gTlVMTDsKKyNlbmRpZgorCiAJcmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKSByZXMpOwogfQogCkBAIC0yMTQ5LDEwICsyMjI1LDEwIEBACiBzdGF0aWMgc3NpemVfdAogc29ja19yZWN2X2d1dHMoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBjaGFyKiBjYnVmLCBpbnQgbGVuLCBpbnQgZmxhZ3MpCiB7Ci0gICAgICAgIHNzaXplX3Qgb3V0bGVuID0gMDsKKyAgICAgICAgc3NpemVfdCBvdXRsZW4gPSAtMTsKICAgICAgICAgaW50IHRpbWVvdXQ7CiAjaWZkZWYgX19WTVMKLQlpbnQgcmVtYWluaW5nLCBucmVhZDsKKwlpbnQgcmVtYWluaW5nOwogCWNoYXIgKnJlYWRfYnVmOwogI2VuZGlmCiAKQEAgLTIxNjgsNyArMjI0NCw3IEBACiAJCW91dGxlbiA9IHJlY3Yocy0+c29ja19mZCwgY2J1ZiwgbGVuLCBmbGFncyk7CiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIC0xOwogCX0KQEAgLTIxODMsNiArMjI1OSw3IEBACiAJcmVtYWluaW5nID0gbGVuOwogCXdoaWxlIChyZW1haW5pbmcgIT0gMCkgewogCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKKwkJaW50IG5yZWFkID0gLTE7CiAKIAkJc2VnbWVudCA9IHJlbWFpbmluZyAvU0VHTUVOVF9TSVpFOwogCQlpZiAoc2VnbWVudCAhPSAwKSB7CkBAIC0yMTk4LDcgKzIyNzUsNyBAQAogCQkJbnJlYWQgPSByZWN2KHMtPnNvY2tfZmQsIHJlYWRfYnVmLCBzZWdtZW50LCBmbGFncyk7CiAJCVB5X0VORF9BTExPV19USFJFQURTCiAKLQkJaWYgKHRpbWVvdXQpIHsKKwkJaWYgKHRpbWVvdXQgPT0gMSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAJCQlyZXR1cm4gLTE7CiAJCX0KQEAgLTIyNDcsNyArMjMyNCw3IEBACiAJLyogQ2FsbCB0aGUgZ3V0cyAqLwogCW91dGxlbiA9IHNvY2tfcmVjdl9ndXRzKHMsIFB5U3RyaW5nX0FTX1NUUklORyhidWYpLCByZWN2bGVuLCBmbGFncyk7CiAJaWYgKG91dGxlbiA8IDApIHsKLQkJLyogQW4gZXJyb3Igb2NjdXJlZCwgcmVsZWFzZSB0aGUgc3RyaW5nIGFuZCByZXR1cm4gYW4KKwkJLyogQW4gZXJyb3Igb2NjdXJyZWQsIHJlbGVhc2UgdGhlIHN0cmluZyBhbmQgcmV0dXJuIGFuCiAJCSAgIGVycm9yLiAqLwogCQlQeV9ERUNSRUYoYnVmKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0yMzQ2LDcgKzI0MjMsNyBAQAogewogCXNvY2tfYWRkcl90IGFkZHJidWY7CiAJaW50IHRpbWVvdXQ7Ci0Jc3NpemVfdCBuID0gMDsKKwlzc2l6ZV90IG4gPSAtMTsKIAlzb2NrbGVuX3QgYWRkcmxlbjsKIAogCSphZGRyID0gTlVMTDsKQEAgLTIzNzgsNyArMjQ1NSw3IEBACiAJfQogCVB5X0VORF9BTExPV19USFJFQURTCiAKLQlpZiAodGltZW91dCkgeworCWlmICh0aW1lb3V0ID09IDEpIHsKIAkJUHlFcnJfU2V0U3RyaW5nKHNvY2tldF90aW1lb3V0LCAidGltZWQgb3V0Iik7CiAJCXJldHVybiAtMTsKIAl9CkBAIC0yNDkzLDEwICsyNTcwLDcgQEAKIHNvY2tfc2VuZChQeVNvY2tldFNvY2tPYmplY3QgKnMsIFB5T2JqZWN0ICphcmdzKQogewogCWNoYXIgKmJ1ZjsKLQlpbnQgbGVuLCBuID0gMCwgZmxhZ3MgPSAwLCB0aW1lb3V0OwotI2lmZGVmIF9fVk1TCi0JaW50IHNlbmRfbGVuZ3RoOwotI2VuZGlmCisJaW50IGxlbiwgbiA9IC0xLCBmbGFncyA9IDAsIHRpbWVvdXQ7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInMjfGk6c2VuZCIsICZidWYsICZsZW4sICZmbGFncykpCiAJCXJldHVybiBOVUxMOwpAQCAtMjUwNCw0OSArMjU3OCwyMiBAQAogCWlmICghSVNfU0VMRUNUQUJMRShzKSkKIAkJcmV0dXJuIHNlbGVjdF9lcnJvcigpOwogCi0jaWZuZGVmIF9fVk1TCiAJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogCXRpbWVvdXQgPSBpbnRlcm5hbF9zZWxlY3QocywgMSk7CiAJaWYgKCF0aW1lb3V0KQorI2lmZGVmIF9fVk1TCisJCW4gPSBzZW5kc2VnbWVudGVkKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisjZWxzZQogCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIGxlbiwgZmxhZ3MpOworI2VuZGlmCiAJUHlfRU5EX0FMTE9XX1RIUkVBRFMKIAotCWlmICh0aW1lb3V0KSB7CisJaWYgKHRpbWVvdXQgPT0gMSkgewogCQlQeUVycl9TZXRTdHJpbmcoc29ja2V0X3RpbWVvdXQsICJ0aW1lZCBvdXQiKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWlmIChuIDwgMCkKIAkJcmV0dXJuIHMtPmVycm9yaGFuZGxlcigpOwotI2Vsc2UKLQkvKiBEaXZpZGUgcGFja2V0IGludG8gc21hbGxlciBzZWdtZW50cyBmb3IJKi8KLQkvKiAgVENQL0lQIFNlcnZpY2VzIGZvciBPcGVuVk1TCQkJKi8KLQlzZW5kX2xlbmd0aCA9IGxlbjsKLQl3aGlsZSAoc2VuZF9sZW5ndGggIT0gMCkgewotCQl1bnNpZ25lZCBpbnQgc2VnbWVudDsKLQotCQlzZWdtZW50ID0gc2VuZF9sZW5ndGggLyBTRUdNRU5UX1NJWkU7Ci0JCWlmIChzZWdtZW50ICE9IDApIHsKLQkJCXNlZ21lbnQgPSBTRUdNRU5UX1NJWkU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZWdtZW50ID0gc2VuZF9sZW5ndGg7Ci0JCX0KLQkJUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwotCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOwotCQlpZiAoIXRpbWVvdXQpCi0JCQluID0gc2VuZChzLT5zb2NrX2ZkLCBidWYsIHNlZ21lbnQsIGZsYWdzKTsKLQkJUHlfRU5EX0FMTE9XX1RIUkVBRFMKLQkJaWYgKHRpbWVvdXQpIHsKLQkJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQkJaWYgKG4gPCAwKSB7Ci0JCQlyZXR1cm4gcy0+ZXJyb3JoYW5kbGVyKCk7Ci0JCX0KLQkJc2VuZF9sZW5ndGggLT0gc2VnbWVudDsKLQkJYnVmICs9IHNlZ21lbnQ7Ci0JfSAvKiBlbmQgd2hpbGUgKi8KLSNlbmRpZiAvKiAhX19WTVMgKi8KIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpbik7CiB9CiAKQEAgLTI1NjQsNyArMjYxMSw3IEBACiBzb2NrX3NlbmRhbGwoUHlTb2NrZXRTb2NrT2JqZWN0ICpzLCBQeU9iamVjdCAqYXJncykKIHsKIAljaGFyICpidWY7Ci0JaW50IGxlbiwgbiA9IDAsIGZsYWdzID0gMCwgdGltZW91dDsKKwlpbnQgbGVuLCBuID0gLTEsIGZsYWdzID0gMCwgdGltZW91dDsKIAogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyN8aTpzZW5kYWxsIiwgJmJ1ZiwgJmxlbiwgJmZsYWdzKSkKIAkJcmV0dXJuIE5VTEw7CkBAIC0yNTc1LDkgKzI2MjIsMTQgQEAKIAlQeV9CRUdJTl9BTExPV19USFJFQURTCiAJZG8gewogCQl0aW1lb3V0ID0gaW50ZXJuYWxfc2VsZWN0KHMsIDEpOworCQluID0gLTE7CiAJCWlmICh0aW1lb3V0KQogCQkJYnJlYWs7CisjaWZkZWYgX19WTVMKKwkJbiA9IHNlbmRzZWdtZW50ZWQocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzKTsKKyNlbHNlCiAJCW4gPSBzZW5kKHMtPnNvY2tfZmQsIGJ1ZiwgbGVuLCBmbGFncyk7CisjZW5kaWYKIAkJaWYgKG4gPCAwKQogCQkJYnJlYWs7CiAJCWJ1ZiArPSBuOwpAQCAtMjU4NSw3ICsyNjM3LDcgQEAKIAl9IHdoaWxlIChsZW4gPiAwKTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQpIHsKKwlpZiAodGltZW91dCA9PSAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CkBAIC0yNjEzLDcgKzI2NjUsNyBAQAogCVB5T2JqZWN0ICphZGRybzsKIAljaGFyICpidWY7CiAJc3RydWN0IHNvY2thZGRyICphZGRyOwotCWludCBhZGRybGVuLCBsZW4sIG4gPSAwLCBmbGFncywgdGltZW91dDsKKwlpbnQgYWRkcmxlbiwgbGVuLCBuID0gLTEsIGZsYWdzLCB0aW1lb3V0OwogCiAJZmxhZ3MgPSAwOwogCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAicyNPOnNlbmR0byIsICZidWYsICZsZW4sICZhZGRybykpIHsKQEAgLTI2MzUsNyArMjY4Nyw3IEBACiAJCW4gPSBzZW5kdG8ocy0+c29ja19mZCwgYnVmLCBsZW4sIGZsYWdzLCBhZGRyLCBhZGRybGVuKTsKIAlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCi0JaWYgKHRpbWVvdXQpIHsKKwlpZiAodGltZW91dCA9PSAxKSB7CiAJCVB5RXJyX1NldFN0cmluZyhzb2NrZXRfdGltZW91dCwgInRpbWVkIG91dCIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CmRpZmYgLS1naXQgYS9Nb2R1bGVzL3Nwd2Rtb2R1bGUuYyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCmluZGV4IGI3YmYyMGUuLmQzZjMwOWEgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3B3ZG1vZHVsZS5jCisrKyBiL01vZHVsZXMvc3B3ZG1vZHVsZS5jCkBAIC05MSw3ICs5MSw3IEBACiAjdW5kZWYgU0VUSQogCiAJaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLQkJUHlfWERFQ1JFRih2KTsKKwkJUHlfREVDUkVGKHYpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvc3JlLmggYi9Nb2R1bGVzL3NyZS5oCmluZGV4IGIwN2QyMTAuLmQ0YWYwNWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvc3JlLmgKKysrIGIvTW9kdWxlcy9zcmUuaApAQCAtMjMsNyArMjMsNyBAQAogCiB0eXBlZGVmIHN0cnVjdCB7CiAgICAgUHlPYmplY3RfVkFSX0hFQUQKLSAgICBpbnQgZ3JvdXBzOyAvKiBtdXN0IGJlIGZpcnN0ISAqLworICAgIFB5X3NzaXplX3QgZ3JvdXBzOyAvKiBtdXN0IGJlIGZpcnN0ISAqLwogICAgIFB5T2JqZWN0KiBncm91cGluZGV4OwogICAgIFB5T2JqZWN0KiBpbmRleGdyb3VwOwogICAgIC8qIGNvbXBhdGliaWxpdHkgKi8KQEAgLTMxLDcgKzMxLDcgQEAKICAgICBpbnQgZmxhZ3M7IC8qIGZsYWdzIHVzZWQgd2hlbiBjb21waWxpbmcgcGF0dGVybiBzb3VyY2UgKi8KICAgICBQeU9iamVjdCAqd2Vha3JlZmxpc3Q7IC8qIExpc3Qgb2Ygd2VhayByZWZlcmVuY2VzICovCiAgICAgLyogcGF0dGVybiBjb2RlICovCi0gICAgaW50IGNvZGVzaXplOworICAgIFB5X3NzaXplX3QgY29kZXNpemU7CiAgICAgU1JFX0NPREUgY29kZVsxXTsKIH0gUGF0dGVybk9iamVjdDsKIApAQCAtNDIsMTAgKzQyLDEwIEBACiAgICAgUHlPYmplY3QqIHN0cmluZzsgLyogbGluayB0byB0aGUgdGFyZ2V0IHN0cmluZyAobXVzdCBiZSBmaXJzdCkgKi8KICAgICBQeU9iamVjdCogcmVnczsgLyogY2FjaGVkIGxpc3Qgb2YgbWF0Y2hpbmcgc3BhbnMgKi8KICAgICBQYXR0ZXJuT2JqZWN0KiBwYXR0ZXJuOyAvKiBsaW5rIHRvIHRoZSByZWdleCAocGF0dGVybikgb2JqZWN0ICovCi0gICAgaW50IHBvcywgZW5kcG9zOyAvKiBjdXJyZW50IHRhcmdldCBzbGljZSAqLwotICAgIGludCBsYXN0aW5kZXg7IC8qIGxhc3QgaW5kZXggbWFya2VyIHNlZW4gYnkgdGhlIGVuZ2luZSAoLTEgaWYgbm9uZSkgKi8KLSAgICBpbnQgZ3JvdXBzOyAvKiBudW1iZXIgb2YgZ3JvdXBzIChzdGFydC9lbmQgbWFya3MpICovCi0gICAgaW50IG1hcmtbMV07CisgICAgUHlfc3NpemVfdCBwb3MsIGVuZHBvczsgLyogY3VycmVudCB0YXJnZXQgc2xpY2UgKi8KKyAgICBQeV9zc2l6ZV90IGxhc3RpbmRleDsgLyogbGFzdCBpbmRleCBtYXJrZXIgc2VlbiBieSB0aGUgZW5naW5lICgtMSBpZiBub25lKSAqLworICAgIFB5X3NzaXplX3QgZ3JvdXBzOyAvKiBudW1iZXIgb2YgZ3JvdXBzIChzdGFydC9lbmQgbWFya3MpICovCisgICAgUHlfc3NpemVfdCBtYXJrWzFdOwogfSBNYXRjaE9iamVjdDsKIAogdHlwZWRlZiB1bnNpZ25lZCBpbnQgKCpTUkVfVE9MT1dFUl9IT09LKSh1bnNpZ25lZCBpbnQgY2gpOwpAQCAtNTQsNyArNTQsNyBAQAogI2RlZmluZSBTUkVfTUFSS19TSVpFIDIwMAogCiB0eXBlZGVmIHN0cnVjdCBTUkVfUkVQRUFUX1QgewotICAgIGludCBjb3VudDsKKyAgICBQeV9zc2l6ZV90IGNvdW50OwogICAgIFNSRV9DT0RFKiBwYXR0ZXJuOyAvKiBwb2ludHMgdG8gUkVQRUFUIG9wZXJhdG9yIGFyZ3VtZW50cyAqLwogICAgIHZvaWQqIGxhc3RfcHRyOyAvKiBoZWxwZXIgdG8gY2hlY2sgZm9yIGluZmluaXRlIGxvb3BzICovCiAgICAgc3RydWN0IFNSRV9SRVBFQVRfVCAqcHJldjsgLyogcG9pbnRzIHRvIHByZXZpb3VzIHJlcGVhdCBjb250ZXh0ICovCkBAIC02OCwxNyArNjgsMTcgQEAKICAgICB2b2lkKiBlbmQ7IC8qIGVuZCBvZiBvcmlnaW5hbCBzdHJpbmcgKi8KICAgICAvKiBhdHRyaWJ1dGVzIGZvciB0aGUgbWF0Y2ggb2JqZWN0ICovCiAgICAgUHlPYmplY3QqIHN0cmluZzsKLSAgICBpbnQgcG9zLCBlbmRwb3M7CisgICAgUHlfc3NpemVfdCBwb3MsIGVuZHBvczsKICAgICAvKiBjaGFyYWN0ZXIgc2l6ZSAqLwogICAgIGludCBjaGFyc2l6ZTsKICAgICAvKiByZWdpc3RlcnMgKi8KLSAgICBpbnQgbGFzdGluZGV4OwotICAgIGludCBsYXN0bWFyazsKKyAgICBQeV9zc2l6ZV90IGxhc3RpbmRleDsKKyAgICBQeV9zc2l6ZV90IGxhc3RtYXJrOwogICAgIHZvaWQqIG1hcmtbU1JFX01BUktfU0laRV07CiAgICAgLyogZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0dWZmICovCiAgICAgY2hhciogZGF0YV9zdGFjazsKLSAgICB1bnNpZ25lZCBpbnQgZGF0YV9zdGFja19zaXplOwotICAgIHVuc2lnbmVkIGludCBkYXRhX3N0YWNrX2Jhc2U7CisgICAgc2l6ZV90IGRhdGFfc3RhY2tfc2l6ZTsKKyAgICBzaXplX3QgZGF0YV9zdGFja19iYXNlOwogICAgIC8qIGN1cnJlbnQgcmVwZWF0IGNvbnRleHQgKi8KICAgICBTUkVfUkVQRUFUICpyZXBlYXQ7CiAgICAgLyogaG9va3MgKi8KZGlmZiAtLWdpdCBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMgYi9Nb2R1bGVzL3RocmVhZG1vZHVsZS5jCmluZGV4IDYxNjk2NTguLjQ0OGIxMWMgMTAwNjQ0Ci0tLSBhL01vZHVsZXMvdGhyZWFkbW9kdWxlLmMKKysrIGIvTW9kdWxlcy90aHJlYWRtb2R1bGUuYwpAQCAtNTg2LDYgKzU4Niw2MCBAQAogYmUgcmVsaWVkIHVwb24sIGFuZCB0aGUgbnVtYmVyIHNob3VsZCBiZSBzZWVuIHB1cmVseSBhcyBhIG1hZ2ljIGNvb2tpZS5cblwKIEEgdGhyZWFkJ3MgaWRlbnRpdHkgbWF5IGJlIHJldXNlZCBmb3IgYW5vdGhlciB0aHJlYWQgYWZ0ZXIgaXQgZXhpdHMuIik7CiAKK3N0YXRpYyBQeU9iamVjdCAqCit0aHJlYWRfc3RhY2tfc2l6ZShQeU9iamVjdCAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJc2l6ZV90IG9sZF9zaXplOworCVB5X3NzaXplX3QgbmV3X3NpemUgPSAwOworCWludCByYzsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG46c3RhY2tfc2l6ZSIsICZuZXdfc2l6ZSkpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5ld19zaXplIDwgMCkgeworCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwKKwkJCQkic2l6ZSBtdXN0IGJlIDAgb3IgYSBwb3NpdGl2ZSB2YWx1ZSIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlvbGRfc2l6ZSA9IFB5VGhyZWFkX2dldF9zdGFja3NpemUoKTsKKworCXJjID0gUHlUaHJlYWRfc2V0X3N0YWNrc2l6ZSgoc2l6ZV90KSBuZXdfc2l6ZSk7CisJaWYgKHJjID09IC0xKSB7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAorCQkJICAgICAic2l6ZSBub3QgdmFsaWQ6ICV6ZCBieXRlcyIsCisJCQkgICAgIG5ld19zaXplKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChyYyA9PSAtMikgeworCQlQeUVycl9TZXRTdHJpbmcoVGhyZWFkRXJyb3IsCisJCQkJInNldHRpbmcgc3RhY2sgc2l6ZSBub3Qgc3VwcG9ydGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBQeUludF9Gcm9tU3NpemVfdCgoUHlfc3NpemVfdCkgb2xkX3NpemUpOworfQorCitQeURvY19TVFJWQVIoc3RhY2tfc2l6ZV9kb2MsCisic3RhY2tfc2l6ZShbc2l6ZV0pIC0+IHNpemVcblwKK1xuXAorUmV0dXJuIHRoZSB0aHJlYWQgc3RhY2sgc2l6ZSB1c2VkIHdoZW4gY3JlYXRpbmcgbmV3IHRocmVhZHMuICBUaGVcblwKK29wdGlvbmFsIHNpemUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBzdGFjayBzaXplIChpbiBieXRlcykgdG8gYmUgdXNlZFxuXAorZm9yIHN1YnNlcXVlbnRseSBjcmVhdGVkIHRocmVhZHMsIGFuZCBtdXN0IGJlIDAgKHVzZSBwbGF0Zm9ybSBvclxuXAorY29uZmlndXJlZCBkZWZhdWx0KSBvciBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUgb2YgYXQgbGVhc3QgMzIsNzY4ICgzMmspLlxuXAorSWYgY2hhbmdpbmcgdGhlIHRocmVhZCBzdGFjayBzaXplIGlzIHVuc3VwcG9ydGVkLCBhIFRocmVhZEVycm9yXG5cCitleGNlcHRpb24gaXMgcmFpc2VkLiAgSWYgdGhlIHNwZWNpZmllZCBzaXplIGlzIGludmFsaWQsIGEgVmFsdWVFcnJvclxuXAorZXhjZXB0aW9uIGlzIHJhaXNlZCwgYW5kIHRoZSBzdGFjayBzaXplIGlzIHVubW9kaWZpZWQuICAzMmsgYnl0ZXNcblwKKyBjdXJyZW50bHkgdGhlIG1pbmltdW0gc3VwcG9ydGVkIHN0YWNrIHNpemUgdmFsdWUgdG8gZ3VhcmFudGVlXG5cCitzdWZmaWNpZW50IHN0YWNrIHNwYWNlIGZvciB0aGUgaW50ZXJwcmV0ZXIgaXRzZWxmLlxuXAorXG5cCitOb3RlIHRoYXQgc29tZSBwbGF0Zm9ybXMgbWF5IGhhdmUgcGFydGljdWxhciByZXN0cmljdGlvbnMgb24gdmFsdWVzIGZvclxuXAordGhlIHN0YWNrIHNpemUsIHN1Y2ggYXMgcmVxdWlyaW5nIGEgbWluaW11bSBzdGFjayBzaXplIGxhcmdlciB0aGFuIDMya0Igb3JcblwKK3JlcXVpcmluZyBhbGxvY2F0aW9uIGluIG11bHRpcGxlcyBvZiB0aGUgc3lzdGVtIG1lbW9yeSBwYWdlIHNpemVcblwKKy0gcGxhdGZvcm0gZG9jdW1lbnRhdGlvbiBzaG91bGQgYmUgcmVmZXJyZWQgdG8gZm9yIG1vcmUgaW5mb3JtYXRpb25cblwKKyg0a0IgcGFnZXMgYXJlIGNvbW1vbjsgdXNpbmcgbXVsdGlwbGVzIG9mIDQwOTYgZm9yIHRoZSBzdGFjayBzaXplIGlzXG5cCit0aGUgc3VnZ2VzdGVkIGFwcHJvYWNoIGluIHRoZSBhYnNlbmNlIG9mIG1vcmUgc3BlY2lmaWMgaW5mb3JtYXRpb24pLiIpOworCiBzdGF0aWMgUHlNZXRob2REZWYgdGhyZWFkX21ldGhvZHNbXSA9IHsKIAl7InN0YXJ0X25ld190aHJlYWQiLAkoUHlDRnVuY3Rpb24pdGhyZWFkX1B5VGhyZWFkX3N0YXJ0X25ld190aHJlYWQsCiAJICAgICAgICAgICAgICAgICAgICAgICAgTUVUSF9WQVJBUkdTLApAQCAtNjA1LDYgKzY1OSw5IEBACiAJIE1FVEhfTk9BUkdTLCBpbnRlcnJ1cHRfZG9jfSwKIAl7ImdldF9pZGVudCIsCQkoUHlDRnVuY3Rpb24pdGhyZWFkX2dldF9pZGVudCwgCiAJIE1FVEhfTk9BUkdTLCBnZXRfaWRlbnRfZG9jfSwKKwl7InN0YWNrX3NpemUiLAkJKFB5Q0Z1bmN0aW9uKXRocmVhZF9zdGFja19zaXplLAorCQkJCU1FVEhfVkFSQVJHUywKKwkJCQlzdGFja19zaXplX2RvY30sCiAjaWZuZGVmIE5PX0VYSVRfUFJPRwogCXsiZXhpdF9wcm9nIiwJCShQeUNGdW5jdGlvbil0aHJlYWRfUHlUaHJlYWRfZXhpdF9wcm9nLAogCSBNRVRIX1ZBUkFSR1N9LApkaWZmIC0tZ2l0IGEvTW9kdWxlcy90aW1lbW9kdWxlLmMgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwppbmRleCA4N2U1NDNmLi40NDRiNzM5IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3RpbWVtb2R1bGUuYworKysgYi9Nb2R1bGVzL3RpbWVtb2R1bGUuYwpAQCAtMTksNyArMTksOSBAQAogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KIAorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCiAKICNpZmRlZiBRVUlDS1dJTgogI2luY2x1ZGUgPGlvLmg+CkBAIC00MDQsMTMgKzQwNiwzNSBAQAogICAgICAgICAgICAgaW5kZXhpbmcgYmxpbmRseSBpbnRvIHNvbWUgYXJyYXkgZm9yIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbgogICAgICAgICAgICAgYnkgc29tZSBiYWQgaW5kZXggKGZpeGVzIGJ1ZyAjODk3NjI1KS4KIAotICAgICAgICAgICAgTm8gY2hlY2sgZm9yIHllYXIgc2luY2UgaGFuZGxlZCBpbiBnZXR0bWFyZygpLgorCSAgICBBbHNvIHN1cHBvcnQgdmFsdWVzIG9mIHplcm8gZnJvbSBQeXRob24gY29kZSBmb3IgYXJndW1lbnRzIGluIHdoaWNoCisJICAgIHRoYXQgaXMgb3V0IG9mIHJhbmdlIGJ5IGZvcmNpbmcgdGhhdCB2YWx1ZSB0byB0aGUgbG93ZXN0IHZhbHVlIHRoYXQKKwkgICAgaXMgdmFsaWQgKGZpeGVkIGJ1ZyAjMTUyMDkxNCkuCisKKwkgICAgVmFsaWQgcmFuZ2VzIGJhc2VkIG9uIHdoYXQgaXMgYWxsb3dlZCBpbiBzdHJ1Y3QgdG06CisKKwkgICAgLSB0bV95ZWFyOiBbMCwgbWF4KGludCldICgxKQorCSAgICAtIHRtX21vbjogWzAsIDExXSAoMikKKwkgICAgLSB0bV9tZGF5OiBbMSwgMzFdCisJICAgIC0gdG1faG91cjogWzAsIDIzXQorCSAgICAtIHRtX21pbjogWzAsIDU5XQorCSAgICAtIHRtX3NlYzogWzAsIDYwXQorCSAgICAtIHRtX3dkYXk6IFswLCA2XSAoMSkKKwkgICAgLSB0bV95ZGF5OiBbMCwgMzY1XSAoMikKKwkgICAgLSB0bV9pc2RzdDogWy1tYXgoaW50KSwgbWF4KGludCldCisKKwkgICAgKDEpIGdldHRtYXJnKCkgaGFuZGxlcyBib3VuZHMtY2hlY2tpbmcuCisJICAgICgyKSBQeXRob24ncyBhY2NlcHRhYmxlIHJhbmdlIGlzIG9uZSBncmVhdGVyIHRoYW4gdGhlIHJhbmdlIGluIEMsCisJICAgICAgICB0aHVzIG5lZWQgdG8gY2hlY2sgYWdhaW5zdCBhdXRvbWF0aWMgZGVjcmVtZW50IGJ5IGdldHRtYXJnKCkuCiAgICAgICAgICovCi0gICAgICAgIGlmIChidWYudG1fbW9uIDwgMCB8fCBidWYudG1fbW9uID4gMTEpIHsKKwlpZiAoYnVmLnRtX21vbiA9PSAtMSkKKwkgICAgYnVmLnRtX21vbiA9IDA7CisJZWxzZSBpZiAoYnVmLnRtX21vbiA8IDAgfHwgYnVmLnRtX21vbiA+IDExKSB7CiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIm1vbnRoIG91dCBvZiByYW5nZSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi50bV9tZGF5IDwgMSB8fCBidWYudG1fbWRheSA+IDMxKSB7CisJaWYgKGJ1Zi50bV9tZGF5ID09IDApCisJICAgIGJ1Zi50bV9tZGF5ID0gMTsKKwllbHNlIGlmIChidWYudG1fbWRheSA8IDAgfHwgYnVmLnRtX21kYXkgPiAzMSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2YgbW9udGggb3V0IG9mIHJhbmdlIik7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNDMyLDcgKzQ1Niw5IEBACiAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImRheSBvZiB3ZWVrIG91dCBvZiByYW5nZSIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGJ1Zi50bV95ZGF5IDwgMCB8fCBidWYudG1feWRheSA+IDM2NSkgeworCWlmIChidWYudG1feWRheSA9PSAtMSkKKwkgICAgYnVmLnRtX3lkYXkgPSAwOworCWVsc2UgaWYgKGJ1Zi50bV95ZGF5IDwgMCB8fCBidWYudG1feWRheSA+IDM2NSkgewogICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJkYXkgb2YgeWVhciBvdXQgb2YgcmFuZ2UiKTsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC00NjUsNiArNDkxLDE0IEBACiAJCQlyZXR1cm4gcmV0OwogCQl9CiAJCWZyZWUob3V0YnVmKTsKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgJiYgZGVmaW5lZChfX1NURENfU0VDVVJFX0xJQl9fKQorCQkvKiBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1IGRvZXMgdGhpcyBwcm9wZXJseSAqLworCQlpZiAoYnVmbGVuID09IDAgJiYgZXJybm8gPT0gRUlOVkFMKSB7CisJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkludmFsaWQgZm9ybWF0IHN0cmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKyNlbmRpZgorCQkKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL01vZHVsZXMvdW5pY29kZWRhdGEuYyBiL01vZHVsZXMvdW5pY29kZWRhdGEuYwppbmRleCAwNjYwMzUzLi4xYjBiZTI4IDEwMDY0NAotLS0gYS9Nb2R1bGVzL3VuaWNvZGVkYXRhLmMKKysrIGIvTW9kdWxlcy91bmljb2RlZGF0YS5jCkBAIC0zOTUsNiArMzk1LDcgQEAKICAgICBQeVVuaWNvZGVPYmplY3QgKnY7CiAgICAgY2hhciBkZWNvbXBbMjU2XTsKICAgICBpbnQgY29kZSwgaW5kZXgsIGNvdW50LCBpOworICAgIHVuc2lnbmVkIGludCBwcmVmaXhfaW5kZXg7CiAKICAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8hOmRlY29tcG9zaXRpb24iLAogCQkJICAmUHlVbmljb2RlX1R5cGUsICZ2KSkKQEAgLTQyOCw5ICs0MjksMTUgQEAKICAgICAvKiBYWFg6IGNvdWxkIGFsbG9jYXRlIHRoZSBQeVN0cmluZyB1cCBmcm9udCBpbnN0ZWFkCiAgICAgICAgKHN0cmxlbihwcmVmaXgpICsgNSAqIGNvdW50ICsgMSBieXRlcykgKi8KIAorICAgIC8qIEJhc2VkIG9uIGhvdyBpbmRleCBpcyBjYWxjdWxhdGVkIGFib3ZlIGFuZCBkZWNvbXBfZGF0YSBpcyBnZW5lcmF0ZWQKKyAgICAgICBmcm9tIFRvb2xzL3VuaWNvZGUvbWFrZXVuaWNvZGVkYXRhLnB5LCBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlCisgICAgICAgdG8gb3ZlcmZsb3cgZGVjb21wX3ByZWZpeC4gKi8KKyAgICBwcmVmaXhfaW5kZXggPSBkZWNvbXBfZGF0YVtpbmRleF0gJiAyNTU7CisgICAgYXNzZXJ0KHByZWZpeF9pbmRleCA8IChzaXplb2YoZGVjb21wX3ByZWZpeCkvc2l6ZW9mKCpkZWNvbXBfcHJlZml4KSkpOworCiAgICAgLyogY29weSBwcmVmaXggKi8KLSAgICBpID0gc3RybGVuKGRlY29tcF9wcmVmaXhbZGVjb21wX2RhdGFbaW5kZXhdICYgMjU1XSk7Ci0gICAgbWVtY3B5KGRlY29tcCwgZGVjb21wX3ByZWZpeFtkZWNvbXBfZGF0YVtpbmRleF0gJiAyNTVdLCBpKTsKKyAgICBpID0gc3RybGVuKGRlY29tcF9wcmVmaXhbcHJlZml4X2luZGV4XSk7CisgICAgbWVtY3B5KGRlY29tcCwgZGVjb21wX3ByZWZpeFtwcmVmaXhfaW5kZXhdLCBpKTsKIAogICAgIHdoaWxlIChjb3VudC0tID4gMCkgewogICAgICAgICBpZiAoaSkKZGlmZiAtLWdpdCBhL01vZHVsZXMvemxpYm1vZHVsZS5jIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKaW5kZXggMDZiMDY5MC4uZGEzMWU4YiAxMDA2NDQKLS0tIGEvTW9kdWxlcy96bGlibW9kdWxlLmMKKysrIGIvTW9kdWxlcy96bGlibW9kdWxlLmMKQEAgLTY1Myw2ICs2NTMsNyBAQAogICAgIHJldHVybiBSZXRWYWw7CiB9CiAKKyNpZmRlZiBIQVZFX1pMSUJfQ09QWQogUHlEb2NfU1RSVkFSKGNvbXBfY29weV9fZG9jX18sCiAiY29weSgpIC0tIFJldHVybiBhIGNvcHkgb2YgdGhlIGNvbXByZXNzaW9uIG9iamVjdC4iKTsKIApAQCAtNzU0LDYgKzc1NSw3IEBACiAgICAgUHlfWERFQ1JFRihyZXR2YWwpOwogICAgIHJldHVybiBOVUxMOwogfQorI2VuZGlmCiAKIFB5RG9jX1NUUlZBUihkZWNvbXBfZmx1c2hfX2RvY19fLAogImZsdXNoKCBbbGVuZ3RoXSApIC0tIFJldHVybiBhIHN0cmluZyBjb250YWluaW5nIGFueSByZW1haW5pbmdcbiIKQEAgLTgyNyw4ICs4MjksMTAgQEAKICAgICAgICAgICAgICAgICAgY29tcF9jb21wcmVzc19fZG9jX199LAogICAgIHsiZmx1c2giLCAoYmluYXJ5ZnVuYylQeVpsaWJfZmx1c2gsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgY29tcF9mbHVzaF9fZG9jX199LAorI2lmZGVmIEhBVkVfWkxJQl9DT1BZCiAgICAgeyJjb3B5IiwgIChQeUNGdW5jdGlvbilQeVpsaWJfY29weSwgTUVUSF9OT0FSR1MsCiAgICAgICAgICAgICAgIGNvbXBfY29weV9fZG9jX199LAorI2VuZGlmCiAgICAge05VTEwsIE5VTEx9CiB9OwogCkBAIC04MzgsOCArODQyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgZGVjb21wX2RlY29tcHJlc3NfX2RvY19ffSwKICAgICB7ImZsdXNoIiwgKGJpbmFyeWZ1bmMpUHlabGliX3VuZmx1c2gsIE1FVEhfVkFSQVJHUywKICAgICAgICAgICAgICAgZGVjb21wX2ZsdXNoX19kb2NfX30sCisjaWZkZWYgSEFWRV9aTElCX0NPUFkKICAgICB7ImNvcHkiLCAgKFB5Q0Z1bmN0aW9uKVB5WmxpYl91bmNvcHksIE1FVEhfTk9BUkdTLAogICAgICAgICAgICAgICBkZWNvbXBfY29weV9fZG9jX199LAorI2VuZGlmCiAgICAge05VTEwsIE5VTEx9CiB9OwogCmRpZmYgLS1naXQgYS9PYmplY3RzL2Fic3RyYWN0LmMgYi9PYmplY3RzL2Fic3RyYWN0LmMKaW5kZXggOTFiYThjMi4uZGU4ODQ1NyAxMDA2NDQKLS0tIGEvT2JqZWN0cy9hYnN0cmFjdC5jCisrKyBiL09iamVjdHMvYWJzdHJhY3QuYwpAQCAtOSw5ICs5LDkgQEAKIC8qIFNob3J0aGFuZHMgdG8gcmV0dXJuIGNlcnRhaW4gZXJyb3JzICovCiAKIHN0YXRpYyBQeU9iamVjdCAqCi10eXBlX2Vycm9yKGNvbnN0IGNoYXIgKm1zZykKK3R5cGVfZXJyb3IoY29uc3QgY2hhciAqbXNnLCBQeU9iamVjdCAqb2JqKQogewotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIG1zZyk7CisJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgbXNnLCBvYmotPm9iX3R5cGUtPnRwX25hbWUpOwogCXJldHVybiBOVUxMOwogfQogCkBAIC0xMjUsMTAgKzEyNSwxMSBAQAogCQkJcmV0dXJuIFB5U2VxdWVuY2VfR2V0SXRlbShvLCBrZXlfdmFsdWUpOwogCQl9CiAJCWVsc2UgaWYgKG8tPm9iX3R5cGUtPnRwX2FzX3NlcXVlbmNlLT5zcV9pdGVtKQotCQkJcmV0dXJuIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgaW50ZWdlciIpOworCQkJcmV0dXJuIHR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgIgorCQkJCQkgICJiZSBpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwogCX0KIAotCXJldHVybiB0eXBlX2Vycm9yKCJ1bnN1YnNjcmlwdGFibGUgb2JqZWN0Iik7CisJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyB1bnN1YnNjcmlwdGFibGUiLCBvKTsKIH0KIAogaW50CkBAIC0xNTMsMTIgKzE1NCwxMyBAQAogCQkJcmV0dXJuIFB5U2VxdWVuY2VfU2V0SXRlbShvLCBrZXlfdmFsdWUsIHZhbHVlKTsKIAkJfQogCQllbHNlIGlmIChvLT5vYl90eXBlLT50cF9hc19zZXF1ZW5jZS0+c3FfYXNzX2l0ZW0pIHsKLQkJCXR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgaW50ZWdlciIpOworCQkJdHlwZV9lcnJvcigic2VxdWVuY2UgaW5kZXggbXVzdCBiZSAiCisJCQkJICAgImludGVnZXIsIG5vdCAnJS4yMDBzJyIsIGtleSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CiAKLQl0eXBlX2Vycm9yKCJvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiKTsKKwl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQiLCBvKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTE4NCwxMiArMTg2LDEzIEBACiAJCQlyZXR1cm4gUHlTZXF1ZW5jZV9EZWxJdGVtKG8sIGtleV92YWx1ZSk7CiAJCX0KIAkJZWxzZSBpZiAoby0+b2JfdHlwZS0+dHBfYXNfc2VxdWVuY2UtPnNxX2Fzc19pdGVtKSB7Ci0JCQl0eXBlX2Vycm9yKCJzZXF1ZW5jZSBpbmRleCBtdXN0IGJlIGludGVnZXIiKTsKKwkJCXR5cGVfZXJyb3IoInNlcXVlbmNlIGluZGV4IG11c3QgYmUgIgorCQkJCSAgICJpbnRlZ2VyLCBub3QgJyUuMjAwcyciLCBrZXkpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQogCi0JdHlwZV9lcnJvcigib2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBkZWxldGlvbiIpOworCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gZGVsZXRpb24iLCBvKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTQwOCw3ICs0MTEsOCBAQAogYmlub3BfdHlwZV9lcnJvcihQeU9iamVjdCAqdiwgUHlPYmplY3QgKncsIGNvbnN0IGNoYXIgKm9wX25hbWUpCiB7CiAJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLQkJICAgICAidW5zdXBwb3J0ZWQgb3BlcmFuZCB0eXBlKHMpIGZvciAlczogJyVzJyBhbmQgJyVzJyIsCisJCSAgICAgInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgJS4xMDBzOiAiCisJCSAgICAgIiclLjEwMHMnIGFuZCAnJS4xMDBzJyIsCiAJCSAgICAgb3BfbmFtZSwKIAkJICAgICB2LT5vYl90eXBlLT50cF9uYW1lLAogCQkgICAgIHctPm9iX3R5cGUtPnRwX25hbWUpOwpAQCAtNTE0LDE0ICs1MTgsMTQgQEAKIAkJUHlFcnJfRm9ybWF0KAogCQkJUHlFeGNfVHlwZUVycm9yLAogCQkJInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgKiogb3IgcG93KCk6ICIKLQkJCSInJXMnIGFuZCAnJXMnIiwKKwkJCSInJS4xMDBzJyBhbmQgJyUuMTAwcyciLAogCQkJdi0+b2JfdHlwZS0+dHBfbmFtZSwKIAkJCXctPm9iX3R5cGUtPnRwX25hbWUpOwogCWVsc2UKIAkJUHlFcnJfRm9ybWF0KAogCQkJUHlFeGNfVHlwZUVycm9yLAogCQkJInVuc3VwcG9ydGVkIG9wZXJhbmQgdHlwZShzKSBmb3IgcG93KCk6ICIKLQkJCSInJXMnLCAnJXMnLCAnJXMnIiwKKwkJCSInJS4xMDBzJywgJyUuMTAwcycsICclLjEwMHMnIiwKIAkJCXYtPm9iX3R5cGUtPnRwX25hbWUsCiAJCQl3LT5vYl90eXBlLT50cF9uYW1lLAogCQkJei0+b2JfdHlwZS0+dHBfbmFtZSk7CkBAIC01NjgsOCArNTcyLDggQEAKIAkJCXJldHVybiBOVUxMOwogCX0KIAllbHNlIHsKLQkJcmV0dXJuIHR5cGVfZXJyb3IoCi0JCQkiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgbm9uLWludCIpOworCQlyZXR1cm4gdHlwZV9lcnJvcigiY2FuJ3QgbXVsdGlwbHkgc2VxdWVuY2UgYnkgIgorCQkJCSAgIm5vbi1pbnQgb2YgdHlwZSAnJS4yMDBzJyIsIG4pOwogCX0KIAlyZXR1cm4gKCpyZXBlYXRmdW5jKShzZXEsIGNvdW50KTsKIH0KQEAgLTc3Niw3ICs3ODAsNyBAQAogCWlmIChtICYmIG0tPm5iX25lZ2F0aXZlKQogCQlyZXR1cm4gKCptLT5uYl9uZWdhdGl2ZSkobyk7CiAKLQlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgLSIpOworCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciB1bmFyeSAtOiAnJS4yMDBzJyIsIG8pOwogfQogCiBQeU9iamVjdCAqCkBAIC03OTAsNyArNzk0LDcgQEAKIAlpZiAobSAmJiBtLT5uYl9wb3NpdGl2ZSkKIAkJcmV0dXJuICgqbS0+bmJfcG9zaXRpdmUpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5ICsiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgKzogJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtODA0LDcgKzgwOCw3IEBACiAJaWYgKG0gJiYgbS0+bmJfaW52ZXJ0KQogCQlyZXR1cm4gKCptLT5uYl9pbnZlcnQpKG8pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImJhZCBvcGVyYW5kIHR5cGUgZm9yIHVuYXJ5IH4iKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiYmFkIG9wZXJhbmQgdHlwZSBmb3IgdW5hcnkgfjogJyUuMjAwcyciLCBvKTsKIH0KIAogUHlPYmplY3QgKgpAQCAtODE4LDcgKzgyMiw3IEBACiAJaWYgKG0gJiYgbS0+bmJfYWJzb2x1dGUpCiAJCXJldHVybiBtLT5uYl9hYnNvbHV0ZShvKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKSIpOworCXJldHVybiB0eXBlX2Vycm9yKCJiYWQgb3BlcmFuZCB0eXBlIGZvciBhYnMoKTogJyUuMjAwcyciLCBvKTsKIH0KIAogLyogQWRkIGEgY2hlY2sgZm9yIGVtYmVkZGVkIE5VTEwtYnl0ZXMgaW4gdGhlIGFyZ3VtZW50LiAqLwpAQCAtODk4LDcgKzkwMiw4IEBACiAJaWYgKCFQeU9iamVjdF9Bc0NoYXJCdWZmZXIobywgJmJ1ZmZlciwgJmJ1ZmZlcl9sZW4pKQogCQlyZXR1cm4gaW50X2Zyb21fc3RyaW5nKChjaGFyKilidWZmZXIsIGJ1ZmZlcl9sZW4pOwogCi0JcmV0dXJuIHR5cGVfZXJyb3IoImludCgpIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiaW50KCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKKwkJCSAgIm51bWJlciwgbm90ICclLjIwMHMnIiwgbyk7CiB9CiAKIC8qIEFkZCBhIGNoZWNrIGZvciBlbWJlZGRlZCBOVUxMLWJ5dGVzIGluIHRoZSBhcmd1bWVudC4gKi8KQEAgLTk2MCw3ICs5NjUsOCBAQAogCWlmICghUHlPYmplY3RfQXNDaGFyQnVmZmVyKG8sICZidWZmZXIsICZidWZmZXJfbGVuKSkKIAkJcmV0dXJuIGxvbmdfZnJvbV9zdHJpbmcoYnVmZmVyLCBidWZmZXJfbGVuKTsKIAotCXJldHVybiB0eXBlX2Vycm9yKCJsb25nKCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhIG51bWJlciIpOworCXJldHVybiB0eXBlX2Vycm9yKCJsb25nKCkgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZyBvciBhICIKKwkJCSAgIm51bWJlciwgbm90ICclLjIwMHMnIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTEwMTQsNyArMTAyMCw3IEBACiAJaWYgKG0gJiYgbS0+c3FfbGVuZ3RoKQogCQlyZXR1cm4gbS0+c3FfbGVuZ3RoKHMpOwogCi0JdHlwZV9lcnJvcigibGVuKCkgb2YgdW5zaXplZCBvYmplY3QiKTsKKwl0eXBlX2Vycm9yKCJvYmplY3Qgb2YgdHlwZSAnJS4yMDBzJyBoYXMgbm8gbGVuKCkiLCBzKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTEwNDcsNyArMTA1Myw3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQlQeV9ERUNSRUYocmVzdWx0KTsKIAl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIm9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWQiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMDc2LDcgKzEwODIsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJUHlfREVDUkVGKHJlc3VsdCk7CiAJfQotCXJldHVybiB0eXBlX2Vycm9yKCJvYmplY3QgY2FuJ3QgYmUgcmVwZWF0ZWQiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTExMDAsNyArMTEwNiw3IEBACiAJCQlyZXR1cm4gcmVzdWx0OwogCQlQeV9ERUNSRUYocmVzdWx0KTsKIAl9Ci0JcmV0dXJuIHR5cGVfZXJyb3IoIm9iamVjdCBjYW4ndCBiZSBjb25jYXRlbmF0ZWQiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIGNvbmNhdGVuYXRlZCIsIHMpOwogfQogCiBQeU9iamVjdCAqCkBAIC0xMTI5LDcgKzExMzUsNyBAQAogCQkJcmV0dXJuIHJlc3VsdDsKIAkJUHlfREVDUkVGKHJlc3VsdCk7CiAJfQotCXJldHVybiB0eXBlX2Vycm9yKCJvYmplY3QgY2FuJ3QgYmUgcmVwZWF0ZWQiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGNhbid0IGJlIHJlcGVhdGVkIiwgbyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTExNTMsNyArMTE1OSw3IEBACiAJCXJldHVybiBtLT5zcV9pdGVtKHMsIGkpOwogCX0KIAotCXJldHVybiB0eXBlX2Vycm9yKCJ1bmluZGV4YWJsZSBvYmplY3QiKTsKKwlyZXR1cm4gdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGlzIHVuaW5kZXhhYmxlIiwgcyk7CiB9CiAKIFB5T2JqZWN0ICoKQEAgLTExODgsNyArMTE5NCw3IEBACiAJCXJldHVybiByZXM7CiAJfQogCi0JcmV0dXJuIHR5cGVfZXJyb3IoInVuc2xpY2VhYmxlIG9iamVjdCIpOworCXJldHVybiB0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgaXMgdW5zbGljZWFibGUiLCBzKTsKIH0KIAogaW50CkBAIC0xMjE0LDcgKzEyMjAsNyBAQAogCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgbyk7CiAJfQogCi0JdHlwZV9lcnJvcigib2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iik7CisJdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50Iiwgcyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMjQxLDcgKzEyNDcsNyBAQAogCQlyZXR1cm4gbS0+c3FfYXNzX2l0ZW0ocywgaSwgKFB5T2JqZWN0ICopTlVMTCk7CiAJfQogCi0JdHlwZV9lcnJvcigib2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIik7CisJdHlwZV9lcnJvcigiJyUuMjAwcycgb2JqZWN0IGRvZXNuJ3Qgc3VwcG9ydCBpdGVtIGRlbGV0aW9uIiwgcyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xMjgwLDcgKzEyODYsNyBAQAogCQlyZXR1cm4gcmVzOwogCX0KIAotCXR5cGVfZXJyb3IoIm9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgYXNzaWdubWVudCIpOworCXR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgYXNzaWdubWVudCIsIHMpOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTMwOSw3ICsxMzE1LDcgQEAKIAkJfQogCQlyZXR1cm4gbS0+c3FfYXNzX3NsaWNlKHMsIGkxLCBpMiwgKFB5T2JqZWN0ICopTlVMTCk7CiAJfQotCXR5cGVfZXJyb3IoIm9iamVjdCBkb2Vzbid0IHN1cHBvcnQgc2xpY2UgZGVsZXRpb24iKTsKKwl0eXBlX2Vycm9yKCInJS4yMDBzJyBvYmplY3QgZG9lc24ndCBzdXBwb3J0IHNsaWNlIGRlbGV0aW9uIiwgcyk7CiAJcmV0dXJuIC0xOwogfQogCkBAIC0xNDQwLDcgKzE0NDYsNyBAQAogIAlpdCA9IFB5T2JqZWN0X0dldEl0ZXIodik7CiAJaWYgKGl0ID09IE5VTEwpIHsKIAkJaWYgKFB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMoUHlFeGNfVHlwZUVycm9yKSkKLQkJCXJldHVybiB0eXBlX2Vycm9yKG0pOworCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgbSk7CiAJCXJldHVybiBOVUxMOwogCX0KIApAQCAtMTQ3MCw3ICsxNDc2LDcgQEAKIAogCWl0ID0gUHlPYmplY3RfR2V0SXRlcihzZXEpOwogCWlmIChpdCA9PSBOVUxMKSB7Ci0JCXR5cGVfZXJyb3IoIml0ZXJhYmxlIGFyZ3VtZW50IHJlcXVpcmVkIik7CisJCXR5cGVfZXJyb3IoImFyZ3VtZW50IG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGl0ZXJhYmxlIiwgc2VxKTsKIAkJcmV0dXJuIC0xOwogCX0KIApAQCAtMTYwMyw3ICsxNjA5LDcgQEAKIAlpZiAobSAmJiBtLT5tcF9sZW5ndGgpCiAJCXJldHVybiBtLT5tcF9sZW5ndGgobyk7CiAKLQl0eXBlX2Vycm9yKCJsZW4oKSBvZiB1bnNpemVkIG9iamVjdCIpOworCXR5cGVfZXJyb3IoIm9iamVjdCBvZiB0eXBlICclLjIwMHMnIGhhcyBubyBsZW4oKSIsIG8pOwogCXJldHVybiAtMTsKIH0KIApAQCAtMTcwMSw3ICsxNzA3LDcgQEAKIAkJCQkiTlVMTCByZXN1bHQgd2l0aG91dCBlcnJvciBpbiBQeU9iamVjdF9DYWxsIik7CiAJCXJldHVybiByZXN1bHQ7CiAJfQotCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJXMnIG9iamVjdCBpcyBub3QgY2FsbGFibGUiLAorCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGNhbGxhYmxlIiwKIAkJICAgICBmdW5jLT5vYl90eXBlLT50cF9uYW1lKTsKIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTE3OTAsNyArMTc5Niw3IEBACiAJfQogCiAJaWYgKCFQeUNhbGxhYmxlX0NoZWNrKGZ1bmMpKSB7Ci0JCXR5cGVfZXJyb3IoImNhbGwgb2Ygbm9uLWNhbGxhYmxlIGF0dHJpYnV0ZSIpOyAKKwkJdHlwZV9lcnJvcigiYXR0cmlidXRlIG9mIHR5cGUgJyUuMjAwcycgaXMgbm90IGNhbGxhYmxlIiwgZnVuYyk7IAogCQlnb3RvIGV4aXQ7CiAJfQogCkBAIC0xODI5LDcgKzE4MzUsNyBAQAogCX0KIAogCWlmICghUHlDYWxsYWJsZV9DaGVjayhmdW5jKSkgewotCQl0eXBlX2Vycm9yKCJjYWxsIG9mIG5vbi1jYWxsYWJsZSBhdHRyaWJ1dGUiKTsgCisJCXR5cGVfZXJyb3IoImF0dHJpYnV0ZSBvZiB0eXBlICclLjIwMHMnIGlzIG5vdCBjYWxsYWJsZSIsIGZ1bmMpOyAKIAkJZ290byBleGl0OwogCX0KIApAQCAtMjE3MCw5ICsyMTc2LDcgQEAKIAlpZiAoZiA9PSBOVUxMKSB7CiAJCWlmIChQeVNlcXVlbmNlX0NoZWNrKG8pKQogCQkJcmV0dXJuIFB5U2VxSXRlcl9OZXcobyk7Ci0JCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJIml0ZXJhdGlvbiBvdmVyIG5vbi1zZXF1ZW5jZSIpOwotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIHR5cGVfZXJyb3IoIiclLjIwMHMnIG9iamVjdCBpcyBub3QgaXRlcmFibGUiLCBvKTsKIAl9CiAJZWxzZSB7CiAJCVB5T2JqZWN0ICpyZXMgPSAoKmYpKG8pOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYyBiL09iamVjdHMvYnVmZmVyb2JqZWN0LmMKaW5kZXggZDI1OTdiOS4uM2EwZTNkNSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9idWZmZXJvYmplY3QuYworKysgYi9PYmplY3RzL2J1ZmZlcm9iamVjdC5jCkBAIC0xNSw4ICsxNSwxNiBAQAogfSBQeUJ1ZmZlck9iamVjdDsKIAogCitlbnVtIGJ1ZmZlcl90IHsKKyAgICBSRUFEX0JVRkZFUiwKKyAgICBXUklURV9CVUZGRVIsCisgICAgQ0hBUl9CVUZGRVIsCisgICAgQU5ZX0JVRkZFUiwKK307CisKIHN0YXRpYyBpbnQKLWdldF9idWYoUHlCdWZmZXJPYmplY3QgKnNlbGYsIHZvaWQgKipwdHIsIFB5X3NzaXplX3QgKnNpemUpCitnZXRfYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCB2b2lkICoqcHRyLCBQeV9zc2l6ZV90ICpzaXplLAorCWVudW0gYnVmZmVyX3QgYnVmZmVyX3R5cGUpCiB7CiAJaWYgKHNlbGYtPmJfYmFzZSA9PSBOVUxMKSB7CiAJCWFzc2VydCAocHRyICE9IE5VTEwpOwpAQCAtMjUsMTcgKzMzLDQzIEBACiAJfQogCWVsc2UgewogCQlQeV9zc2l6ZV90IGNvdW50LCBvZmZzZXQ7Ci0JCXJlYWRidWZmZXJwcm9jIHByb2M7CisJCXJlYWRidWZmZXJwcm9jIHByb2MgPSAwOwogCQlQeUJ1ZmZlclByb2NzICpicCA9IHNlbGYtPmJfYmFzZS0+b2JfdHlwZS0+dHBfYXNfYnVmZmVyOwogCQlpZiAoKCpicC0+YmZfZ2V0c2VnY291bnQpKHNlbGYtPmJfYmFzZSwgTlVMTCkgIT0gMSkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkic2luZ2xlLXNlZ21lbnQgYnVmZmVyIG9iamVjdCBleHBlY3RlZCIpOwogCQkJcmV0dXJuIDA7CiAJCX0KLQkJaWYgKHNlbGYtPmJfcmVhZG9ubHkpCi0JCQlwcm9jID0gYnAtPmJmX2dldHJlYWRidWZmZXI7Ci0JCWVsc2UKLQkJCXByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldHdyaXRlYnVmZmVyOworCQlpZiAoKGJ1ZmZlcl90eXBlID09IFJFQURfQlVGRkVSKSB8fAorCQkJKChidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSAmJiBzZWxmLT5iX3JlYWRvbmx5KSkKKwkJICAgIHByb2MgPSBicC0+YmZfZ2V0cmVhZGJ1ZmZlcjsKKwkJZWxzZSBpZiAoKGJ1ZmZlcl90eXBlID09IFdSSVRFX0JVRkZFUikgfHwKKwkJCShidWZmZXJfdHlwZSA9PSBBTllfQlVGRkVSKSkKKyAgICAJCSAgICBwcm9jID0gKHJlYWRidWZmZXJwcm9jKWJwLT5iZl9nZXR3cml0ZWJ1ZmZlcjsKKwkJZWxzZSBpZiAoYnVmZmVyX3R5cGUgPT0gQ0hBUl9CVUZGRVIpIHsKKwkJICAgIHByb2MgPSAocmVhZGJ1ZmZlcnByb2MpYnAtPmJmX2dldGNoYXJidWZmZXI7CisJCX0KKwkJaWYgKCFwcm9jKSB7CisJCSAgICBjaGFyICpidWZmZXJfdHlwZV9uYW1lOworCQkgICAgc3dpdGNoIChidWZmZXJfdHlwZSkgeworCQkJY2FzZSBSRUFEX0JVRkZFUjoKKwkJCSAgICBidWZmZXJfdHlwZV9uYW1lID0gInJlYWQiOworCQkJICAgIGJyZWFrOworCQkJY2FzZSBXUklURV9CVUZGRVI6CisJCQkgICAgYnVmZmVyX3R5cGVfbmFtZSA9ICJ3cml0ZSI7CisJCQkgICAgYnJlYWs7CisJCQljYXNlIENIQVJfQlVGRkVSOgorCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAiY2hhciI7CisJCQkgICAgYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJICAgIGJ1ZmZlcl90eXBlX25hbWUgPSAibm8iOworCQkJICAgIGJyZWFrOworCQkgICAgfQorCQkgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCSAgICAiJXMgYnVmZmVyIHR5cGUgbm90IGF2YWlsYWJsZSIsCisJCQkgICAgYnVmZmVyX3R5cGVfbmFtZSk7CisJCSAgICByZXR1cm4gMDsKKwkJfQogCQlpZiAoKGNvdW50ID0gKCpwcm9jKShzZWxmLT5iX2Jhc2UsIDAsIHB0cikpIDwgMCkKIAkJCXJldHVybiAwOwogCQkvKiBhcHBseSBjb25zdHJhaW50cyB0byB0aGUgc3RhcnQvZW5kICovCkBAIC0yMjQsMTUgKzI1OCwxNSBAQAogCVB5X3NzaXplX3QgbGVuX3NlbGYsIGxlbl9vdGhlciwgbWluX2xlbjsKIAlpbnQgY21wOwogCi0JaWYgKCFnZXRfYnVmKHNlbGYsICZwMSwgJmxlbl9zZWxmKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnAxLCAmbGVuX3NlbGYsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gLTE7Ci0JaWYgKCFnZXRfYnVmKG90aGVyLCAmcDIsICZsZW5fb3RoZXIpKQorCWlmICghZ2V0X2J1ZihvdGhlciwgJnAyLCAmbGVuX290aGVyLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCW1pbl9sZW4gPSAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gbGVuX3NlbGYgOiBsZW5fb3RoZXI7CiAJaWYgKG1pbl9sZW4gPiAwKSB7CiAJCWNtcCA9IG1lbWNtcChwMSwgcDIsIG1pbl9sZW4pOwogCQlpZiAoY21wICE9IDApCi0JCQlyZXR1cm4gY21wOworCQkJcmV0dXJuIGNtcCA8IDAgPyAtMSA6IDE7CiAJfQogCXJldHVybiAobGVuX3NlbGYgPCBsZW5fb3RoZXIpID8gLTEgOiAobGVuX3NlbGYgPiBsZW5fb3RoZXIpID8gMSA6IDA7CiB9CkBAIC0yODQsNyArMzE4LDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCXAgPSAodW5zaWduZWQgY2hhciAqKSBwdHI7CiAJbGVuID0gc2l6ZTsKQEAgLTMwMyw3ICszMzcsNyBAQAogewogCXZvaWQgKnB0cjsKIAlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gTlVMTDsKIAlyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNvbnN0IGNoYXIgKilwdHIsIHNpemUpOwogfQpAQCAtMzE1LDcgKzM0OSw3IEBACiB7CiAJdm9pZCAqcHRyOwogCVB5X3NzaXplX3Qgc2l6ZTsKLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQU5ZX0JVRkZFUikpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gc2l6ZTsKIH0KQEAgLTM0NCw3ICszNzgsNyBAQAogCQlyZXR1cm4gTlVMTDsKIAl9CiAKLSAJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIxLCAmc2l6ZSkpCisgCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQogIAkJcmV0dXJuIE5VTEw7CiAgCiAJLyogb3B0aW1pemUgc3BlY2lhbCBjYXNlICovCkBAIC0zODAsNyArNDE0LDcgQEAKIAogCWlmICggY291bnQgPCAwICkKIAkJY291bnQgPSAwOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIE5VTEw7CiAJb2IgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplICogY291bnQpOwogCWlmICggb2IgPT0gTlVMTCApCkBAIC00MDQsNyArNDM4LDcgQEAKIHsKIAl2b2lkICpwdHI7CiAJUHlfc3NpemVfdCBzaXplOwotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSkpCisJaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIE5VTEw7CiAJaWYgKCBpZHggPCAwIHx8IGlkeCA+PSBzaXplICkgewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImJ1ZmZlciBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKQEAgLTQxOCw3ICs0NTIsNyBAQAogewogCXZvaWQgKnB0cjsKIAlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gTlVMTDsKIAlpZiAoIGxlZnQgPCAwICkKIAkJbGVmdCA9IDA7CkBAIC00NDYsNyArNDgwLDcgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyMSwgJnNpemUsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoaWR4IDwgMCB8fCBpZHggPj0gc2l6ZSkgewpAQCAtNTEzLDcgKzU0Nyw3IEBACiAJCQkJInNpbmdsZS1zZWdtZW50IGJ1ZmZlciBvYmplY3QgZXhwZWN0ZWQiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0cjEsICZzaXplLCBBTllfQlVGRkVSKSkKIAkJcmV0dXJuIC0xOwogCWlmICggKGNvdW50ID0gKCpwYi0+YmZfZ2V0cmVhZGJ1ZmZlcikob3RoZXIsIDAsICZwdHIyKSkgPCAwICkKIAkJcmV0dXJuIC0xOwpAQCAtNTUyLDcgKzU4Niw3IEBACiAJCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgcHAsICZzaXplLCBSRUFEX0JVRkZFUikpCiAJCXJldHVybiAtMTsKIAlyZXR1cm4gc2l6ZTsKIH0KQEAgLTU2MCwxMiArNTk0LDIyIEBACiBzdGF0aWMgUHlfc3NpemVfdAogYnVmZmVyX2dldHdyaXRlYnVmKFB5QnVmZmVyT2JqZWN0ICpzZWxmLCBQeV9zc2l6ZV90IGlkeCwgdm9pZCAqKnBwKQogeworCVB5X3NzaXplX3Qgc2l6ZTsKKwogCWlmICggc2VsZi0+Yl9yZWFkb25seSApCiAJewogCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiYnVmZmVyIGlzIHJlYWQtb25seSIpOwogCQlyZXR1cm4gLTE7CiAJfQotCXJldHVybiBidWZmZXJfZ2V0cmVhZGJ1ZihzZWxmLCBpZHgsIHBwKTsKKworCWlmICggaWR4ICE9IDAgKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwKKwkJCQkiYWNjZXNzaW5nIG5vbi1leGlzdGVudCBidWZmZXIgc2VnbWVudCIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghZ2V0X2J1ZihzZWxmLCBwcCwgJnNpemUsIFdSSVRFX0JVRkZFUikpCisJCXJldHVybiAtMTsKKwlyZXR1cm4gc2l6ZTsKIH0KIAogc3RhdGljIFB5X3NzaXplX3QKQEAgLTU3Myw3ICs2MTcsNyBAQAogewogCXZvaWQgKnB0cjsKIAlQeV9zc2l6ZV90IHNpemU7Ci0JaWYgKCFnZXRfYnVmKHNlbGYsICZwdHIsICZzaXplKSkKKwlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUsIEFOWV9CVUZGRVIpKQogCQlyZXR1cm4gLTE7CiAJaWYgKGxlbnApCiAJCSpsZW5wID0gc2l6ZTsKQEAgLTU5MCwxMyArNjM0LDEyIEBACiAJCQkJImFjY2Vzc2luZyBub24tZXhpc3RlbnQgYnVmZmVyIHNlZ21lbnQiKTsKIAkJcmV0dXJuIC0xOwogCX0KLQlpZiAoIWdldF9idWYoc2VsZiwgJnB0ciwgJnNpemUpKQorCWlmICghZ2V0X2J1ZihzZWxmLCAmcHRyLCAmc2l6ZSwgQ0hBUl9CVUZGRVIpKQogCQlyZXR1cm4gLTE7CiAJKnBwID0gKGNvbnN0IGNoYXIgKilwdHI7CiAJcmV0dXJuIHNpemU7CiB9CiAKLQogc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIGJ1ZmZlcl9hc19zZXF1ZW5jZSA9IHsKIAkobGVuZnVuYylidWZmZXJfbGVuZ3RoLCAvKnNxX2xlbmd0aCovCiAJKGJpbmFyeWZ1bmMpYnVmZmVyX2NvbmNhdCwgLypzcV9jb25jYXQqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jZWxsb2JqZWN0LmMgYi9PYmplY3RzL2NlbGxvYmplY3QuYwppbmRleCBkYTQ4ZGVhLi42NWEyOWFhIDEwMDY0NAotLS0gYS9PYmplY3RzL2NlbGxvYmplY3QuYworKysgYi9PYmplY3RzL2NlbGxvYmplY3QuYwpAQCAtOCw2ICs4LDggQEAKIAlQeUNlbGxPYmplY3QgKm9wOwogCiAJb3AgPSAoUHlDZWxsT2JqZWN0ICopUHlPYmplY3RfR0NfTmV3KFB5Q2VsbE9iamVjdCwgJlB5Q2VsbF9UeXBlKTsKKwlpZiAob3AgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CiAJb3AtPm9iX3JlZiA9IG9iajsKIAlQeV9YSU5DUkVGKG9iaik7CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvY2xhc3NvYmplY3QuYyBiL09iamVjdHMvY2xhc3NvYmplY3QuYwppbmRleCBmYThhM2E5Li4yZDgwMDczIDEwMDY0NAotLS0gYS9PYmplY3RzL2NsYXNzb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9jbGFzc29iamVjdC5jCkBAIC05MzMsMTEgKzkzMyw5IEBACiAJUHlfREVDUkVGKGZ1bmMpOwogCWlmIChyZXMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwotCWlmIChQeUludF9DaGVjayhyZXMpKSB7Ci0JCW91dGNvbWUgPSBQeUludF9Bc0xvbmcocmVzKTsKLQkJaWYgKG91dGNvbWUgPT0gLTEpCi0JCQlvdXRjb21lID0gLTI7Ci0JfQorCWlmIChQeUludF9DaGVjayhyZXMpIHx8IFB5TG9uZ19DaGVjayhyZXMpKQorCQkvKiBUaGlzIGFscmVhZHkgY29udmVydHMgYSAtMSByZXN1bHQgdG8gLTIuICovCisJCW91dGNvbWUgPSByZXMtPm9iX3R5cGUtPnRwX2hhc2gocmVzKTsKIAllbHNlIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKIAkJCQkiX19oYXNoX18oKSBzaG91bGQgcmV0dXJuIGFuIGludCIpOwpAQCAtMTM2NywxMCArMTM2NSwxMyBAQAogCQkgKiBhcmd1bWVudCAqLwogCQlyZXN1bHQgPSBnZW5lcmljX2JpbmFyeV9vcCh2MSwgdywgb3BuYW1lKTsKIAl9IGVsc2UgeworCQlpZiAoUHlfRW50ZXJSZWN1cnNpdmVDYWxsKCIgYWZ0ZXIgY29lcmNpb24iKSkKKwkJICAgIHJldHVybiBOVUxMOwogCQlpZiAoc3dhcHBlZCkKIAkJCXJlc3VsdCA9ICh0aGlzZnVuYykodywgdjEpOwogCQllbHNlCiAJCQlyZXN1bHQgPSAodGhpc2Z1bmMpKHYxLCB3KTsKKwkJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CiAJfQogCVB5X0RFQ1JFRihjb2VyY2VkKTsKIAlyZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb2Rlb2JqZWN0LmMgYi9PYmplY3RzL2NvZGVvYmplY3QuYwppbmRleCBhOWJjYjAxLi44OTg3MWQ2IDEwMDY0NAotLS0gYS9PYmplY3RzL2NvZGVvYmplY3QuYworKysgYi9PYmplY3RzL2NvZGVvYmplY3QuYwpAQCAtNTU2LDYgKzU1Niw3IEBACiAgICAgICAgICAgIHRoZSBsaW5lIGluY3JlbWVudHMgaGVyZSwgdHJlYXRpbmcgdGhlbSBhcyBieXRlCiAgICAgICAgICAgIGluY3JlbWVudHMgZ2V0cyBjb25mdXNpbmcsIHRvIHNheSB0aGUgbGVhc3QuICovCiAKKyAgICAgICAgYm91bmRzLT5hcF9sb3dlciA9IDA7CiAgICAgICAgIHdoaWxlIChzaXplID4gMCkgewogICAgICAgICAgICAgICAgIGlmIChhZGRyICsgKnAgPiBsYXN0aSkKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwppbmRleCBjNmUzMzQzLi5hYThmYzgxIDEwMDY0NAotLS0gYS9PYmplY3RzL2NvbXBsZXhvYmplY3QuYworKysgYi9PYmplY3RzL2NvbXBsZXhvYmplY3QuYwpAQCAtMjc0LDE2ICsyNzQsMTYgQEAKIHsKIAljaGFyIGZvcm1hdFszMl07CiAJaWYgKHYtPmN2YWwucmVhbCA9PSAwLikgewotCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgMzIsICIlJS4laWciLCBwcmVjaXNpb24pOwotCQlQeU9TX2FzY2lpX2Zvcm1hdGQoYnVmLCBidWZzeiwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOwotCQlzdHJuY2F0KGJ1ZiwgImoiLCBidWZzeik7CisJCVB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlLiVpZyIsIHByZWNpc2lvbik7CisJCVB5T1NfYXNjaWlfZm9ybWF0ZChidWYsIGJ1ZnN6IC0gMSwgZm9ybWF0LCB2LT5jdmFsLmltYWcpOworCQlzdHJuY2F0KGJ1ZiwgImoiLCAxKTsKIAl9IGVsc2UgewogCQljaGFyIHJlWzY0XSwgaW1bNjRdOwogCQkvKiBGb3JtYXQgaW1hZ2luYXJ5IHBhcnQgd2l0aCBzaWduLCByZWFsIHBhcnQgd2l0aG91dCAqLwotCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgMzIsICIlJS4laWciLCBwcmVjaXNpb24pOwotCQlQeU9TX2FzY2lpX2Zvcm1hdGQocmUsIDY0LCBmb3JtYXQsIHYtPmN2YWwucmVhbCk7Ci0JCVB5T1Nfc25wcmludGYoZm9ybWF0LCAzMiwgIiUlKy4laWciLCBwcmVjaXNpb24pOwotCQlQeU9TX2FzY2lpX2Zvcm1hdGQoaW0sIDY0LCBmb3JtYXQsIHYtPmN2YWwuaW1hZyk7CisJCVB5T1Nfc25wcmludGYoZm9ybWF0LCBzaXplb2YoZm9ybWF0KSwgIiUlLiVpZyIsIHByZWNpc2lvbik7CisJCVB5T1NfYXNjaWlfZm9ybWF0ZChyZSwgc2l6ZW9mKHJlKSwgZm9ybWF0LCB2LT5jdmFsLnJlYWwpOworCQlQeU9TX3NucHJpbnRmKGZvcm1hdCwgc2l6ZW9mKGZvcm1hdCksICIlJSsuJWlnIiwgcHJlY2lzaW9uKTsKKwkJUHlPU19hc2NpaV9mb3JtYXRkKGltLCBzaXplb2YoaW0pLCBmb3JtYXQsIHYtPmN2YWwuaW1hZyk7CiAJCVB5T1Nfc25wcmludGYoYnVmLCBidWZzeiwgIiglcyVzaikiLCByZSwgaW0pOwogCX0KIH0KZGlmZiAtLWdpdCBhL09iamVjdHMvZGVzY3JvYmplY3QuYyBiL09iamVjdHMvZGVzY3JvYmplY3QuYwppbmRleCA2MDZlZjA1Li45MTRiNmQzIDEwMDY0NAotLS0gYS9PYmplY3RzL2Rlc2Nyb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9kZXNjcm9iamVjdC5jCkBAIC04OTIsMTAgKzg5MiwxMiBAQAogc3RhdGljIHZvaWQKIHdyYXBwZXJfZGVhbGxvYyh3cmFwcGVyb2JqZWN0ICp3cCkKIHsKLQlfUHlPYmplY3RfR0NfVU5UUkFDSyh3cCk7CisJUHlPYmplY3RfR0NfVW5UcmFjayh3cCk7CisJUHlfVFJBU0hDQU5fU0FGRV9CRUdJTih3cCkKIAlQeV9YREVDUkVGKHdwLT5kZXNjcik7CiAJUHlfWERFQ1JFRih3cC0+c2VsZik7CiAJUHlPYmplY3RfR0NfRGVsKHdwKTsKKwlQeV9UUkFTSENBTl9TQUZFX0VORCh3cCkKIH0KIAogc3RhdGljIGludApAQCAtMTE3NCw3ICsxMTc2LDYgQEAKIHByb3BlcnR5X2luaXQoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykKIHsKIAlQeU9iamVjdCAqZ2V0ID0gTlVMTCwgKnNldCA9IE5VTEwsICpkZWwgPSBOVUxMLCAqZG9jID0gTlVMTDsKLQlQeU9iamVjdCAqZ2V0X2RvYyA9IE5VTEw7CiAJc3RhdGljIGNoYXIgKmt3bGlzdFtdID0geyJmZ2V0IiwgImZzZXQiLCAiZmRlbCIsICJkb2MiLCAwfTsKIAlwcm9wZXJ0eW9iamVjdCAqZ3MgPSAocHJvcGVydHlvYmplY3QgKilzZWxmOwogCkBAIC0xMTg5LDIwICsxMTkwLDIyIEBACiAJaWYgKGRlbCA9PSBQeV9Ob25lKQogCQlkZWwgPSBOVUxMOwogCi0JLyogaWYgbm8gZG9jc3RyaW5nIGdpdmVuIGFuZCB0aGUgZ2V0dGVyIGhhcyBvbmUsIHVzZSB0aGF0IG9uZSAqLwotCWlmICgoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpICYmIGdldCAhPSBOVUxMICYmIAotCSAgICBQeU9iamVjdF9IYXNBdHRyU3RyaW5nKGdldCwgIl9fZG9jX18iKSkgewotCQlpZiAoIShnZXRfZG9jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnZXQsICJfX2RvY19fIikpKQotCQkJcmV0dXJuIC0xOwotCQlQeV9ERUNSRUYoZ2V0X2RvYyk7IC8qIGl0IGlzIElOQ1JFRidkIGFnYWluIGJlbG93ICovCi0JCWRvYyA9IGdldF9kb2M7Ci0JfQotCiAJUHlfWElOQ1JFRihnZXQpOwogCVB5X1hJTkNSRUYoc2V0KTsKIAlQeV9YSU5DUkVGKGRlbCk7CiAJUHlfWElOQ1JFRihkb2MpOwogCisJLyogaWYgbm8gZG9jc3RyaW5nIGdpdmVuIGFuZCB0aGUgZ2V0dGVyIGhhcyBvbmUsIHVzZSB0aGF0IG9uZSAqLworCWlmICgoZG9jID09IE5VTEwgfHwgZG9jID09IFB5X05vbmUpICYmIGdldCAhPSBOVUxMKSB7CisJCVB5T2JqZWN0ICpnZXRfZG9jID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhnZXQsICJfX2RvY19fIik7CisJCWlmIChnZXRfZG9jICE9IE5VTEwpIHsKKwkJCVB5X1hERUNSRUYoZG9jKTsKKwkJCWRvYyA9IGdldF9kb2M7ICAvKiBnZXRfZG9jIGFscmVhZHkgSU5DUkVGJ2QgYnkgR2V0QXR0ciAqLworCQl9IGVsc2UgeworCQkJUHlFcnJfQ2xlYXIoKTsKKwkJfQorCX0KKwogCWdzLT5wcm9wX2dldCA9IGdldDsKIAlncy0+cHJvcF9zZXQgPSBzZXQ7CiAJZ3MtPnByb3BfZGVsID0gZGVsOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0bm90ZXMudHh0IGIvT2JqZWN0cy9kaWN0bm90ZXMudHh0CmluZGV4IGNiNDZjYjEuLmIwZTU5YTcgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZGljdG5vdGVzLnR4dAorKysgYi9PYmplY3RzL2RpY3Rub3Rlcy50eHQKQEAgLTI0Myw3ICsyNDMsNyBAQAogQ2FjaGluZyBMb29rdXBzCiAtLS0tLS0tLS0tLS0tLS0KIFRoZSBpZGVhIGlzIHRvIGV4cGxvaXQga2V5IGFjY2VzcyBwYXR0ZXJucyBieSBhbnRpY2lwYXRpbmcgZnV0dXJlIGxvb2t1cHMKLWJhc2VkIG9mIHByZXZpb3VzIGxvb2t1cHMuCitiYXNlZCBvbiBwcmV2aW91cyBsb29rdXBzLgogCiBUaGUgc2ltcGxlc3QgaW5jYXJuYXRpb24gaXMgdG8gc2F2ZSB0aGUgbW9zdCByZWNlbnRseSBhY2Nlc3NlZCBlbnRyeS4KIFRoaXMgZ2l2ZXMgb3B0aW1hbCBwZXJmb3JtYW5jZSBmb3IgdXNlIGNhc2VzIHdoZXJlIGV2ZXJ5IGdldCBpcyBmb2xsb3dlZApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9kaWN0b2JqZWN0LmMgYi9PYmplY3RzL2RpY3RvYmplY3QuYwppbmRleCBmOWU0NWZkLi5mM2I2YjdmIDEwMDY0NAotLS0gYS9PYmplY3RzL2RpY3RvYmplY3QuYworKysgYi9PYmplY3RzL2RpY3RvYmplY3QuYwpAQCAtNTMyLDcgKzUzMiw3IEBACiAvKiBOb3RlIHRoYXQsIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIFB5RGljdF9HZXRJdGVtKCkgc3VwcHJlc3NlcyBhbGwgZXJyb3JzCiAgKiB0aGF0IG1heSBvY2N1ciAob3JpZ2luYWxseSBkaWN0cyBzdXBwb3J0ZWQgb25seSBzdHJpbmcga2V5cywgYW5kIGV4Y2VwdGlvbnMKICAqIHdlcmVuJ3QgcG9zc2libGUpLiAgU28sIHdoaWxlIHRoZSBvcmlnaW5hbCBpbnRlbnQgd2FzIHRoYXQgYSBOVUxMIHJldHVybgotICogbWVhbnQgdGhlIGtleSB3YXNuJ3QgcHJlc2VudCwgaXQgcmVhbGl0eSBpdCBjYW4gbWVhbiB0aGF0LCBvciB0aGF0IGFuIGVycm9yCisgKiBtZWFudCB0aGUga2V5IHdhc24ndCBwcmVzZW50LCBpbiByZWFsaXR5IGl0IGNhbiBtZWFuIHRoYXQsIG9yIHRoYXQgYW4gZXJyb3IKICAqIChzdXBwcmVzc2VkKSBvY2N1cnJlZCB3aGlsZSBjb21wdXRpbmcgdGhlIGtleSdzIGhhc2gsIG9yIHRoYXQgc29tZSBlcnJvcgogICogKHN1cHByZXNzZWQpIG9jY3VycmVkIHdoZW4gY29tcGFyaW5nIGtleXMgaW4gdGhlIGRpY3QncyBpbnRlcm5hbCBwcm9iZQogICogc2VxdWVuY2UuICBBIG5hc3R5IGV4YW1wbGUgb2YgdGhlIGxhdHRlciBpcyB3aGVuIGEgUHl0aG9uLWNvZGVkIGNvbXBhcmlzb24KQEAgLTU2MSw3ICs1NjEsNyBAQAogCS8qIFdlIGNhbiBhcnJpdmUgaGVyZSB3aXRoIGEgTlVMTCB0c3RhdGUgZHVyaW5nIGluaXRpYWxpemF0aW9uOgogCSAgIHRyeSBydW5uaW5nICJweXRob24gLVdpIiBmb3IgYW4gZXhhbXBsZSByZWxhdGVkIHRvIHN0cmluZwogCSAgIGludGVybmluZy4gIExldCdzIGp1c3QgaG9wZSB0aGF0IG5vIGV4Y2VwdGlvbiBvY2N1cnMgdGhlbi4uLiAqLwotCXRzdGF0ZSA9IFB5VGhyZWFkU3RhdGVfR0VUKCk7CisJdHN0YXRlID0gX1B5VGhyZWFkU3RhdGVfQ3VycmVudDsKIAlpZiAodHN0YXRlICE9IE5VTEwgJiYgdHN0YXRlLT5jdXJleGNfdHlwZSAhPSBOVUxMKSB7CiAJCS8qIHByZXNlcnZlIHRoZSBleGlzdGluZyBleGNlcHRpb24gKi8KIAkJUHlPYmplY3QgKmVycl90eXBlLCAqZXJyX3ZhbHVlLCAqZXJyX3RiOwpAQCAtNTk5LDYgKzU5OSw4IEBACiAJCVB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwogCQlyZXR1cm4gLTE7CiAJfQorCWFzc2VydChrZXkpOworCWFzc2VydCh2YWx1ZSk7CiAJbXAgPSAoZGljdG9iamVjdCAqKW9wOwogCWlmIChQeVN0cmluZ19DaGVja0V4YWN0KGtleSkpIHsKIAkJaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKilrZXkpLT5vYl9zaGFzaDsKQEAgLTY0Nyw2ICs2NDksNyBAQAogCQlQeUVycl9CYWRJbnRlcm5hbENhbGwoKTsKIAkJcmV0dXJuIC0xOwogCX0KKwlhc3NlcnQoa2V5KTsKIAlpZiAoIVB5U3RyaW5nX0NoZWNrRXhhY3Qoa2V5KSB8fAogCSAgICAoaGFzaCA9ICgoUHlTdHJpbmdPYmplY3QgKikga2V5KS0+b2Jfc2hhc2gpID09IC0xKSB7CiAJCWhhc2ggPSBQeU9iamVjdF9IYXNoKGtleSk7CmRpZmYgLS1naXQgYS9PYmplY3RzL2V4Y2VwdGlvbnMuYyBiL09iamVjdHMvZXhjZXB0aW9ucy5jCmluZGV4IDM2OTM2NWIuLmJlOTYyN2MgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZXhjZXB0aW9ucy5jCisrKyBiL09iamVjdHMvZXhjZXB0aW9ucy5jCkBAIC0xOTY3LDYgKzE5NjcsMjkgQEAKICAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoYmRpY3QsICMgVFlQRSwgUHlFeGNfICMjIFRZUEUpKSBcCiAgICAgICAgIFB5X0ZhdGFsRXJyb3IoIk1vZHVsZSBkaWN0aW9uYXJ5IGluc2VydGlvbiBwcm9ibGVtLiIpOwogCisjaWYgZGVmaW5lZCBfTVNDX1ZFUiAmJiBfTVNDX1ZFUiA+PSAxNDAwICYmIGRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykKKy8qIGNydCB2YXJpYWJsZSBjaGVja2luZyBpbiBWaXN1YWxTdHVkaW8gLk5FVCAyMDA1ICovCisjaW5jbHVkZSA8Y3J0ZGJnLmg+CisKK3N0YXRpYyBpbnQJcHJldkNydFJlcG9ydE1vZGU7CitzdGF0aWMgX2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIJcHJldkNydEhhbmRsZXI7CisKKy8qIEludmFsaWQgcGFyYW1ldGVyIGhhbmRsZXIuICBTZXRzIGEgVmFsdWVFcnJvciBleGNlcHRpb24gKi8KK3N0YXRpYyB2b2lkCitJbnZhbGlkUGFyYW1ldGVySGFuZGxlcigKKyAgICBjb25zdCB3Y2hhcl90ICogZXhwcmVzc2lvbiwKKyAgICBjb25zdCB3Y2hhcl90ICogZnVuY3Rpb24sCisgICAgY29uc3Qgd2NoYXJfdCAqIGZpbGUsCisgICAgdW5zaWduZWQgaW50IGxpbmUsCisgICAgdWludHB0cl90IHBSZXNlcnZlZCkKK3sKKyAgICAvKiBEbyBub3RoaW5nLCBhbGxvdyBleGVjdXRpb24gdG8gY29udGludWUuICBVc3VhbGx5IHRoaXMKKyAgICAgKiBtZWFucyB0aGF0IHRoZSBDUlQgd2lsbCBzZXQgZXJybm8gdG8gRUlOVkFMCisgICAgICovCit9CisjZW5kaWYKKworCiBQeU1PRElOSVRfRlVOQwogX1B5RXhjX0luaXQodm9pZCkKIHsKQEAgLTIwOTYsNiArMjExOSwxMyBAQAogICAgICAgICBQeV9GYXRhbEVycm9yKCJDYW5ub3QgcHJlLWFsbG9jYXRlIE1lbW9yeUVycm9yIGluc3RhbmNlXG4iKTsKIAogICAgIFB5X0RFQ1JFRihibHRpbm1vZCk7CisKKyNpZiBkZWZpbmVkIF9NU0NfVkVSICYmIF9NU0NfVkVSID49IDE0MDAgJiYgZGVmaW5lZChfX1NURENfU0VDVVJFX0xJQl9fKQorICAgIC8qIFNldCBDUlQgYXJndW1lbnQgZXJyb3IgaGFuZGxlciAqLworICAgIHByZXZDcnRIYW5kbGVyID0gX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKEludmFsaWRQYXJhbWV0ZXJIYW5kbGVyKTsKKyAgICAvKiB0dXJuIG9mZiBhc3NlcnRpb25zIGluIGRlYnVnIG1vZGUgKi8KKyAgICBwcmV2Q3J0UmVwb3J0TW9kZSA9IF9DcnRTZXRSZXBvcnRNb2RlKF9DUlRfQVNTRVJULCAwKTsKKyNlbmRpZgogfQogCiB2b2lkCkBAIC0yMTAzLDQgKzIxMzMsOSBAQAogewogICAgIFB5X1hERUNSRUYoUHlFeGNfTWVtb3J5RXJyb3JJbnN0KTsKICAgICBQeUV4Y19NZW1vcnlFcnJvckluc3QgPSBOVUxMOworI2lmIGRlZmluZWQgX01TQ19WRVIgJiYgX01TQ19WRVIgPj0gMTQwMCAmJiBkZWZpbmVkKF9fU1REQ19TRUNVUkVfTElCX18pCisgICAgLyogcmVzZXQgQ1JUIGVycm9yIGhhbmRsaW5nICovCisgICAgX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKHByZXZDcnRIYW5kbGVyKTsKKyAgICBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgcHJldkNydFJlcG9ydE1vZGUpOworI2VuZGlmCiB9CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZpbGVvYmplY3QuYyBiL09iamVjdHMvZmlsZW9iamVjdC5jCmluZGV4IGE0YTQzZWQuLmZiOGE1NDIgMTAwNjQ0Ci0tLSBhL09iamVjdHMvZmlsZW9iamVjdC5jCisrKyBiL09iamVjdHMvZmlsZW9iamVjdC5jCkBAIC00LDkgKzQsOSBAQAogI2luY2x1ZGUgIlB5dGhvbi5oIgogI2luY2x1ZGUgInN0cnVjdG1lbWJlci5oIgogCi0jaWZuZGVmIERPTlRfSEFWRV9TWVNfVFlQRVNfSAorI2lmZGVmIEhBVkVfU1lTX1RZUEVTX0gKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNlbmRpZiAvKiBET05UX0hBVkVfU1lTX1RZUEVTX0ggKi8KKyNlbmRpZiAvKiBIQVZFX1NZU19UWVBFU19IICovCiAKICNpZmRlZiBNU19XSU5ET1dTCiAjZGVmaW5lIGZpbGVubyBfZmlsZW5vCkBAIC0xMDMsNiArMTAzLDcgQEAKIGZpbGxfZmlsZV9maWVsZHMoUHlGaWxlT2JqZWN0ICpmLCBGSUxFICpmcCwgUHlPYmplY3QgKm5hbWUsIGNoYXIgKm1vZGUsCiAJCSBpbnQgKCpjbG9zZSkoRklMRSAqKSkKIHsKKwlhc3NlcnQobmFtZSAhPSBOVUxMKTsKIAlhc3NlcnQoZiAhPSBOVUxMKTsKIAlhc3NlcnQoUHlGaWxlX0NoZWNrKGYpKTsKIAlhc3NlcnQoZi0+Zl9mcCA9PSBOVUxMKTsKQEAgLTExMSw3ICsxMTIsNyBAQAogCVB5X0RFQ1JFRihmLT5mX21vZGUpOwogCVB5X0RFQ1JFRihmLT5mX2VuY29kaW5nKTsKIAotICAgICAgICBQeV9JTkNSRUYgKG5hbWUpOworICAgICAgICBQeV9JTkNSRUYobmFtZSk7CiAgICAgICAgIGYtPmZfbmFtZSA9IG5hbWU7CiAKIAlmLT5mX21vZGUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG1vZGUpOwpAQCAtMTI2LDcgKzEyNyw3IEBACiAJUHlfSU5DUkVGKFB5X05vbmUpOwogCWYtPmZfZW5jb2RpbmcgPSBQeV9Ob25lOwogCi0JaWYgKGYtPmZfbmFtZSA9PSBOVUxMIHx8IGYtPmZfbW9kZSA9PSBOVUxMKQorCWlmIChmLT5mX21vZGUgPT0gTlVMTCkKIAkJcmV0dXJuIE5VTEw7CiAJZi0+Zl9mcCA9IGZwOwogICAgICAgICBmID0gZGlyY2hlY2soZik7CkBAIC0yNDEsMTMgKzI0MiwxNSBAQAogCX0KIAogCWlmIChmLT5mX2ZwID09IE5VTEwpIHsKLSNpZmRlZiBfTVNDX1ZFUgorI2lmIGRlZmluZWQgIF9NU0NfVkVSICYmIChfTVNDX1ZFUiA8IDE0MDAgfHwgIWRlZmluZWQoX19TVERDX1NFQ1VSRV9MSUJfXykpCiAJCS8qIE1TVkMgNiAoTWljcm9zb2Z0KSBsZWF2ZXMgZXJybm8gYXQgMCBmb3IgYmFkIG1vZGUgc3RyaW5ncywKIAkJICogYWNyb3NzIGFsbCBXaW5kb3dzIGZsYXZvcnMuICBXaGVuIGl0IHNldHMgRUlOVkFMIHZhcmllcwogCQkgKiBhY3Jvc3MgV2luZG93cyBmbGF2b3JzLCB0aGUgZXhhY3QgY29uZGl0aW9ucyBhcmVuJ3QKIAkJICogZG9jdW1lbnRlZCwgYW5kIHRoZSBhbnN3ZXIgbGllcyBpbiB0aGUgT1MncyBpbXBsZW1lbnRhdGlvbgogCQkgKiBvZiBXaW4zMidzIENyZWF0ZUZpbGUgZnVuY3Rpb24gKHdob3NlIHNvdXJjZSBpcyBzZWNyZXQpLgogCQkgKiBTZWVtcyB0aGUgYmVzdCB3ZSBjYW4gZG8gaXMgbWFwIEVJTlZBTCB0byBFTk9FTlQuCisJCSAqIFN0YXJ0aW5nIHdpdGggVmlzdWFsIFN0dWRpbyAuTkVUIDIwMDUsIEVJTlZBTCBpcyBjb3JyZWN0bHkKKwkJICogc2V0IGJ5IG91ciBDUlQgZXJyb3IgaGFuZGxlciAoc2V0IGluIGV4Y2VwdGlvbnMuYy4pCiAJCSAqLwogCQlpZiAoZXJybm8gPT0gMCkJLyogYmFkIG1vZGUgc3RyaW5nICovCiAJCQllcnJubyA9IEVJTlZBTDsKQEAgLTI3Niw3ICsyNzksOSBAQAogCVB5RmlsZU9iamVjdCAqZiA9IChQeUZpbGVPYmplY3QgKilQeUZpbGVfVHlwZS50cF9uZXcoJlB5RmlsZV9UeXBlLAogCQkJCQkJCSAgICAgTlVMTCwgTlVMTCk7CiAJaWYgKGYgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIFB5T2JqZWN0ICpvX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKG5hbWUpOworCQlQeU9iamVjdCAqb19uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZyhuYW1lKTsKKwkJaWYgKG9fbmFtZSA9PSBOVUxMKQorCQkJcmV0dXJuIE5VTEw7CiAJCWlmIChmaWxsX2ZpbGVfZmllbGRzKGYsIGZwLCBvX25hbWUsIG1vZGUsIGNsb3NlKSA9PSBOVUxMKSB7CiAJCQlQeV9ERUNSRUYoZik7CiAJCQlmID0gTlVMTDsKQEAgLTQwOSwxMSArNDE0LDExIEBACiAJaWYgKFB5VW5pY29kZV9DaGVjayhmLT5mX25hbWUpKSB7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQogCQlQeU9iamVjdCAqcmV0ID0gTlVMTDsKLQkJUHlPYmplY3QgKm5hbWU7Ci0JCW5hbWUgPSBQeVVuaWNvZGVfQXNVbmljb2RlRXNjYXBlU3RyaW5nKGYtPmZfbmFtZSk7CisJCVB5T2JqZWN0ICpuYW1lID0gUHlVbmljb2RlX0FzVW5pY29kZUVzY2FwZVN0cmluZyhmLT5mX25hbWUpOworCQljb25zdCBjaGFyICpuYW1lX3N0ciA9IG5hbWUgPyBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSA6ICI/IjsKIAkJcmV0ID0gUHlTdHJpbmdfRnJvbUZvcm1hdCgiPCVzIGZpbGUgdSclcycsIG1vZGUgJyVzJyBhdCAlcD4iLAogCQkJCSAgIGYtPmZfZnAgPT0gTlVMTCA/ICJjbG9zZWQiIDogIm9wZW4iLAotCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpLAorCQkJCSAgIG5hbWVfc3RyLAogCQkJCSAgIFB5U3RyaW5nX0FzU3RyaW5nKGYtPmZfbW9kZSksCiAJCQkJICAgZik7CiAJCVB5X1hERUNSRUYobmFtZSk7CmRpZmYgLS1naXQgYS9PYmplY3RzL2ZyYW1lb2JqZWN0LmMgYi9PYmplY3RzL2ZyYW1lb2JqZWN0LmMKaW5kZXggZmNiNWU0ZS4uM2EwNzNiNiAxMDA2NDQKLS0tIGEvT2JqZWN0cy9mcmFtZW9iamVjdC5jCisrKyBiL09iamVjdHMvZnJhbWVvYmplY3QuYwpAQCAtMjAsNyArMjAsNiBAQAogCXsiZl9idWlsdGlucyIsCVRfT0JKRUNULAlPRkYoZl9idWlsdGlucyksUk99LAogCXsiZl9nbG9iYWxzIiwJVF9PQkpFQ1QsCU9GRihmX2dsb2JhbHMpLAlST30sCiAJeyJmX2xhc3RpIiwJVF9JTlQsCQlPRkYoZl9sYXN0aSksCVJPfSwKLQl7ImZfcmVzdHJpY3RlZCIsVF9JTlQsCQlPRkYoZl9yZXN0cmljdGVkKSxST30sCiAJeyJmX2V4Y190eXBlIiwJVF9PQkpFQ1QsCU9GRihmX2V4Y190eXBlKX0sCiAJeyJmX2V4Y192YWx1ZSIsCVRfT0JKRUNULAlPRkYoZl9leGNfdmFsdWUpfSwKIAl7ImZfZXhjX3RyYWNlYmFjayIsIFRfT0JKRUNULAlPRkYoZl9leGNfdHJhY2ViYWNrKX0sCkBAIC0zNDEsMTEgKzM0MCwxOCBAQAogCXJldHVybiAwOwogfQogCitzdGF0aWMgUHlPYmplY3QgKgorZnJhbWVfZ2V0cmVzdHJpY3RlZChQeUZyYW1lT2JqZWN0ICpmLCB2b2lkICpjbG9zdXJlKQoreworCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoUHlGcmFtZV9Jc1Jlc3RyaWN0ZWQoZikpOworfQorCiBzdGF0aWMgUHlHZXRTZXREZWYgZnJhbWVfZ2V0c2V0bGlzdFtdID0gewogCXsiZl9sb2NhbHMiLAkoZ2V0dGVyKWZyYW1lX2dldGxvY2FscywgTlVMTCwgTlVMTH0sCiAJeyJmX2xpbmVubyIsCShnZXR0ZXIpZnJhbWVfZ2V0bGluZW5vLAogCQkJKHNldHRlcilmcmFtZV9zZXRsaW5lbm8sIE5VTEx9LAogCXsiZl90cmFjZSIsCShnZXR0ZXIpZnJhbWVfZ2V0dHJhY2UsIChzZXR0ZXIpZnJhbWVfc2V0dHJhY2UsIE5VTEx9LAorCXsiZl9yZXN0cmljdGVkIiwoZ2V0dGVyKWZyYW1lX2dldHJlc3RyaWN0ZWQsTlVMTCwgTlVMTH0sCiAJezB9CiB9OwogCkBAIC00MjUsNyArNDMxLDcgQEAKIAlQeV9DTEVBUihmLT5mX2V4Y190cmFjZWJhY2spOwogCiAgICAgICAgIGNvID0gZi0+Zl9jb2RlOwotICAgICAgICBpZiAoY28gIT0gTlVMTCAmJiBjby0+Y29fem9tYmllZnJhbWUgPT0gTlVMTCkKKyAgICAgICAgaWYgKGNvLT5jb196b21iaWVmcmFtZSA9PSBOVUxMKQogICAgICAgICAgICAgICAgIGNvLT5jb196b21iaWVmcmFtZSA9IGY7CiAJZWxzZSBpZiAobnVtZnJlZSA8IE1BWEZSRUVMSVNUKSB7CiAJCSsrbnVtZnJlZTsKQEAgLTQzNSw3ICs0NDEsNyBAQAogCWVsc2UgCiAJCVB5T2JqZWN0X0dDX0RlbChmKTsKIAotICAgICAgICBQeV9YREVDUkVGKGNvKTsKKyAgICAgICAgUHlfREVDUkVGKGNvKTsKIAlQeV9UUkFTSENBTl9TQUZFX0VORChmKQogfQogCkBAIC02MzYsNiArNjQyLDcgQEAKIAkJZi0+Zl90cmFjZSA9IE5VTEw7CiAgICAgICAgICAgICAgICAgZi0+Zl9leGNfdHlwZSA9IGYtPmZfZXhjX3ZhbHVlID0gZi0+Zl9leGNfdHJhY2ViYWNrID0gTlVMTDsKIAl9CisJZi0+Zl9zdGFja3RvcCA9IGYtPmZfdmFsdWVzdGFjazsKIAlmLT5mX2J1aWx0aW5zID0gYnVpbHRpbnM7CiAJUHlfWElOQ1JFRihiYWNrKTsKIAlmLT5mX2JhY2sgPSBiYWNrOwpAQCAtNjY0LDEwICs2NzEsOCBAQAogCiAJZi0+Zl9sYXN0aSA9IC0xOwogCWYtPmZfbGluZW5vID0gY29kZS0+Y29fZmlyc3RsaW5lbm87Ci0JZi0+Zl9yZXN0cmljdGVkID0gKGJ1aWx0aW5zICE9IHRzdGF0ZS0+aW50ZXJwLT5idWlsdGlucyk7CiAJZi0+Zl9pYmxvY2sgPSAwOwogCi0gICAgICAgIGYtPmZfc3RhY2t0b3AgPSBmLT5mX3ZhbHVlc3RhY2s7CiAJX1B5T2JqZWN0X0dDX1RSQUNLKGYpOwogCXJldHVybiBmOwogfQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9mdW5jb2JqZWN0LmMgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwppbmRleCA1OWNiNTE5Li4xYmE3NGM1IDEwMDY0NAotLS0gYS9PYmplY3RzL2Z1bmNvYmplY3QuYworKysgYi9PYmplY3RzL2Z1bmNvYmplY3QuYwpAQCAtMTA5LDggKzEwOSw4IEBACiAJfQogCWlmIChkZWZhdWx0cyA9PSBQeV9Ob25lKQogCQlkZWZhdWx0cyA9IE5VTEw7Ci0JZWxzZSBpZiAoUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKLQkJUHlfWElOQ1JFRihkZWZhdWx0cyk7CisJZWxzZSBpZiAoZGVmYXVsdHMgJiYgUHlUdXBsZV9DaGVjayhkZWZhdWx0cykpIHsKKwkJUHlfSU5DUkVGKGRlZmF1bHRzKTsKIAl9CiAJZWxzZSB7CiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19TeXN0ZW1FcnJvciwgIm5vbi10dXBsZSBkZWZhdWx0IGFyZ3MiKTsKQEAgLTE0MSw3ICsxNDEsNyBAQAogCWlmIChjbG9zdXJlID09IFB5X05vbmUpCiAJCWNsb3N1cmUgPSBOVUxMOwogCWVsc2UgaWYgKFB5VHVwbGVfQ2hlY2soY2xvc3VyZSkpIHsKLQkJUHlfWElOQ1JFRihjbG9zdXJlKTsKKwkJUHlfSU5DUkVGKGNsb3N1cmUpOwogCX0KIAllbHNlIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX1N5c3RlbUVycm9yLCAKZGlmZiAtLWdpdCBhL09iamVjdHMvbGlzdG9iamVjdC5jIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKaW5kZXggZTEyODQ3My4uZWEwM2EyYSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9saXN0b2JqZWN0LmMKKysrIGIvT2JqZWN0cy9saXN0b2JqZWN0LmMKQEAgLTEwOCw4ICsxMDgsMTAgQEAKIAkJb3AtPm9iX2l0ZW0gPSBOVUxMOwogCWVsc2UgewogCQlvcC0+b2JfaXRlbSA9IChQeU9iamVjdCAqKikgUHlNZW1fTUFMTE9DKG5ieXRlcyk7Ci0JCWlmIChvcC0+b2JfaXRlbSA9PSBOVUxMKQorCQlpZiAob3AtPm9iX2l0ZW0gPT0gTlVMTCkgeworCQkJUHlfREVDUkVGKG9wKTsKIAkJCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOworCQl9CiAJCW1lbXNldChvcC0+b2JfaXRlbSwgMCwgbmJ5dGVzKTsKIAl9CiAJb3AtPm9iX3NpemUgPSBzaXplOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9saXN0c29ydC50eHQgYi9PYmplY3RzL2xpc3Rzb3J0LnR4dAppbmRleCA2OGU5MThkLi45MjI2OTg0IDEwMDY0NAotLS0gYS9PYmplY3RzL2xpc3Rzb3J0LnR4dAorKysgYi9PYmplY3RzL2xpc3Rzb3J0LnR4dApAQCAtNDk0LDcgKzQ5NCw3IEBACiAgICA0NjctNDc0LCBBdXN0aW4sIFRleGFzLCAyNS0yNyBKYW51YXJ5IDE5OTMuCiAKIGFuZCBpdCBwcm9iYWJseSBkYXRlcyBiYWNrIHRvIGFuIGVhcmxpZXIgcGFwZXIgYnkgQmVudGxleSBhbmQgWWFvLiAgVGhlCi1NY0lsb3J5IHBhcGVyIGluIHBhcnRpY3VsYXIgaGFzIGdvb2QgYW5hbHlzaXMgb2YgYSBtZXJnZXNvcnQgdGhhdCdzCitNY0lscm95IHBhcGVyIGluIHBhcnRpY3VsYXIgaGFzIGdvb2QgYW5hbHlzaXMgb2YgYSBtZXJnZXNvcnQgdGhhdCdzCiBwcm9iYWJseSBzdHJvbmdseSByZWxhdGVkIHRvIHRoaXMgb25lIGluIGl0cyBnYWxsb3Bpbmcgc3RyYXRlZ3kuCiAKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy9sb25nb2JqZWN0LmMgYi9PYmplY3RzL2xvbmdvYmplY3QuYwppbmRleCA0NTE2NmZlLi45ZDM2ODVlIDEwMDY0NAotLS0gYS9PYmplY3RzL2xvbmdvYmplY3QuYworKysgYi9PYmplY3RzL2xvbmdvYmplY3QuYwpAQCAtMTIwMyw3ICsxMjAzLDcgQEAKIAlyZWdpc3RlciBQeUxvbmdPYmplY3QgKmEgPSAoUHlMb25nT2JqZWN0ICopYWE7CiAJUHlTdHJpbmdPYmplY3QgKnN0cjsKIAlQeV9zc2l6ZV90IGk7Ci0JY29uc3QgUHlfc3NpemVfdCBzaXplX2EgPSBBQlMoYS0+b2Jfc2l6ZSk7CisJUHlfc3NpemVfdCBzaXplX2E7CiAJY2hhciAqcDsKIAlpbnQgYml0czsKIAljaGFyIHNpZ24gPSAnXDAnOwpAQCAtMTIxMyw2ICsxMjEzLDcgQEAKIAkJcmV0dXJuIE5VTEw7CiAJfQogCWFzc2VydChiYXNlID49IDIgJiYgYmFzZSA8PSAzNik7CisJc2l6ZV9hID0gQUJTKGEtPm9iX3NpemUpOwogCiAJLyogQ29tcHV0ZSBhIHJvdWdoIHVwcGVyIGJvdW5kIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgKi8KIAlpID0gYmFzZTsKQEAgLTMxMzMsOSArMzEzNCw4IEBACiAJCTogTUFYKHNpemVfYSwgc2l6ZV9iKTsKIAl6ID0gX1B5TG9uZ19OZXcoc2l6ZV96KTsKIAlpZiAoeiA9PSBOVUxMKSB7Ci0JCVB5X1hERUNSRUYoYSk7Ci0JCVB5X1hERUNSRUYoYik7Ci0JCVB5X1hERUNSRUYoeik7CisJCVB5X0RFQ1JFRihhKTsKKwkJUHlfREVDUkVGKGIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAKZGlmZiAtLWdpdCBhL09iamVjdHMvb2JqZWN0LmMgYi9PYmplY3RzL29iamVjdC5jCmluZGV4IDBhZjc5ODkuLmZmMTM1NzQgMTAwNjQ0Ci0tLSBhL09iamVjdHMvb2JqZWN0LmMKKysrIGIvT2JqZWN0cy9vYmplY3QuYwpAQCAtMTA2Nyw3ICsxMDY3LDggQEAKIAkJcmV0dXJuIF9QeV9IYXNoUG9pbnRlcih2KTsgLyogVXNlIGFkZHJlc3MgYXMgaGFzaCB2YWx1ZSAqLwogCX0KIAkvKiBJZiB0aGVyZSdzIGEgY21wIGJ1dCBubyBoYXNoIGRlZmluZWQsIHRoZSBvYmplY3QgY2FuJ3QgYmUgaGFzaGVkICovCi0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOworCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGU6ICclLjIwMHMnIiwKKwkJICAgICB2LT5vYl90eXBlLT50cF9uYW1lKTsKIAlyZXR1cm4gLTE7CiB9CiAKQEAgLTExMzIsOCArMTEzMyw5IEBACiAJCWVsc2UKICNlbmRpZgogCQl7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCQkiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmciKTsKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkJICAgICAiYXR0cmlidXRlIG5hbWUgbXVzdCBiZSBzdHJpbmcsIG5vdCAnJS4yMDBzJyIsCisJCQkJICAgICBuYW1lLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJCXJldHVybiBOVUxMOwogCQl9CiAJfQpAQCAtMTE3OCw4ICsxMTgwLDkgQEAKIAkJZWxzZQogI2VuZGlmCiAJCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKwkJCQkgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJfQpAQCAtMTI3NCw4ICsxMjc3LDkgQEAKIAkJZWxzZQogI2VuZGlmCiAJCXsKLQkJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0JCQkJCSJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZyIpOworCQkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCQkgICAgICJhdHRyaWJ1dGUgbmFtZSBtdXN0IGJlIHN0cmluZywgbm90ICclLjIwMHMnIiwKKwkJCQkgICAgIG5hbWUtPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9CkBAIC0xMzk1LDggKzEzOTksOSBAQAogCQllbHNlCiAjZW5kaWYKIAkJewotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkJImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nIik7CisJCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJCSAgICAgImF0dHJpYnV0ZSBuYW1lIG11c3QgYmUgc3RyaW5nLCBub3QgJyUuMjAwcyciLAorCQkJCSAgICAgbmFtZS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCQlyZXR1cm4gLTE7CiAJCX0KIAl9CkBAIC0xNDQ1LDcgKzE0NTAsNyBAQAogCiAJaWYgKGRlc2NyID09IE5VTEwpIHsKIAkJUHlFcnJfRm9ybWF0KFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJICAgICAiJyUuNTBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS40MDBzJyIsCisJCQkgICAgICInJS4xMDBzJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJS4yMDBzJyIsCiAJCQkgICAgIHRwLT50cF9uYW1lLCBQeVN0cmluZ19BU19TVFJJTkcobmFtZSkpOwogCQlnb3RvIGRvbmU7CiAJfQpAQCAtMTc2MCw4ICsxNzY1LDkgQEAKIAogCWFzc2VydChyZXN1bHQpOwogCWlmICghUHlMaXN0X0NoZWNrKHJlc3VsdCkpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCSJFeHBlY3RlZCBrZXlzKCkgdG8gYmUgYSBsaXN0LiIpOworCQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAorCQkJIkV4cGVjdGVkIGtleXMoKSB0byBiZSBhIGxpc3QsIG5vdCAnJS4yMDBzJyIsCisJCQlyZXN1bHQtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlnb3RvIGVycm9yOwogCX0KIAlpZiAoUHlMaXN0X1NvcnQocmVzdWx0KSAhPSAwKQpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zZXRvYmplY3QuYyBiL09iamVjdHMvc2V0b2JqZWN0LmMKaW5kZXggOTE2ODJhMi4uNTVhMmI4NSAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zZXRvYmplY3QuYworKysgYi9PYmplY3RzL3NldG9iamVjdC5jCkBAIC02Miw3ICs2Miw3IEBACiAJcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwogCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwogCXJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbWFzayA9IHNvLT5tYXNrOworCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7CiAJc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwogCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKIAlyZWdpc3RlciBpbnQgY21wOwpAQCAtMTQwLDcgKzE0MCw3IEBACiAJcmVnaXN0ZXIgUHlfc3NpemVfdCBpOwogCXJlZ2lzdGVyIHNpemVfdCBwZXJ0dXJiOwogCXJlZ2lzdGVyIHNldGVudHJ5ICpmcmVlc2xvdDsKLQlyZWdpc3RlciB1bnNpZ25lZCBpbnQgbWFzayA9IHNvLT5tYXNrOworCXJlZ2lzdGVyIHNpemVfdCBtYXNrID0gc28tPm1hc2s7CiAJc2V0ZW50cnkgKnRhYmxlID0gc28tPnRhYmxlOwogCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKIApAQCAtMjIxLDExICsyMjEsMTEgQEAKIGFjdHVhbGx5IGJlIHNtYWxsZXIgdGhhbiB0aGUgb2xkIG9uZS4KICovCiBzdGF0aWMgaW50Ci1zZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICpzbywgaW50IG1pbnVzZWQpCitzZXRfdGFibGVfcmVzaXplKFB5U2V0T2JqZWN0ICpzbywgUHlfc3NpemVfdCBtaW51c2VkKQogewotCWludCBuZXdzaXplOworCVB5X3NzaXplX3QgbmV3c2l6ZTsKIAlzZXRlbnRyeSAqb2xkdGFibGUsICpuZXd0YWJsZSwgKmVudHJ5OwotCWludCBpOworCVB5X3NzaXplX3QgaTsKIAlpbnQgaXNfb2xkdGFibGVfbWFsbG9jZWQ7CiAJc2V0ZW50cnkgc21hbGxfY29weVtQeVNldF9NSU5TSVpFXTsKIApAQCAtMzE0LDcgKzMxNCw3IEBACiBzdGF0aWMgaW50CiBzZXRfYWRkX2VudHJ5KHJlZ2lzdGVyIFB5U2V0T2JqZWN0ICpzbywgc2V0ZW50cnkgKmVudHJ5KQogewotCXJlZ2lzdGVyIGludCBuX3VzZWQ7CisJcmVnaXN0ZXIgUHlfc3NpemVfdCBuX3VzZWQ7CiAKIAlhc3NlcnQoc28tPmZpbGwgPD0gc28tPm1hc2spOyAgLyogYXQgbGVhc3Qgb25lIGVtcHR5IHNsb3QgKi8KIAluX3VzZWQgPSBzby0+dXNlZDsKQEAgLTMzMCw3ICszMzAsNyBAQAogc2V0X2FkZF9rZXkocmVnaXN0ZXIgUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqa2V5KQogewogCXJlZ2lzdGVyIGxvbmcgaGFzaDsKLQlyZWdpc3RlciBpbnQgbl91c2VkOworCXJlZ2lzdGVyIFB5X3NzaXplX3Qgbl91c2VkOwogCiAJaWYgKCFQeVN0cmluZ19DaGVja0V4YWN0KGtleSkgfHwKIAkgICAgKGhhc2ggPSAoKFB5U3RyaW5nT2JqZWN0ICopIGtleSktPm9iX3NoYXNoKSA9PSAtMSkgewpAQCAtNDAzLDEwICs0MDMsMTAgQEAKIHsKIAlzZXRlbnRyeSAqZW50cnksICp0YWJsZTsKIAlpbnQgdGFibGVfaXNfbWFsbG9jZWQ7Ci0JaW50IGZpbGw7CisJUHlfc3NpemVfdCBmaWxsOwogCXNldGVudHJ5IHNtYWxsX2NvcHlbUHlTZXRfTUlOU0laRV07CiAjaWZkZWYgUHlfREVCVUcKLQlpbnQgaSwgbjsKKwlQeV9zc2l6ZV90IGksIG47CiAJYXNzZXJ0IChQeUFueVNldF9DaGVjayhzbykpOwogCiAJbiA9IHNvLT5tYXNrICsgMTsKQEAgLTQ2NSw3ICs0NjUsNyBAQAogLyoKICAqIEl0ZXJhdGUgb3ZlciBhIHNldCB0YWJsZS4gIFVzZSBsaWtlIHNvOgogICoKLSAqICAgICBpbnQgcG9zOworICogICAgIFB5X3NzaXplX3QgcG9zOwogICogICAgIHNldGVudHJ5ICplbnRyeTsKICAqICAgICBwb3MgPSAwOyAgICMgaW1wb3J0YW50ISAgcG9zIHNob3VsZCBub3Qgb3RoZXJ3aXNlIGJlIGNoYW5nZWQgYnkgeW91CiAgKiAgICAgd2hpbGUgKHNldF9uZXh0KHlvdXJzZXQsICZwb3MsICZlbnRyeSkpIHsKQEAgLTQ3OSw3ICs0NzksNyBAQAogc2V0X25leHQoUHlTZXRPYmplY3QgKnNvLCBQeV9zc2l6ZV90ICpwb3NfcHRyLCBzZXRlbnRyeSAqKmVudHJ5X3B0cikKIHsKIAlQeV9zc2l6ZV90IGk7Ci0JaW50IG1hc2s7CisJUHlfc3NpemVfdCBtYXNrOwogCXJlZ2lzdGVyIHNldGVudHJ5ICp0YWJsZTsKIAogCWFzc2VydCAoUHlBbnlTZXRfQ2hlY2soc28pKTsKQEAgLTUwMSw3ICs1MDEsNyBAQAogc2V0X2RlYWxsb2MoUHlTZXRPYmplY3QgKnNvKQogewogCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKLQlpbnQgZmlsbCA9IHNvLT5maWxsOworCVB5X3NzaXplX3QgZmlsbCA9IHNvLT5maWxsOwogCVB5T2JqZWN0X0dDX1VuVHJhY2soc28pOwogCVB5X1RSQVNIQ0FOX1NBRkVfQkVHSU4oc28pCiAJaWYgKHNvLT53ZWFrcmVmbGlzdCAhPSBOVUxMKQpAQCAtNTcwLDcgKzU3MCw3IEBACiBzZXRfbWVyZ2UoUHlTZXRPYmplY3QgKnNvLCBQeU9iamVjdCAqb3RoZXJzZXQpCiB7CiAJUHlTZXRPYmplY3QgKm90aGVyOwotCXJlZ2lzdGVyIGludCBpOworCXJlZ2lzdGVyIFB5X3NzaXplX3QgaTsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAKIAlhc3NlcnQgKFB5QW55U2V0X0NoZWNrKHNvKSk7CkBAIC02MzcsNyArNjM3LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRfcG9wKFB5U2V0T2JqZWN0ICpzbykKIHsKLQlyZWdpc3RlciBpbnQgaSA9IDA7CisJcmVnaXN0ZXIgUHlfc3NpemVfdCBpID0gMDsKIAlyZWdpc3RlciBzZXRlbnRyeSAqZW50cnk7CiAJUHlPYmplY3QgKmtleTsKIApAQCAtNjU1LDcgKzY1NSw3IEBACiAJICovCiAJZW50cnkgPSAmc28tPnRhYmxlWzBdOwogCWlmIChlbnRyeS0+a2V5ID09IE5VTEwgfHwgZW50cnktPmtleSA9PSBkdW1teSkgewotCQlpID0gKGludCllbnRyeS0+aGFzaDsKKwkJaSA9IGVudHJ5LT5oYXNoOwogCQkvKiBUaGUgaGFzaCBmaWVsZCBtYXkgYmUgYSByZWFsIGhhc2ggdmFsdWUsIG9yIGl0IG1heSBiZSBhCiAJCSAqIGxlZ2l0IHNlYXJjaCBmaW5nZXIsIG9yIGl0IG1heSBiZSBhIG9uY2UtbGVnaXQgc2VhcmNoCiAJCSAqIGZpbmdlciB0aGF0J3Mgb3V0IG9mIGJvdW5kcyBub3cgYmVjYXVzZSBpdCB3cmFwcGVkIGFyb3VuZApAQCAtNzMwLDkgKzczMCw5IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAJUHlPYmplY3RfSEVBRAogCVB5U2V0T2JqZWN0ICpzaV9zZXQ7IC8qIFNldCB0byBOVUxMIHdoZW4gaXRlcmF0b3IgaXMgZXhoYXVzdGVkICovCi0JaW50IHNpX3VzZWQ7Ci0JaW50IHNpX3BvczsKLQlsb25nIGxlbjsKKwlQeV9zc2l6ZV90IHNpX3VzZWQ7CisJUHlfc3NpemVfdCBzaV9wb3M7CisJUHlfc3NpemVfdCBsZW47CiB9IHNldGl0ZXJvYmplY3Q7CiAKIHN0YXRpYyB2b2lkCkBAIC03NDUsNyArNzQ1LDcgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBzZXRpdGVyX2xlbihzZXRpdGVyb2JqZWN0ICpzaSkKIHsKLQlsb25nIGxlbiA9IDA7CisJUHlfc3NpemVfdCBsZW4gPSAwOwogCWlmIChzaS0+c2lfc2V0ICE9IE5VTEwgJiYgc2ktPnNpX3VzZWQgPT0gc2ktPnNpX3NldC0+dXNlZCkKIAkJbGVuID0gc2ktPmxlbjsKIAlyZXR1cm4gUHlJbnRfRnJvbUxvbmcobGVuKTsKQEAgLTc2MSw3ICs3NjEsNyBAQAogc3RhdGljIFB5T2JqZWN0ICpzZXRpdGVyX2l0ZXJuZXh0KHNldGl0ZXJvYmplY3QgKnNpKQogewogCVB5T2JqZWN0ICprZXk7Ci0JcmVnaXN0ZXIgaW50IGksIG1hc2s7CisJcmVnaXN0ZXIgUHlfc3NpemVfdCBpLCBtYXNrOwogCXJlZ2lzdGVyIHNldGVudHJ5ICplbnRyeTsKIAlQeVNldE9iamVjdCAqc28gPSBzaS0+c2lfc2V0OwogCkBAIC0xMDA3LDcgKzEwMDcsNyBAQAogc3RhdGljIHZvaWQKIHNldF9zd2FwX2JvZGllcyhQeVNldE9iamVjdCAqYSwgUHlTZXRPYmplY3QgKmIpCiB7Ci0JaW50IHQ7CisJUHlfc3NpemVfdCB0OwogCXNldGVudHJ5ICp1OwogCXNldGVudHJ5ICooKmYpKFB5U2V0T2JqZWN0ICpzbywgUHlPYmplY3QgKmtleSwgbG9uZyBoYXNoKTsKIAlzZXRlbnRyeSB0YWJbUHlTZXRfTUlOU0laRV07CkBAIC0xMzgwLDEyICsxMzgwLDEyIEBACiAJd2hpbGUgKHNldF9uZXh0KG90aGVyc2V0LCAmcG9zLCAmZW50cnkpKSB7CiAJCWludCBydiA9IHNldF9kaXNjYXJkX2VudHJ5KHNvLCBlbnRyeSk7CiAJCWlmIChydiA9PSAtMSkgewotCQkJUHlfWERFQ1JFRihvdGhlcnNldCk7CisJCQlQeV9ERUNSRUYob3RoZXJzZXQpOwogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAkJaWYgKHJ2ID09IERJU0NBUkRfTk9URk9VTkQpIHsKIAkJCWlmIChzZXRfYWRkX2VudHJ5KHNvLCBlbnRyeSkgPT0gLTEpIHsKLQkJCQlQeV9YREVDUkVGKG90aGVyc2V0KTsKKwkJCQlQeV9ERUNSRUYob3RoZXJzZXQpOwogCQkJCXJldHVybiBOVUxMOwogCQkJfQogCQl9CkBAIC0xNzk1LDcgKzE3OTUsNyBAQAogUHlEb2NfU1RSVkFSKHNldF9kb2MsCiAic2V0KGl0ZXJhYmxlKSAtLT4gc2V0IG9iamVjdFxuXAogXG5cCi1CdWlsZCBhbiB1bm9yZGVyZWQgY29sbGVjdGlvbi4iKTsKK0J1aWxkIGFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIG9mIHVuaXF1ZSBlbGVtZW50cy4iKTsKIAogUHlUeXBlT2JqZWN0IFB5U2V0X1R5cGUgPSB7CiAJUHlPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSkKQEAgLTE4ODksNyArMTg4OSw3IEBACiBQeURvY19TVFJWQVIoZnJvemVuc2V0X2RvYywKICJmcm96ZW5zZXQoaXRlcmFibGUpIC0tPiBmcm96ZW5zZXQgb2JqZWN0XG5cCiBcblwKLUJ1aWxkIGFuIGltbXV0YWJsZSB1bm9yZGVyZWQgY29sbGVjdGlvbi4iKTsKK0J1aWxkIGFuIGltbXV0YWJsZSB1bm9yZGVyZWQgY29sbGVjdGlvbiBvZiB1bmlxdWUgZWxlbWVudHMuIik7CiAKIFB5VHlwZU9iamVjdCBQeUZyb3plblNldF9UeXBlID0gewogCVB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCkBAIC0yMDYxLDcgKzIwNjEsNyBAQAogc3RhdGljIFB5T2JqZWN0ICoKIHRlc3RfY19hcGkoUHlTZXRPYmplY3QgKnNvKQogewotCWludCBjb3VudDsKKwlQeV9zc2l6ZV90IGNvdW50OwogCWNoYXIgKnM7CiAJUHlfc3NpemVfdCBpOwogCVB5T2JqZWN0ICplbGVtLCAqZHVwLCAqdCwgKmYsICpkdXAyOwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYyBiL09iamVjdHMvc3RyaW5nb2JqZWN0LmMKaW5kZXggNmE3NjBhMi4uMDgxOWM5OCAxMDA2NDQKLS0tIGEvT2JqZWN0cy9zdHJpbmdvYmplY3QuYworKysgYi9PYmplY3RzL3N0cmluZ29iamVjdC5jCkBAIC0xNDkwLDcgKzE0OTAsNiBAQAogCQlqID0gaStwb3M7CiAJCVNQTElUX0FERChzLCBpLCBqKTsKIAkJaSA9IGogKyBuOwotCQkKIAl9CiAjZWxzZQogCWkgPSBqID0gMDsKQEAgLTE1ODYsNyArMTU4NSw3IEBACiAJCXJldHVybiBOVUxMOwogCiAJaSA9IGogPSBsZW4tMTsKLQkKKwogCXdoaWxlIChtYXhzcGxpdC0tID4gMCkgewogCQlSU0tJUF9TUEFDRShzLCBpKTsKIAkJaWYgKGk8MCkgYnJlYWs7CkBAIC0xNzg2LDcgKzE3ODUsNyBAQAogCQkJc3ogKz0gc2VwbGVuOwogCQlpZiAoc3ogPCBvbGRfc3ogfHwgc3ogPiBQWV9TU0laRV9UX01BWCkgewogCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0JCQkJImpvaW4oKSBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CisJCQkJImpvaW4oKSByZXN1bHQgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOwogCQkJUHlfREVDUkVGKHNlcSk7CiAJCQlyZXR1cm4gTlVMTDsKIAkJfQpAQCAtMjQ2MiwxMSArMjQ2MSwxMSBAQAogfQogCiBQeV9MT0NBTF9JTkxJTkUoUHlfc3NpemVfdCkKLWNvdW50Y2hhcihjaGFyICp0YXJnZXQsIGludCB0YXJnZXRfbGVuLCBjaGFyIGMsIFB5X3NzaXplX3QgbWF4Y291bnQpCitjb3VudGNoYXIoY29uc3QgY2hhciAqdGFyZ2V0LCBpbnQgdGFyZ2V0X2xlbiwgY2hhciBjLCBQeV9zc2l6ZV90IG1heGNvdW50KQogewogCVB5X3NzaXplX3QgY291bnQ9MDsKLQljaGFyICpzdGFydD10YXJnZXQ7Ci0JY2hhciAqZW5kPXRhcmdldCt0YXJnZXRfbGVuOworCWNvbnN0IGNoYXIgKnN0YXJ0PXRhcmdldDsKKwljb25zdCBjaGFyICplbmQ9dGFyZ2V0K3RhcmdldF9sZW47CiAKIAl3aGlsZSAoIChzdGFydD1maW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBjKSkgIT0gTlVMTCApIHsKIAkJY291bnQrKzsKQEAgLTI0NzgsOCArMjQ3Nyw4IEBACiB9CiAKIFB5X0xPQ0FMKFB5X3NzaXplX3QpCi1maW5kc3RyaW5nKGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLAotCSAgIGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCitmaW5kc3RyaW5nKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLAorCSAgIGNvbnN0IGNoYXIgKnBhdHRlcm4sIFB5X3NzaXplX3QgcGF0dGVybl9sZW4sCiAJICAgUHlfc3NpemVfdCBzdGFydCwKIAkgICBQeV9zc2l6ZV90IGVuZCwKIAkgICBpbnQgZGlyZWN0aW9uKQpAQCAtMjUxNiw4ICsyNTE1LDggQEAKIH0KIAogUHlfTE9DQUxfSU5MSU5FKFB5X3NzaXplX3QpCi1jb3VudHN0cmluZyhjaGFyICp0YXJnZXQsIFB5X3NzaXplX3QgdGFyZ2V0X2xlbiwKLQkgICAgY2hhciAqcGF0dGVybiwgUHlfc3NpemVfdCBwYXR0ZXJuX2xlbiwKK2NvdW50c3RyaW5nKGNvbnN0IGNoYXIgKnRhcmdldCwgUHlfc3NpemVfdCB0YXJnZXRfbGVuLAorCSAgICBjb25zdCBjaGFyICpwYXR0ZXJuLCBQeV9zc2l6ZV90IHBhdHRlcm5fbGVuLAogCSAgICBQeV9zc2l6ZV90IHN0YXJ0LAogCSAgICBQeV9zc2l6ZV90IGVuZCwKIAkgICAgaW50IGRpcmVjdGlvbiwgUHlfc3NpemVfdCBtYXhjb3VudCkKQEAgLTI1NzAsMjIgKzI1NjksMjEgQEAKIC8qIGxlbihzZWxmKT49MSwgZnJvbT0iIiwgbGVuKHRvKT49MSwgbWF4Y291bnQ+PTEgKi8KIFB5X0xPQ0FMKFB5U3RyaW5nT2JqZWN0ICopCiByZXBsYWNlX2ludGVybGVhdmUoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JCSAgIFB5U3RyaW5nT2JqZWN0ICp0bywKKwkJICAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCiAJCSAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7Ci0JY2hhciAqc2VsZl9zLCAqdG9fcywgKnJlc3VsdF9zOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHRvX2xlbiwgcmVzdWx0X2xlbjsKKwljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwogCVB5X3NzaXplX3QgY291bnQsIGksIHByb2R1Y3Q7CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKIAogCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwotCQorCiAJLyogMSBhdCB0aGUgZW5kIHBsdXMgMSBhZnRlciBldmVyeSBjaGFyYWN0ZXIgKi8KIAljb3VudCA9IHNlbGZfbGVuKzE7CiAJaWYgKG1heGNvdW50IDwgY291bnQpIAogCQljb3VudCA9IG1heGNvdW50OwotCQorCiAJLyogQ2hlY2sgZm9yIG92ZXJmbG93ICovCiAJLyogICByZXN1bHRfbGVuID0gY291bnQgKiB0b19sZW4gKyBzZWxmX2xlbjsgKi8KIAlwcm9kdWN0ID0gY291bnQgKiB0b19sZW47CkBAIC0yNjA2LDggKzI2MDQsNiBAQAogCQlyZXR1cm4gTlVMTDsKIAogCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKLQl0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7CiAJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKIAogCS8qIFRPRE86IHNwZWNpYWwgY2FzZSBzaW5nbGUgY2hhcmFjdGVyLCB3aGljaCBkb2Vzbid0IG5lZWQgbWVtY3B5ICovCkBAIC0yNjY4LDI1ICsyNjY0LDI0IEBACiAJCXN0YXJ0ID0gbmV4dCsxOwogCX0KIAlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBlbmQtc3RhcnQpOwotCQorCiAJcmV0dXJuIHJlc3VsdDsKIH0KIAogLyogbGVuKHNlbGYpPj0xLCBsZW4oZnJvbSk+PTIsIHRvPSIiLCBtYXhjb3VudD49MSAqLwogCiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQotcmVwbGFjZV9kZWxldGVfc3Vic3RyaW5nKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeVN0cmluZ09iamVjdCAqZnJvbSwKK3JlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhQeVN0cmluZ09iamVjdCAqc2VsZiwKKwkJCSBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCiAJCQkgUHlfc3NpemVfdCBtYXhjb3VudCkgewotCWNoYXIgKnNlbGZfcywgKmZyb21fcywgKnJlc3VsdF9zOworCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zOwogCWNoYXIgKnN0YXJ0LCAqbmV4dCwgKmVuZDsKLQlQeV9zc2l6ZV90IHNlbGZfbGVuLCBmcm9tX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwogCVB5X3NzaXplX3QgY291bnQsIG9mZnNldDsKIAlQeVN0cmluZ09iamVjdCAqcmVzdWx0OwogCiAJc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKIAlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JZnJvbV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShmcm9tKTsKLQlmcm9tX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSk7CiAKIAljb3VudCA9IGNvdW50c3RyaW5nKHNlbGZfcywgc2VsZl9sZW4sCiAJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKQEAgLTI3MDAsMTMgKzI2OTUsMTMgQEAKIAogCXJlc3VsdF9sZW4gPSBzZWxmX2xlbiAtIChjb3VudCAqIGZyb21fbGVuKTsKIAlhc3NlcnQgKHJlc3VsdF9sZW4+PTApOwotCQorCiAJaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCiAJICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwgKQogCQlyZXR1cm4gTlVMTDsKLQkKKwogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCisKIAlzdGFydCA9IHNlbGZfczsKIAllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKIAl3aGlsZSAoY291bnQtLSA+IDApIHsKQEAgLTI3MTYsOSArMjcxMSw5IEBACiAJCWlmIChvZmZzZXQgPT0gLTEpCiAJCQlicmVhazsKIAkJbmV4dCA9IHN0YXJ0ICsgb2Zmc2V0OwotCQkKKwogCQlQeV9NRU1DUFkocmVzdWx0X3MsIHN0YXJ0LCBuZXh0LXN0YXJ0KTsKLQkJCisKIAkJcmVzdWx0X3MgKz0gKG5leHQtc3RhcnQpOwogCQlzdGFydCA9IG5leHQrZnJvbV9sZW47CiAJfQpAQCAtMjczNSwzMSArMjczMCwzMSBAQAogCWNoYXIgKnNlbGZfcywgKnJlc3VsdF9zLCAqc3RhcnQsICplbmQsICpuZXh0OwogCVB5X3NzaXplX3Qgc2VsZl9sZW47CiAJUHlTdHJpbmdPYmplY3QgKnJlc3VsdDsKLQkKKwogCS8qIFRoZSByZXN1bHQgc3RyaW5nIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSAqLwogCXNlbGZfcyA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKIAlzZWxmX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCQorCiAJbmV4dCA9IGZpbmRjaGFyKHNlbGZfcywgc2VsZl9sZW4sIGZyb21fYyk7Ci0JCisKIAlpZiAobmV4dCA9PSBOVUxMKSB7CiAJCS8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCiAJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKIAl9Ci0JCisKIAkvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCiAJcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKIAlpZiAocmVzdWx0ID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7CiAJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzZWxmX3MsIHNlbGZfbGVuKTsKLQkKKwogCS8qIGNoYW5nZSBldmVyeXRoaW5nIGluLXBsYWNlLCBzdGFydGluZyB3aXRoIHRoaXMgb25lICovCiAJc3RhcnQgPSAgcmVzdWx0X3MgKyAobmV4dC1zZWxmX3MpOwogCSpzdGFydCA9IHRvX2M7CiAJc3RhcnQrKzsKIAllbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCQorCiAJd2hpbGUgKC0tbWF4Y291bnQgPiAwKSB7CiAJCW5leHQgPSBmaW5kY2hhcihzdGFydCwgZW5kLXN0YXJ0LCBmcm9tX2MpOwogCQlpZiAobmV4dCA9PSBOVUxMKQpAQCAtMjc2Nyw0MCArMjc2MiwzNSBAQAogCQkqbmV4dCA9IHRvX2M7CiAJCXN0YXJ0ID0gbmV4dCsxOwogCX0KLQkKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPT1sZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc3Vic3RyaW5nX2luX3BsYWNlKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkJICAgUHlTdHJpbmdPYmplY3QgKmZyb20sCi0JCQkgICBQeVN0cmluZ09iamVjdCAqdG8sCisJCQkgICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisJCQkgICBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKIAkJCSAgIFB5X3NzaXplX3QgbWF4Y291bnQpCiB7CiAJY2hhciAqcmVzdWx0X3MsICpzdGFydCwgKmVuZDsKLQljaGFyICpzZWxmX3MsICpmcm9tX3MsICp0b19zOwotCVB5X3NzaXplX3Qgc2VsZl9sZW4sIGZyb21fbGVuLCBvZmZzZXQ7CisJY2hhciAqc2VsZl9zOworCVB5X3NzaXplX3Qgc2VsZl9sZW4sIG9mZnNldDsKIAlQeVN0cmluZ09iamVjdCAqcmVzdWx0OwotCQorCiAJLyogVGhlIHJlc3VsdCBzdHJpbmcgd2lsbCBiZSB0aGUgc2FtZSBzaXplICovCi0JCisKIAlzZWxmX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7CiAJc2VsZl9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQkKLQlmcm9tX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSk7Ci0JZnJvbV9sZW4gPSBQeVN0cmluZ19HRVRfU0laRShmcm9tKTsKLQl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKLQkKKwogCW9mZnNldCA9IGZpbmRzdHJpbmcoc2VsZl9zLCBzZWxmX2xlbiwKIAkJCSAgICBmcm9tX3MsIGZyb21fbGVuLAogCQkJICAgIDAsIHNlbGZfbGVuLCBGT1JXQVJEKTsKLQkKIAlpZiAob2Zmc2V0ID09IC0xKSB7CiAJCS8qIE5vIG1hdGNoZXM7IHJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nICovCiAJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKIAl9Ci0JCisKIAkvKiBOZWVkIHRvIG1ha2UgYSBuZXcgc3RyaW5nICovCiAJcmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNlbGZfbGVuKTsKIAlpZiAocmVzdWx0ID09IE5VTEwpCkBAIC0yODA4LDEzICsyNzk4LDEyIEBACiAJcmVzdWx0X3MgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKIAlQeV9NRU1DUFkocmVzdWx0X3MsIHNlbGZfcywgc2VsZl9sZW4pOwogCi0JCiAJLyogY2hhbmdlIGV2ZXJ5dGhpbmcgaW4tcGxhY2UsIHN0YXJ0aW5nIHdpdGggdGhpcyBvbmUgKi8KIAlzdGFydCA9ICByZXN1bHRfcyArIG9mZnNldDsKIAlQeV9NRU1DUFkoc3RhcnQsIHRvX3MsIGZyb21fbGVuKTsKIAlzdGFydCArPSBmcm9tX2xlbjsKIAllbmQgPSByZXN1bHRfcyArIHNlbGZfbGVuOwotCQorCiAJd2hpbGUgKCAtLW1heGNvdW50ID4gMCkgewogCQlvZmZzZXQgPSBmaW5kc3RyaW5nKHN0YXJ0LCBlbmQtc3RhcnQsCiAJCQkJICAgIGZyb21fcywgZnJvbV9sZW4sCkBAIC0yODI0LDcgKzI4MTMsNyBAQAogCQlQeV9NRU1DUFkoc3RhcnQrb2Zmc2V0LCB0b19zLCBmcm9tX2xlbik7CiAJCXN0YXJ0ICs9IG9mZnNldCtmcm9tX2xlbjsKIAl9Ci0JCisKIAlyZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yODMyLDI4ICsyODIxLDI0IEBACiBQeV9MT0NBTChQeVN0cmluZ09iamVjdCAqKQogcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAogCQkJIGNoYXIgZnJvbV9jLAotCQkJIFB5U3RyaW5nT2JqZWN0ICp0bywKKwkJCSBjb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKIAkJCSBQeV9zc2l6ZV90IG1heGNvdW50KQogewotCWNoYXIgKnNlbGZfcywgKnRvX3MsICpyZXN1bHRfczsKKwljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKIAljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgdG9fbGVuLCByZXN1bHRfbGVuOworCVB5X3NzaXplX3Qgc2VsZl9sZW4sIHJlc3VsdF9sZW47CiAJUHlfc3NpemVfdCBjb3VudCwgcHJvZHVjdDsKIAlQeVN0cmluZ09iamVjdCAqcmVzdWx0OwotCQorCiAJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JCisKIAljb3VudCA9IGNvdW50Y2hhcihzZWxmX3MsIHNlbGZfbGVuLCBmcm9tX2MsIG1heGNvdW50KTsKLQkKIAlpZiAoY291bnQgPT0gMCkgewogCQkvKiBubyBtYXRjaGVzLCByZXR1cm4gdW5jaGFuZ2VkICovCiAJCXJldHVybiByZXR1cm5fc2VsZihzZWxmKTsKIAl9Ci0JCi0JdG9fcyA9IFB5U3RyaW5nX0FTX1NUUklORyh0byk7Ci0JdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwotCQorCiAJLyogdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VycmVudCBhbmQgbmV3LCBoZW5jZSB0aGUgIi0xIiAqLwogCS8qICAgcmVzdWx0X2xlbiA9IHNlbGZfbGVuICsgY291bnQgKiAodG9fbGVuLTEpICAqLwogCXByb2R1Y3QgPSBjb3VudCAqICh0b19sZW4tMSk7CkBAIC0yODY2LDE5ICsyODUxLDE5IEBACiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCQorCiAJaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCiAJICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCisKIAlzdGFydCA9IHNlbGZfczsKIAllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKIAl3aGlsZSAoY291bnQtLSA+IDApIHsKIAkJbmV4dCA9IGZpbmRjaGFyKHN0YXJ0LCBlbmQtc3RhcnQsIGZyb21fYyk7CiAJCWlmIChuZXh0ID09IE5VTEwpIAogCQkJYnJlYWs7Ci0JCQorCiAJCWlmIChuZXh0ID09IHN0YXJ0KSB7CiAJCQkvKiByZXBsYWNlIHdpdGggdGhlICd0bycgKi8KIAkJCVB5X01FTUNQWShyZXN1bHRfcywgdG9fcywgdG9fbGVuKTsKQEAgLTI4OTUsMjcgKzI4ODAsMjUgQEAKIAl9CiAJLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCiAJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQkKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKIC8qIGxlbihzZWxmKT49MSwgbGVuKGZyb20pPj0yLCBsZW4odG8pPj0yLCBtYXhjb3VudD49MSAqLwogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2Vfc3Vic3RyaW5nKFB5U3RyaW5nT2JqZWN0ICpzZWxmLAotCQkgIFB5U3RyaW5nT2JqZWN0ICpmcm9tLAotCQkgIFB5U3RyaW5nT2JqZWN0ICp0bywKKwkJICBjb25zdCBjaGFyICpmcm9tX3MsIFB5X3NzaXplX3QgZnJvbV9sZW4sCisJCSAgY29uc3QgY2hhciAqdG9fcywgUHlfc3NpemVfdCB0b19sZW4sCiAJCSAgUHlfc3NpemVfdCBtYXhjb3VudCkgewotCWNoYXIgKnNlbGZfcywgKmZyb21fcywgKnRvX3MsICpyZXN1bHRfczsKKwljaGFyICpzZWxmX3MsICpyZXN1bHRfczsKIAljaGFyICpzdGFydCwgKm5leHQsICplbmQ7Ci0JUHlfc3NpemVfdCBzZWxmX2xlbiwgZnJvbV9sZW4sIHRvX2xlbiwgcmVzdWx0X2xlbjsKKwlQeV9zc2l6ZV90IHNlbGZfbGVuLCByZXN1bHRfbGVuOwogCVB5X3NzaXplX3QgY291bnQsIG9mZnNldCwgcHJvZHVjdDsKIAlQeVN0cmluZ09iamVjdCAqcmVzdWx0OwotCQorCiAJc2VsZl9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHNlbGYpOwogCXNlbGZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc2VsZik7Ci0JZnJvbV9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKGZyb20pOwotCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7Ci0JCisKIAljb3VudCA9IGNvdW50c3RyaW5nKHNlbGZfcywgc2VsZl9sZW4sCiAJCQkgICAgZnJvbV9zLCBmcm9tX2xlbiwKIAkJCSAgICAwLCBzZWxmX2xlbiwgRk9SV0FSRCwgbWF4Y291bnQpOwpAQCAtMjkyMywxMCArMjkwNiw3IEBACiAJCS8qIG5vIG1hdGNoZXMsIHJldHVybiB1bmNoYW5nZWQgKi8KIAkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogCX0KLQkKLQl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKLQl0b19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh0byk7Ci0JCisKIAkvKiBDaGVjayBmb3Igb3ZlcmZsb3cgKi8KIAkvKiAgICByZXN1bHRfbGVuID0gc2VsZl9sZW4gKyBjb3VudCAqICh0b19sZW4tZnJvbV9sZW4pICovCiAJcHJvZHVjdCA9IGNvdW50ICogKHRvX2xlbi1mcm9tX2xlbik7CkBAIC0yOTM5LDEyICsyOTE5LDEyIEBACiAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLCAicmVwbGFjZSBzdHJpbmcgaXMgdG9vIGxvbmciKTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCQorCiAJaWYgKCAocmVzdWx0ID0gKFB5U3RyaW5nT2JqZWN0ICopCiAJICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgcmVzdWx0X2xlbikpID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCXJlc3VsdF9zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHJlc3VsdCk7Ci0JCisKIAlzdGFydCA9IHNlbGZfczsKIAllbmQgPSBzZWxmX3MgKyBzZWxmX2xlbjsKIAl3aGlsZSAoY291bnQtLSA+IDApIHsKQEAgLTI5NzAsMjkgKzI5NTAsMjQgQEAKIAl9CiAJLyogQ29weSB0aGUgcmVtYWluZGVyIG9mIHRoZSByZW1haW5pbmcgc3RyaW5nICovCiAJUHlfTUVNQ1BZKHJlc3VsdF9zLCBzdGFydCwgZW5kLXN0YXJ0KTsKLQkKKwogCXJldHVybiByZXN1bHQ7CiB9CiAKIAogUHlfTE9DQUwoUHlTdHJpbmdPYmplY3QgKikKIHJlcGxhY2UoUHlTdHJpbmdPYmplY3QgKnNlbGYsCi0JUHlTdHJpbmdPYmplY3QgKmZyb20sCi0JUHlTdHJpbmdPYmplY3QgKnRvLAorCWNvbnN0IGNoYXIgKmZyb21fcywgUHlfc3NpemVfdCBmcm9tX2xlbiwKKwljb25zdCBjaGFyICp0b19zLCBQeV9zc2l6ZV90IHRvX2xlbiwKIAlQeV9zc2l6ZV90IG1heGNvdW50KQogewotCVB5X3NzaXplX3QgZnJvbV9sZW4sIHRvX2xlbjsKLQkKIAlpZiAobWF4Y291bnQgPCAwKSB7CiAJCW1heGNvdW50ID0gUFlfU1NJWkVfVF9NQVg7CiAJfSBlbHNlIGlmIChtYXhjb3VudCA9PSAwIHx8IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpID09IDApIHsKIAkJLyogbm90aGluZyB0byBkbzsgcmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgKi8KIAkJcmV0dXJuIHJldHVybl9zZWxmKHNlbGYpOwogCX0KLQkKLQlmcm9tX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGZyb20pOwotCXRvX2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHRvKTsKLQkKKwogCWlmIChtYXhjb3VudCA9PSAwIHx8CiAJICAgIChmcm9tX2xlbiA9PSAwICYmIHRvX2xlbiA9PSAwKSkgewogCQkvKiBub3RoaW5nIHRvIGRvOyByZXR1cm4gdGhlIG9yaWdpbmFsIHN0cmluZyAqLwpAQCAtMzAwMCwxMiArMjk3NSwxMiBAQAogCX0KIAogCS8qIEhhbmRsZSB6ZXJvLWxlbmd0aCBzcGVjaWFsIGNhc2VzICovCi0JCisKIAlpZiAoZnJvbV9sZW4gPT0gMCkgewogCQkvKiBpbnNlcnQgdGhlICd0bycgc3RyaW5nIGV2ZXJ5d2hlcmUuICAgKi8KIAkJLyogICAgPj4+ICJQeXRob24iLnJlcGxhY2UoIiIsICIuIikgICAgICovCiAJCS8qICAgICcuUC55LnQuaC5vLm4uJyAgICAgICAgICAgICAgICAgICAqLwotCQlyZXR1cm4gcmVwbGFjZV9pbnRlcmxlYXZlKHNlbGYsIHRvLCBtYXhjb3VudCk7CisJCXJldHVybiByZXBsYWNlX2ludGVybGVhdmUoc2VsZiwgdG9fcywgdG9fbGVuLCBtYXhjb3VudCk7CiAJfQogCiAJLyogRXhjZXB0IGZvciAiIi5yZXBsYWNlKCIiLCAiQSIpID09ICJBIiB0aGVyZSBpcyBubyB3YXkgYmV5b25kIHRoaXMgKi8KQEAgLTMwMTksOSArMjk5NCw5IEBACiAJCS8qIGRlbGV0ZSBhbGwgb2NjdXJhbmNlcyBvZiAnZnJvbScgc3RyaW5nICovCiAJCWlmIChmcm9tX2xlbiA9PSAxKSB7CiAJCQlyZXR1cm4gcmVwbGFjZV9kZWxldGVfc2luZ2xlX2NoYXJhY3RlcigKLQkJCQlzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sIG1heGNvdW50KTsKKwkJCQlzZWxmLCBmcm9tX3NbMF0sIG1heGNvdW50KTsKIAkJfSBlbHNlIHsKLQkJCXJldHVybiByZXBsYWNlX2RlbGV0ZV9zdWJzdHJpbmcoc2VsZiwgZnJvbSwgbWF4Y291bnQpOworCQkJcmV0dXJuIHJlcGxhY2VfZGVsZXRlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCBtYXhjb3VudCk7CiAJCX0KIAl9CiAKQEAgLTMwMzEsMjIgKzMwMDYsMjIgQEAKIAkJaWYgKGZyb21fbGVuID09IDEpIHsKIAkJCXJldHVybiByZXBsYWNlX3NpbmdsZV9jaGFyYWN0ZXJfaW5fcGxhY2UoCiAJCQkJc2VsZiwKLQkJCQlQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sCi0JCQkJUHlTdHJpbmdfQVNfU1RSSU5HKHRvKVswXSwKKwkJCQlmcm9tX3NbMF0sCisJCQkJdG9fc1swXSwKIAkJCQltYXhjb3VudCk7CiAJCX0gZWxzZSB7CiAJCQlyZXR1cm4gcmVwbGFjZV9zdWJzdHJpbmdfaW5fcGxhY2UoCi0JCQkJc2VsZiwgZnJvbSwgdG8sIG1heGNvdW50KTsKKwkJCQlzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKIAkJfQogCX0KIAogCS8qIE90aGVyd2lzZSB1c2UgdGhlIG1vcmUgZ2VuZXJpYyBhbGdvcml0aG1zICovCiAJaWYgKGZyb21fbGVuID09IDEpIHsKLQkJcmV0dXJuIHJlcGxhY2Vfc2luZ2xlX2NoYXJhY3RlcihzZWxmLCBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSlbMF0sCi0JCQkJCQl0bywgbWF4Y291bnQpOworCQlyZXR1cm4gcmVwbGFjZV9zaW5nbGVfY2hhcmFjdGVyKHNlbGYsIGZyb21fc1swXSwKKwkJCQkJCXRvX3MsIHRvX2xlbiwgbWF4Y291bnQpOwogCX0gZWxzZSB7CiAJCS8qIGxlbignZnJvbScpPj0yLCBsZW4oJ3RvJyk+PTEgKi8KLQkJcmV0dXJuIHJlcGxhY2Vfc3Vic3RyaW5nKHNlbGYsIGZyb20sIHRvLCBtYXhjb3VudCk7CisJCXJldHVybiByZXBsYWNlX3N1YnN0cmluZyhzZWxmLCBmcm9tX3MsIGZyb21fbGVuLCB0b19zLCB0b19sZW4sIG1heGNvdW50KTsKIAl9CiB9CiAKQEAgLTMwNjIsODkgKzMwMzcsMTI3IEBACiB7CiAJUHlfc3NpemVfdCBjb3VudCA9IC0xOwogCVB5T2JqZWN0ICpmcm9tLCAqdG87Ci0JY29uc3QgY2hhciAqdG1wX3M7Ci0JUHlfc3NpemVfdCB0bXBfbGVuOworCWNvbnN0IGNoYXIgKmZyb21fcywgKnRvX3M7CisJUHlfc3NpemVfdCBmcm9tX2xlbiwgdG9fbGVuOwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPT3xuOnJlcGxhY2UiLCAmZnJvbSwgJnRvLCAmY291bnQpKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChQeVN0cmluZ19DaGVjayhmcm9tKSkgewotCSAgLyogQ2FuIHRoaXMgYmUgbWFkZSBhICchY2hlY2snIGFmdGVyIHRoZSBVbmljb2RlIGNoZWNrPyAqLworCQlmcm9tX3MgPSBQeVN0cmluZ19BU19TVFJJTkcoZnJvbSk7CisJCWZyb21fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoZnJvbSk7CiAJfQogI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKIAlpZiAoUHlVbmljb2RlX0NoZWNrKGZyb20pKQogCQlyZXR1cm4gUHlVbmljb2RlX1JlcGxhY2UoKFB5T2JqZWN0ICopc2VsZiwKIAkJCQkJIGZyb20sIHRvLCBjb3VudCk7CiAjZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoZnJvbSwgJnRtcF9zLCAmdG1wX2xlbikpCisJZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKGZyb20sICZmcm9tX3MsICZmcm9tX2xlbikpCiAJCXJldHVybiBOVUxMOwogCiAJaWYgKFB5U3RyaW5nX0NoZWNrKHRvKSkgewotCSAgLyogQ2FuIHRoaXMgYmUgbWFkZSBhICchY2hlY2snIGFmdGVyIHRoZSBVbmljb2RlIGNoZWNrPyAqLworCQl0b19zID0gUHlTdHJpbmdfQVNfU1RSSU5HKHRvKTsKKwkJdG9fbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodG8pOwogCX0KICNpZmRlZiBQeV9VU0lOR19VTklDT0RFCiAJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHRvKSkKIAkJcmV0dXJuIFB5VW5pY29kZV9SZXBsYWNlKChQeU9iamVjdCAqKXNlbGYsCiAJCQkJCSBmcm9tLCB0bywgY291bnQpOwogI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHRvLCAmdG1wX3MsICZ0bXBfbGVuKSkKKwllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIodG8sICZ0b19zLCAmdG9fbGVuKSkKIAkJcmV0dXJuIE5VTEw7CiAKIAlyZXR1cm4gKFB5T2JqZWN0ICopcmVwbGFjZSgoUHlTdHJpbmdPYmplY3QgKikgc2VsZiwKLQkJCQkgICAoUHlTdHJpbmdPYmplY3QgKikgZnJvbSwKLQkJCQkgICAoUHlTdHJpbmdPYmplY3QgKikgdG8sIGNvdW50KTsKKwkJCQkgICBmcm9tX3MsIGZyb21fbGVuLAorCQkJCSAgIHRvX3MsIHRvX2xlbiwgY291bnQpOwogfQogCiAvKiogRW5kIERBTEtFICoqLwogCisvKiBNYXRjaGVzIHRoZSBlbmQgKGRpcmVjdGlvbiA+PSAwKSBvciBzdGFydCAoZGlyZWN0aW9uIDwgMCkgb2Ygc2VsZgorICogYWdhaW5zdCBzdWJzdHIsIHVzaW5nIHRoZSBzdGFydCBhbmQgZW5kIGFyZ3VtZW50cy4gUmV0dXJucworICogLTEgb24gZXJyb3IsIDAgaWYgbm90IGZvdW5kIGFuZCAxIGlmIGZvdW5kLgorICovCitQeV9MT0NBTChpbnQpCitfc3RyaW5nX3RhaWxtYXRjaChQeVN0cmluZ09iamVjdCAqc2VsZiwgUHlPYmplY3QgKnN1YnN0ciwgUHlfc3NpemVfdCBzdGFydCwKKwkJICBQeV9zc2l6ZV90IGVuZCwgaW50IGRpcmVjdGlvbikKK3sKKwlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOworCVB5X3NzaXplX3Qgc2xlbjsKKwljb25zdCBjaGFyKiBzdWI7CisJY29uc3QgY2hhciogc3RyOworCisJaWYgKFB5U3RyaW5nX0NoZWNrKHN1YnN0cikpIHsKKwkJc3ViID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1YnN0cik7CisJCXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJzdHIpOworCX0KKyNpZmRlZiBQeV9VU0lOR19VTklDT0RFCisJZWxzZSBpZiAoUHlVbmljb2RlX0NoZWNrKHN1YnN0cikpCisJCXJldHVybiBQeVVuaWNvZGVfVGFpbG1hdGNoKChQeU9iamVjdCAqKXNlbGYsCisJCQkJCSAgIHN1YnN0ciwgc3RhcnQsIGVuZCwgZGlyZWN0aW9uKTsKKyNlbmRpZgorCWVsc2UgaWYgKFB5T2JqZWN0X0FzQ2hhckJ1ZmZlcihzdWJzdHIsICZzdWIsICZzbGVuKSkKKwkJcmV0dXJuIC0xOworCXN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKKworCXN0cmluZ19hZGp1c3RfaW5kaWNlcygmc3RhcnQsICZlbmQsIGxlbik7CisKKwlpZiAoZGlyZWN0aW9uIDwgMCkgeworCQkvKiBzdGFydHN3aXRoICovCisJCWlmIChzdGFydCtzbGVuID4gbGVuKQorCQkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogZW5kc3dpdGggKi8KKwkJaWYgKGVuZC1zdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCisJCQlyZXR1cm4gMDsKKworCQlpZiAoZW5kLXNsZW4gPiBzdGFydCkKKwkJCXN0YXJ0ID0gZW5kIC0gc2xlbjsKKwl9CisJaWYgKGVuZC1zdGFydCA+PSBzbGVuKQorCQlyZXR1cm4gISBtZW1jbXAoc3RyK3N0YXJ0LCBzdWIsIHNsZW4pOworCXJldHVybiAwOworfQorCisKIFB5RG9jX1NUUlZBUihzdGFydHN3aXRoX19kb2NfXywKICJTLnN0YXJ0c3dpdGgocHJlZml4Wywgc3RhcnRbLCBlbmRdXSkgLT4gYm9vbFxuXAogXG5cCiBSZXR1cm4gVHJ1ZSBpZiBTIHN0YXJ0cyB3aXRoIHRoZSBzcGVjaWZpZWQgcHJlZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCiBXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLiIpOworV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3ByZWZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX3N0YXJ0c3dpdGgoUHlTdHJpbmdPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICphcmdzKQogewotCWNvbnN0IGNoYXIqIHN0ciA9IFB5U3RyaW5nX0FTX1NUUklORyhzZWxmKTsKLQlQeV9zc2l6ZV90IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHNlbGYpOwotCWNvbnN0IGNoYXIqIHByZWZpeDsKLQlQeV9zc2l6ZV90IHBsZW47CiAJUHlfc3NpemVfdCBzdGFydCA9IDA7CiAJUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKIAlQeU9iamVjdCAqc3Vib2JqOworCWludCByZXN1bHQ7CiAKIAlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjpzdGFydHN3aXRoIiwgJnN1Ym9iaiwKIAkJX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCiAJCXJldHVybiBOVUxMOwotCWlmIChQeVN0cmluZ19DaGVjayhzdWJvYmopKSB7Ci0JCXByZWZpeCA9IFB5U3RyaW5nX0FTX1NUUklORyhzdWJvYmopOwotCQlwbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoc3Vib2JqKTsKKwlpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisJCVB5X3NzaXplX3QgaTsKKwkJZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisJCQlyZXN1bHQgPSBfc3RyaW5nX3RhaWxtYXRjaChzZWxmLAorCQkJCQlQeVR1cGxlX0dFVF9JVEVNKHN1Ym9iaiwgaSksCisJCQkJCXN0YXJ0LCBlbmQsIC0xKTsKKwkJCWlmIChyZXN1bHQgPT0gLTEpCisJCQkJcmV0dXJuIE5VTEw7CisJCQllbHNlIGlmIChyZXN1bHQpIHsKKwkJCQlQeV9SRVRVUk5fVFJVRTsKKwkJCX0KKwkJfQorCQlQeV9SRVRVUk5fRkFMU0U7CiAJfQotI2lmZGVmIFB5X1VTSU5HX1VOSUNPREUKLQllbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3Vib2JqKSkgewotCSAgICAJUHlfc3NpemVfdCByYzsKLQkJcmMgPSBQeVVuaWNvZGVfVGFpbG1hdGNoKChQeU9iamVjdCAqKXNlbGYsCi0JCQkJCSAgc3Vib2JqLCBzdGFydCwgZW5kLCAtMSk7Ci0JCWlmIChyYyA9PSAtMSkKLQkJCXJldHVybiBOVUxMOwotCQllbHNlCi0JCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKChsb25nKSByYyk7Ci0JfQotI2VuZGlmCi0JZWxzZSBpZiAoUHlPYmplY3RfQXNDaGFyQnVmZmVyKHN1Ym9iaiwgJnByZWZpeCwgJnBsZW4pKQorCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsIHN1Ym9iaiwgc3RhcnQsIGVuZCwgLTEpOworCWlmIChyZXN1bHQgPT0gLTEpCiAJCXJldHVybiBOVUxMOwotCi0Jc3RyaW5nX2FkanVzdF9pbmRpY2VzKCZzdGFydCwgJmVuZCwgbGVuKTsKLQotCWlmIChzdGFydCtwbGVuID4gbGVuKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwotCi0JaWYgKGVuZC1zdGFydCA+PSBwbGVuKQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKCFtZW1jbXAoc3RyK3N0YXJ0LCBwcmVmaXgsIHBsZW4pKTsKIAllbHNlCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7CisJCXJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogCkBAIC0zMTUzLDUxICszMTY2LDM5IEBACiBcblwKIFJldHVybiBUcnVlIGlmIFMgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LCBGYWxzZSBvdGhlcndpc2UuXG5cCiBXaXRoIG9wdGlvbmFsIHN0YXJ0LCB0ZXN0IFMgYmVnaW5uaW5nIGF0IHRoYXQgcG9zaXRpb24uXG5cCi1XaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLiIpOworV2l0aCBvcHRpb25hbCBlbmQsIHN0b3AgY29tcGFyaW5nIFMgYXQgdGhhdCBwb3NpdGlvbi5cblwKK3N1ZmZpeCBjYW4gYWxzbyBiZSBhIHR1cGxlIG9mIHN0cmluZ3MgdG8gdHJ5LiIpOwogCiBzdGF0aWMgUHlPYmplY3QgKgogc3RyaW5nX2VuZHN3aXRoKFB5U3RyaW5nT2JqZWN0ICpzZWxmLCBQeU9iamVjdCAqYXJncykKIHsKLQljb25zdCBjaGFyKiBzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc2VsZik7Ci0JUHlfc3NpemVfdCBsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzZWxmKTsKLQljb25zdCBjaGFyKiBzdWZmaXg7Ci0JUHlfc3NpemVfdCBzbGVuOwogCVB5X3NzaXplX3Qgc3RhcnQgPSAwOwogCVB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7CiAJUHlPYmplY3QgKnN1Ym9iajsKKwlpbnQgcmVzdWx0OwogCiAJaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6ZW5kc3dpdGgiLCAmc3Vib2JqLAogCQlfUHlFdmFsX1NsaWNlSW5kZXgsICZzdGFydCwgX1B5RXZhbF9TbGljZUluZGV4LCAmZW5kKSkKIAkJcmV0dXJuIE5VTEw7Ci0JaWYgKFB5U3RyaW5nX0NoZWNrKHN1Ym9iaikpIHsKLQkJc3VmZml4ID0gUHlTdHJpbmdfQVNfU1RSSU5HKHN1Ym9iaik7Ci0JCXNsZW4gPSBQeVN0cmluZ19HRVRfU0laRShzdWJvYmopOworCWlmIChQeVR1cGxlX0NoZWNrKHN1Ym9iaikpIHsKKwkJUHlfc3NpemVfdCBpOworCQlmb3IgKGkgPSAwOyBpIDwgUHlUdXBsZV9HRVRfU0laRShzdWJvYmopOyBpKyspIHsKKwkJCXJlc3VsdCA9IF9zdHJpbmdfdGFpbG1hdGNoKHNlbGYsCisJCQkJCVB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSwKKwkJCQkJc3RhcnQsIGVuZCwgKzEpOworCQkJaWYgKHJlc3VsdCA9PSAtMSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWVsc2UgaWYgKHJlc3VsdCkgeworCQkJCVB5X1JFVFVSTl9UUlVFOworCQkJfQorCQl9CisJCVB5X1JFVFVSTl9GQUxTRTsKIAl9Ci0jaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCWVsc2UgaWYgKFB5VW5pY29kZV9DaGVjayhzdWJvYmopKSB7Ci0JICAgIAlQeV9zc2l6ZV90IHJjOwotCQlyYyA9IFB5VW5pY29kZV9UYWlsbWF0Y2goKFB5T2JqZWN0ICopc2VsZiwKLQkJCQkJICBzdWJvYmosIHN0YXJ0LCBlbmQsICsxKTsKLQkJaWYgKHJjID09IC0xKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWVsc2UKLQkJCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoKGxvbmcpIHJjKTsKLQl9Ci0jZW5kaWYKLQllbHNlIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIoc3Vib2JqLCAmc3VmZml4LCAmc2xlbikpCisJcmVzdWx0ID0gX3N0cmluZ190YWlsbWF0Y2goc2VsZiwgc3Vib2JqLCBzdGFydCwgZW5kLCArMSk7CisJaWYgKHJlc3VsdCA9PSAtMSkKIAkJcmV0dXJuIE5VTEw7Ci0KLQlzdHJpbmdfYWRqdXN0X2luZGljZXMoJnN0YXJ0LCAmZW5kLCBsZW4pOwotCi0JaWYgKGVuZC1zdGFydCA8IHNsZW4gfHwgc3RhcnQgPiBsZW4pCi0JCXJldHVybiBQeUJvb2xfRnJvbUxvbmcoMCk7Ci0KLQlpZiAoZW5kLXNsZW4gPiBzdGFydCkKLQkJc3RhcnQgPSBlbmQgLSBzbGVuOwotCWlmIChlbmQtc3RhcnQgPj0gc2xlbikKLQkJcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyghbWVtY21wKHN0citzdGFydCwgc3VmZml4LCBzbGVuKSk7CiAJZWxzZQotCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOworCQlyZXR1cm4gUHlCb29sX0Zyb21Mb25nKHJlc3VsdCk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvT2JqZWN0cy90eXBlb2JqZWN0LmMgYi9PYmplY3RzL3R5cGVvYmplY3QuYwppbmRleCBjOGJjNjFkLi4xZWMzNDVmIDEwMDY0NAotLS0gYS9PYmplY3RzL3R5cGVvYmplY3QuYworKysgYi9PYmplY3RzL3R5cGVvYmplY3QuYwpAQCAtMTQ2Niw4ICsxNDY2LDkgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAlpZiAodmFsdWUgIT0gTlVMTCAmJiAhUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2RpY3RfXyBtdXN0IGJlIHNldCB0byBhIGRpY3Rpb25hcnkiKTsKKwkJUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKKwkJCSAgICAgIl9fZGljdF9fIG11c3QgYmUgc2V0IHRvIGEgZGljdGlvbmFyeSwgIgorCQkJICAgICAibm90IGEgJyUuMjAwcyciLCB2YWx1ZS0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCXJldHVybiAtMTsKIAl9CiAJZGljdCA9ICpkaWN0cHRyOwpAQCAtMTQ4NSw3ICsxNDg2LDcgQEAKIAogCWlmIChvYmotPm9iX3R5cGUtPnRwX3dlYWtsaXN0b2Zmc2V0ID09IDApIHsKIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0F0dHJpYnV0ZUVycm9yLAotCQkJCSJUaGlzIG9iamVjdCBoYXMgbm8gX193ZWFrbGlzdF9fIik7CisJCQkJIlRoaXMgb2JqZWN0IGhhcyBubyBfX3dlYWtyZWZfXyIpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJYXNzZXJ0KG9iai0+b2JfdHlwZS0+dHBfd2Vha2xpc3RvZmZzZXQgPiAwKTsKQEAgLTE1MzAsOCArMTUzMSw5IEBACiAJUHlfc3NpemVfdCBpLCBuOwogCiAJaWYgKCFQeVN0cmluZ19DaGVjayhzKSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX3Nsb3RzX18gbXVzdCBiZSBzdHJpbmdzIik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgICJfX3Nsb3RzX18gaXRlbXMgbXVzdCBiZSBzdHJpbmdzLCBub3QgJyUuMjAwcyciLAorCQkJICAgICBzLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJcmV0dXJuIDA7CiAJfQogCXAgPSAodW5zaWduZWQgY2hhciAqKSBQeVN0cmluZ19BU19TVFJJTkcocyk7CkBAIC0yNTY1LDggKzI1NjcsOSBAQAogCQlhcmdzID0gUHlPYmplY3RfQ2FsbE9iamVjdChnZXRuZXdhcmdzLCBOVUxMKTsKIAkJUHlfREVDUkVGKGdldG5ld2FyZ3MpOwogCQlpZiAoYXJncyAhPSBOVUxMICYmICFQeVR1cGxlX0NoZWNrKGFyZ3MpKSB7Ci0JCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJCSJfX2dldG5ld2FyZ3NfXyBzaG91bGQgcmV0dXJuIGEgdHVwbGUiKTsKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkJIl9fZ2V0bmV3YXJnc19fIHNob3VsZCByZXR1cm4gYSB0dXBsZSwgIgorCQkJCSJub3QgJyUuMjAwcyciLCBhcmdzLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJCWdvdG8gZW5kOwogCQl9CiAJfQpAQCAtMzIwNiw2ICszMjA5LDggQEAKIAlpZiAoUHlEaWN0X0dldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iKSA9PSBOVUxMKSB7CiAJCWlmICh0eXBlLT50cF9kb2MgIT0gTlVMTCkgewogCQkJUHlPYmplY3QgKmRvYyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcodHlwZS0+dHBfZG9jKTsKKwkJCWlmIChkb2MgPT0gTlVMTCkKKwkJCQlnb3RvIGVycm9yOwogCQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgIl9fZG9jX18iLCBkb2MpOwogCQkJUHlfREVDUkVGKGRvYyk7CiAJCX0gZWxzZSB7CkBAIC00Mjk0LDggKzQyOTksOSBAQAogCQlyZXN1bHQgPSB0ZW1wLT5vYl90eXBlLT50cF9hc19udW1iZXItPm5iX2luZGV4KHRlbXApOwogCX0KIAllbHNlIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgCi0JCQkJIl9faW5kZXhfXyBtdXN0IHJldHVybiBhbiBpbnQgb3IgYSBsb25nIik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsIAorCQkJICAgICAiX19pbmRleF9fIG11c3QgcmV0dXJuIGFuIGludCBvciBhIGxvbmcsICIKKwkJCSAgICAgIm5vdCAnJS4yMDBzJyIsIHRlbXAtPm9iX3R5cGUtPnRwX25hbWUpOwogCQlyZXN1bHQgPSAtMTsKIAl9CiAJUHlfREVDUkVGKHRlbXApOwpAQCAtNDQ5NCw3ICs0NTAwLDEwIEBACiAJCVB5X0RFQ1JFRihmdW5jKTsKIAkJaWYgKHJlcyA9PSBOVUxMKQogCQkJcmV0dXJuIC0xOwotCQloID0gUHlJbnRfQXNMb25nKHJlcyk7CisJCWlmIChQeUxvbmdfQ2hlY2socmVzKSkKKwkJCWggPSBQeUxvbmdfVHlwZS50cF9oYXNoKHJlcyk7CisJCWVsc2UKKwkJCWggPSBQeUludF9Bc0xvbmcocmVzKTsKIAkJUHlfREVDUkVGKHJlcyk7CiAJfQogCWVsc2UgewpAQCAtNDUwNSw4ICs0NTE0LDkgQEAKIAkJCWZ1bmMgPSBsb29rdXBfbWV0aG9kKHNlbGYsICJfX2NtcF9fIiwgJmNtcF9zdHIpOwogCQl9CiAJCWlmIChmdW5jICE9IE5VTEwpIHsKKwkJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJ1bmhhc2hhYmxlIHR5cGU6ICclLjIwMHMnIiwKKwkJCQkgICAgIHNlbGYtPm9iX3R5cGUtPnRwX25hbWUpOwogCQkJUHlfREVDUkVGKGZ1bmMpOwotCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgInVuaGFzaGFibGUgdHlwZSIpOwogCQkJcmV0dXJuIC0xOwogCQl9CiAJCVB5RXJyX0NsZWFyKCk7CkBAIC00NTI2LDcgKzQ1MzYsMTggQEAKIAogCWlmIChtZXRoID09IE5VTEwpCiAJCXJldHVybiBOVUxMOworCisJLyogUHlPYmplY3RfQ2FsbCgpIHdpbGwgZW5kIHVwIGNhbGxpbmcgc2xvdF90cF9jYWxsKCkgYWdhaW4gaWYKKwkgICB0aGUgb2JqZWN0IHJldHVybmVkIGZvciBfX2NhbGxfXyBoYXMgX19jYWxsX18gaXRzZWxmIGRlZmluZWQKKwkgICB1cG9uIGl0LiAgVGhpcyBjYW4gYmUgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGlmIHlvdSBzZXQKKwkgICBfX2NhbGxfXyBpbiBhIGNsYXNzIHRvIGFuIGluc3RhbmNlIG9mIGl0LiAqLworCWlmIChQeV9FbnRlclJlY3Vyc2l2ZUNhbGwoIiBpbiBfX2NhbGxfXyIpKSB7CisJCVB5X0RFQ1JFRihtZXRoKTsKKwkJcmV0dXJuIE5VTEw7CisJfQogCXJlcyA9IFB5T2JqZWN0X0NhbGwobWV0aCwgYXJncywga3dkcyk7CisJUHlfTGVhdmVSZWN1cnNpdmVDYWxsKCk7CisKIAlQeV9ERUNSRUYobWV0aCk7CiAJcmV0dXJuIHJlczsKIH0KQEAgLTQ2ODMsOCArNDcwNCw5IEBACiAJUHlFcnJfQ2xlYXIoKTsKIAlmdW5jID0gbG9va3VwX21ldGhvZChzZWxmLCAiX19nZXRpdGVtX18iLCAmZ2V0aXRlbV9zdHIpOwogCWlmIChmdW5jID09IE5VTEwpIHsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLQkJCQkiaXRlcmF0aW9uIG92ZXIgbm9uLXNlcXVlbmNlIik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgICInJS4yMDBzJyBvYmplY3QgaXMgbm90IGl0ZXJhYmxlIiwKKwkJCSAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSk7CiAJCXJldHVybiBOVUxMOwogCX0KIAlQeV9ERUNSRUYoZnVuYyk7CkBAIC00NzU3LDggKzQ3NzksOSBAQAogCWlmIChyZXMgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCWlmIChyZXMgIT0gUHlfTm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAotCQkJICAgIl9faW5pdF9fKCkgc2hvdWxkIHJldHVybiBOb25lIik7CisJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisJCQkgICAgICJfX2luaXRfXygpIHNob3VsZCByZXR1cm4gTm9uZSwgbm90ICclLjIwMHMnIiwKKwkJCSAgICAgcmVzLT5vYl90eXBlLT50cF9uYW1lKTsKIAkJUHlfREVDUkVGKHJlcyk7CiAJCXJldHVybiAtMTsKIAl9CmRpZmYgLS1naXQgYS9PYmplY3RzL3VuaWNvZGVvYmplY3QuYyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCmluZGV4IGMzYWIyZDguLjllMzViNjEgMTAwNjQ0Ci0tLSBhL09iamVjdHMvdW5pY29kZW9iamVjdC5jCisrKyBiL09iamVjdHMvdW5pY29kZW9iamVjdC5jCkBAIC0yODIwLDY1ICsyODIwLDE5OSBAQAogCiAvKiAtLS0gTUJDUyBjb2RlY3MgZm9yIFdpbmRvd3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KIAorI2lmIFNJWkVPRl9JTlQgPCBTSVpFT0ZfU1NJWkVfVAorI2RlZmluZSBORUVEX1JFVFJZCisjZW5kaWYKKworLyogWFhYIFRoaXMgY29kZSBpcyBsaW1pdGVkIHRvICJ0cnVlIiBkb3VibGUtYnl0ZSBlbmNvZGluZ3MsIGFzCisgICBhKSBpdCBhc3N1bWVzIGFuIGluY29tcGxldGUgY2hhcmFjdGVyIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGJ5dGUsIGFuZAorICAgYikgSXNEQkNTTGVhZEJ5dGUgKHByb2JhYmx5KSBkb2VzIG5vdCB3b3JrIGZvciBub24tREJDUyBtdWx0aS1ieXRlCisgICAgICBlbmNvZGluZ3MsIHNlZSBJc0RCQ1NMZWFkQnl0ZUV4IGRvY3VtZW50YXRpb24uICovCisKK3N0YXRpYyBpbnQgaXNfZGJjc19sZWFkX2J5dGUoY29uc3QgY2hhciAqcywgaW50IG9mZnNldCkKK3sKKyAgICBjb25zdCBjaGFyICpjdXJyID0gcyArIG9mZnNldDsKKworICAgIGlmIChJc0RCQ1NMZWFkQnl0ZSgqY3VycikpIHsKKwljb25zdCBjaGFyICpwcmV2ID0gQ2hhclByZXYocywgY3Vycik7CisJcmV0dXJuIChwcmV2ID09IGN1cnIpIHx8ICFJc0RCQ1NMZWFkQnl0ZSgqcHJldikgfHwgKGN1cnIgLSBwcmV2ID09IDIpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIERlY29kZSBNQkNTIHN0cmluZyBpbnRvIHVuaWNvZGUgb2JqZWN0LiBJZiAnZmluYWwnIGlzIHNldCwgY29udmVydHMKKyAqIHRyYWlsaW5nIGxlYWQtYnl0ZSB0b28uIFJldHVybnMgY29uc3VtZWQgc2l6ZSBpZiBzdWNjZWVkLCAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQgZGVjb2RlX21iY3MoUHlVbmljb2RlT2JqZWN0ICoqdiwKKwkJCWNvbnN0IGNoYXIgKnMsIC8qIE1CQ1Mgc3RyaW5nICovCisJCQlpbnQgc2l6ZSwgLyogc2l6ZW9mIE1CQ1Mgc3RyaW5nICovCisJCQlpbnQgZmluYWwpCit7CisgICAgUHlfVU5JQ09ERSAqcDsKKyAgICBQeV9zc2l6ZV90IG4gPSAwOworICAgIGludCB1c2l6ZSA9IDA7CisKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKKworICAgIC8qIFNraXAgdHJhaWxpbmcgbGVhZC1ieXRlIHVubGVzcyAnZmluYWwnIGlzIHNldCAqLworICAgIGlmICghZmluYWwgJiYgc2l6ZSA+PSAxICYmIGlzX2RiY3NfbGVhZF9ieXRlKHMsIHNpemUgLSAxKSkKKwktLXNpemU7CisKKyAgICAvKiBGaXJzdCBnZXQgdGhlIHNpemUgb2YgdGhlIHJlc3VsdCAqLworICAgIGlmIChzaXplID4gMCkgeworCXVzaXplID0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHMsIHNpemUsIE5VTEwsIDApOworCWlmICh1c2l6ZSA9PSAwKSB7CisJICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIGlmICgqdiA9PSBOVUxMKSB7CisJLyogQ3JlYXRlIHVuaWNvZGUgb2JqZWN0ICovCisJKnYgPSBfUHlVbmljb2RlX05ldyh1c2l6ZSk7CisJaWYgKCp2ID09IE5VTEwpCisJICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZWxzZSB7CisJLyogRXh0ZW5kIHVuaWNvZGUgb2JqZWN0ICovCisJbiA9IFB5VW5pY29kZV9HRVRfU0laRSgqdik7CisJaWYgKF9QeVVuaWNvZGVfUmVzaXplKHYsIG4gKyB1c2l6ZSkgPCAwKQorCSAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyogRG8gdGhlIGNvbnZlcnNpb24gKi8KKyAgICBpZiAoc2l6ZSA+IDApIHsKKwlwID0gUHlVbmljb2RlX0FTX1VOSUNPREUoKnYpICsgbjsKKwlpZiAoMCA9PSBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgcywgc2l6ZSwgcCwgdXNpemUpKSB7CisJICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworCSAgICByZXR1cm4gLTE7CisJfQorICAgIH0KKworICAgIHJldHVybiBzaXplOworfQorCitQeU9iamVjdCAqUHlVbmljb2RlX0RlY29kZU1CQ1NTdGF0ZWZ1bChjb25zdCBjaGFyICpzLAorCQkJCQlQeV9zc2l6ZV90IHNpemUsCisJCQkJCWNvbnN0IGNoYXIgKmVycm9ycywKKwkJCQkJUHlfc3NpemVfdCAqY29uc3VtZWQpCit7CisgICAgUHlVbmljb2RlT2JqZWN0ICp2ID0gTlVMTDsKKyAgICBpbnQgZG9uZTsKKworICAgIGlmIChjb25zdW1lZCkKKwkqY29uc3VtZWQgPSAwOworCisjaWZkZWYgTkVFRF9SRVRSWQorICByZXRyeToKKyAgICBpZiAoc2l6ZSA+IElOVF9NQVgpCisJZG9uZSA9IGRlY29kZV9tYmNzKCZ2LCBzLCBJTlRfTUFYLCAwKTsKKyAgICBlbHNlCisjZW5kaWYKKwlkb25lID0gZGVjb2RlX21iY3MoJnYsIHMsIChpbnQpc2l6ZSwgIWNvbnN1bWVkKTsKKworICAgIGlmIChkb25lIDwgMCkgeworICAgICAgICBQeV9YREVDUkVGKHYpOworCXJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChjb25zdW1lZCkKKwkqY29uc3VtZWQgKz0gZG9uZTsKKworI2lmZGVmIE5FRURfUkVUUlkKKyAgICBpZiAoc2l6ZSA+IElOVF9NQVgpIHsKKwlzICs9IGRvbmU7CisJc2l6ZSAtPSBkb25lOworCWdvdG8gcmV0cnk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gKFB5T2JqZWN0ICopdjsKK30KKwogUHlPYmplY3QgKlB5VW5pY29kZV9EZWNvZGVNQkNTKGNvbnN0IGNoYXIgKnMsCiAJCQkJUHlfc3NpemVfdCBzaXplLAogCQkJCWNvbnN0IGNoYXIgKmVycm9ycykKIHsKLSAgICBQeVVuaWNvZGVPYmplY3QgKnY7Ci0gICAgUHlfVU5JQ09ERSAqcDsKLSAgICBEV09SRCB1c2l6ZTsKKyAgICByZXR1cm4gUHlVbmljb2RlX0RlY29kZU1CQ1NTdGF0ZWZ1bChzLCBzaXplLCBlcnJvcnMsIE5VTEwpOworfQorCisvKgorICogQ29udmVydCB1bmljb2RlIGludG8gc3RyaW5nIG9iamVjdCAoTUJDUykuCisgKiBSZXR1cm5zIDAgaWYgc3VjY2VlZCwgLTEgb3RoZXJ3aXNlLgorICovCitzdGF0aWMgaW50IGVuY29kZV9tYmNzKFB5T2JqZWN0ICoqcmVwciwKKwkJCWNvbnN0IFB5X1VOSUNPREUgKnAsIC8qIHVuaWNvZGUgKi8KKwkJCWludCBzaXplKSAvKiBzaXplIG9mIHVuaWNvZGUgKi8KK3sKKyAgICBpbnQgbWJjc3NpemUgPSAwOworICAgIFB5X3NzaXplX3QgbiA9IDA7CisKKyAgICBhc3NlcnQoc2l6ZSA+PSAwKTsKIAogICAgIC8qIEZpcnN0IGdldCB0aGUgc2l6ZSBvZiB0aGUgcmVzdWx0ICovCi0gICAgYXNzZXJ0KHNpemUgPCBJTlRfTUFYKTsKLSAgICB1c2l6ZSA9IE11bHRpQnl0ZVRvV2lkZUNoYXIoQ1BfQUNQLCAwLCBzLCAoaW50KXNpemUsIE5VTEwsIDApOwotICAgIGlmIChzaXplID4gMCAmJiB1c2l6ZT09MCkKLSAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOwotCi0gICAgdiA9IF9QeVVuaWNvZGVfTmV3KHVzaXplKTsKLSAgICBpZiAodiA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAodXNpemUgPT0gMCkKLQlyZXR1cm4gKFB5T2JqZWN0ICopdjsKLSAgICBwID0gUHlVbmljb2RlX0FTX1VOSUNPREUodik7Ci0gICAgaWYgKDAgPT0gTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIHMsIChpbnQpc2l6ZSwgcCwgdXNpemUpKSB7Ci0gICAgICAgIFB5X0RFQ1JFRih2KTsKLSAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworICAgIGlmIChzaXplID4gMCkgeworCW1iY3NzaXplID0gV2lkZUNoYXJUb011bHRpQnl0ZShDUF9BQ1AsIDAsIHAsIHNpemUsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOworCWlmIChtYmNzc2l6ZSA9PSAwKSB7CisJICAgIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOworCSAgICByZXR1cm4gLTE7CisJfQogICAgIH0KIAotICAgIHJldHVybiAoUHlPYmplY3QgKil2OworICAgIGlmICgqcmVwciA9PSBOVUxMKSB7CisJLyogQ3JlYXRlIHN0cmluZyBvYmplY3QgKi8KKwkqcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG1iY3NzaXplKTsKKwlpZiAoKnJlcHIgPT0gTlVMTCkKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBlbHNlIHsKKwkvKiBFeHRlbmQgc3RyaW5nIG9iamVjdCAqLworCW4gPSBQeVN0cmluZ19TaXplKCpyZXByKTsKKwlpZiAoX1B5U3RyaW5nX1Jlc2l6ZShyZXByLCBuICsgbWJjc3NpemUpIDwgMCkKKwkgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIERvIHRoZSBjb252ZXJzaW9uICovCisgICAgaWYgKHNpemUgPiAwKSB7CisJY2hhciAqcyA9IFB5U3RyaW5nX0FTX1NUUklORygqcmVwcikgKyBuOworCWlmICgwID09IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBwLCBzaXplLCBzLCBtYmNzc2l6ZSwgTlVMTCwgTlVMTCkpIHsKKwkgICAgUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoMCwgTlVMTCk7CisJICAgIHJldHVybiAtMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7CiB9CiAKIFB5T2JqZWN0ICpQeVVuaWNvZGVfRW5jb2RlTUJDUyhjb25zdCBQeV9VTklDT0RFICpwLAogCQkJCVB5X3NzaXplX3Qgc2l6ZSwKIAkJCQljb25zdCBjaGFyICplcnJvcnMpCiB7Ci0gICAgUHlPYmplY3QgKnJlcHI7Ci0gICAgY2hhciAqczsKLSAgICBEV09SRCBtYmNzc2l6ZTsKKyAgICBQeU9iamVjdCAqcmVwciA9IE5VTEw7CisgICAgaW50IHJldDsKIAotICAgIC8qIElmIHRoZXJlIGFyZSBubyBjaGFyYWN0ZXJzLCBiYWlsIG5vdyEgKi8KLSAgICBpZiAoc2l6ZT09MCkKLQkgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoIiIpOworI2lmZGVmIE5FRURfUkVUUlkKKyByZXRyeToKKyAgICBpZiAoc2l6ZSA+IElOVF9NQVgpCisJcmV0ID0gZW5jb2RlX21iY3MoJnJlcHIsIHAsIElOVF9NQVgpOworICAgIGVsc2UKKyNlbmRpZgorCXJldCA9IGVuY29kZV9tYmNzKCZyZXByLCBwLCAoaW50KXNpemUpOwogCi0gICAgLyogRmlyc3QgZ2V0IHRoZSBzaXplIG9mIHRoZSByZXN1bHQgKi8KLSAgICBhc3NlcnQoc2l6ZTxJTlRfTUFYKTsKLSAgICBtYmNzc2l6ZSA9IFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCBwLCAoaW50KXNpemUsIE5VTEwsIDAsIE5VTEwsIE5VTEwpOwotICAgIGlmIChtYmNzc2l6ZT09MCkKLSAgICAgICAgcmV0dXJuIFB5RXJyX1NldEZyb21XaW5kb3dzRXJyV2l0aEZpbGVuYW1lKDAsIE5VTEwpOwotCi0gICAgcmVwciA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIG1iY3NzaXplKTsKLSAgICBpZiAocmVwciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAobWJjc3NpemUgPT0gMCkKLSAgICAgICAgcmV0dXJuIHJlcHI7Ci0KLSAgICAvKiBEbyB0aGUgY29udmVyc2lvbiAqLwotICAgIHMgPSBQeVN0cmluZ19BU19TVFJJTkcocmVwcik7Ci0gICAgYXNzZXJ0KHNpemUgPCBJTlRfTUFYKTsKLSAgICBpZiAoMCA9PSBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgcCwgKGludClzaXplLCBzLCBtYmNzc2l6ZSwgTlVMTCwgTlVMTCkpIHsKLSAgICAgICAgUHlfREVDUkVGKHJlcHIpOwotICAgICAgICByZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRmlsZW5hbWUoMCwgTlVMTCk7CisgICAgaWYgKHJldCA8IDApIHsKKwlQeV9YREVDUkVGKHJlcHIpOworCXJldHVybiBOVUxMOwogICAgIH0KKworI2lmZGVmIE5FRURfUkVUUlkKKyAgICBpZiAoc2l6ZSA+IElOVF9NQVgpIHsKKwlwICs9IElOVF9NQVg7CisJc2l6ZSAtPSBJTlRfTUFYOworCWdvdG8gcmV0cnk7CisgICAgfQorI2VuZGlmCisKICAgICByZXR1cm4gcmVwcjsKIH0KIApAQCAtMjg5Myw2ICszMDI3LDggQEAKIAkJCQlOVUxMKTsKIH0KIAorI3VuZGVmIE5FRURfUkVUUlkKKwogI2VuZGlmIC8qIE1TX1dJTkRPV1MgKi8KIAogLyogLS0tIENoYXJhY3RlciBNYXBwaW5nIENvZGVjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC00NDkxLDExICs0NjI3LDExIEBACiAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSBmb3IgdGhlIHNlcGFyYXRvciBhbmQgdGhlIGl0ZW0uICovCiAJaXRlbWxlbiA9IFB5VW5pY29kZV9HRVRfU0laRShpdGVtKTsKIAluZXdfcmVzX3VzZWQgPSByZXNfdXNlZCArIGl0ZW1sZW47Ci0JaWYgKG5ld19yZXNfdXNlZCA8PSAwKQorCWlmIChuZXdfcmVzX3VzZWQgPCAwKQogCSAgICBnb3RvIE92ZXJmbG93OwogCWlmIChpIDwgc2VxbGVuIC0gMSkgewogCSAgICBuZXdfcmVzX3VzZWQgKz0gc2VwbGVuOwotCSAgICBpZiAobmV3X3Jlc191c2VkIDw9IDApCisJICAgIGlmIChuZXdfcmVzX3VzZWQgPCAwKQogCQlnb3RvIE92ZXJmbG93OwogCX0KIAlpZiAobmV3X3Jlc191c2VkID4gcmVzX2FsbG9jKSB7CkBAIC00NTM2LDcgKzQ2NzIsNyBAQAogCiAgT3ZlcmZsb3c6CiAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX092ZXJmbG93RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJqb2luKCkgaXMgdG9vIGxvbmcgZm9yIGEgUHl0aG9uIHN0cmluZyIpOworICAgICAgICAgICAgICAgICAgICAiam9pbigpIHJlc3VsdCBpcyB0b28gbG9uZyBmb3IgYSBQeXRob24gc3RyaW5nIik7CiAgICAgUHlfREVDUkVGKGl0ZW0pOwogICAgIC8qIGZhbGwgdGhyb3VnaCAqLwogCkBAIC02NjY3LDI5ICs2ODAzLDQ0IEBACiBcblwKIFJldHVybiBUcnVlIGlmIFMgc3RhcnRzIHdpdGggdGhlIHNwZWNpZmllZCBwcmVmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKIFdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uIik7CitXaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxuXAorcHJlZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX3N0YXJ0c3dpdGgoUHlVbmljb2RlT2JqZWN0ICpzZWxmLAogCQkgICBQeU9iamVjdCAqYXJncykKIHsKKyAgICBQeU9iamVjdCAqc3Vib2JqOwogICAgIFB5VW5pY29kZU9iamVjdCAqc3Vic3RyaW5nOwogICAgIFB5X3NzaXplX3Qgc3RhcnQgPSAwOwogICAgIFB5X3NzaXplX3QgZW5kID0gUFlfU1NJWkVfVF9NQVg7Ci0gICAgUHlPYmplY3QgKnJlc3VsdDsKKyAgICBpbnQgcmVzdWx0OwogCi0gICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJzdHJpbmcsCisgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfE8mTyY6c3RhcnRzd2l0aCIsICZzdWJvYmosCiAJCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQogCXJldHVybiBOVUxMOwotICAgIHN1YnN0cmluZyA9IChQeVVuaWNvZGVPYmplY3QgKilQeVVuaWNvZGVfRnJvbU9iamVjdCgKLQkJCQkJCShQeU9iamVjdCAqKXN1YnN0cmluZyk7CisgICAgaWYgKFB5VHVwbGVfQ2hlY2soc3Vib2JqKSkgeworICAgICAgICBQeV9zc2l6ZV90IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBQeVR1cGxlX0dFVF9TSVpFKHN1Ym9iaik7IGkrKykgeworICAgICAgICAgICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oc3Vib2JqLCBpKSk7CisgICAgICAgICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXN1bHQgPSB0YWlsbWF0Y2goc2VsZiwgc3Vic3RyaW5nLCBzdGFydCwgZW5kLCAtMSk7CisgICAgICAgICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBQeV9SRVRVUk5fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvKiBub3RoaW5nIG1hdGNoZWQgKi8KKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7Ci0KLSAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpKTsKLQorICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgLTEpOwogICAgIFB5X0RFQ1JFRihzdWJzdHJpbmcpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhyZXN1bHQpOwogfQogCiAKQEAgLTY2OTgsMjkgKzY4NDksNDQgQEAKIFxuXAogUmV0dXJuIFRydWUgaWYgUyBlbmRzIHdpdGggdGhlIHNwZWNpZmllZCBzdWZmaXgsIEZhbHNlIG90aGVyd2lzZS5cblwKIFdpdGggb3B0aW9uYWwgc3RhcnQsIHRlc3QgUyBiZWdpbm5pbmcgYXQgdGhhdCBwb3NpdGlvbi5cblwKLVdpdGggb3B0aW9uYWwgZW5kLCBzdG9wIGNvbXBhcmluZyBTIGF0IHRoYXQgcG9zaXRpb24uIik7CitXaXRoIG9wdGlvbmFsIGVuZCwgc3RvcCBjb21wYXJpbmcgUyBhdCB0aGF0IHBvc2l0aW9uLlxuXAorc3VmZml4IGNhbiBhbHNvIGJlIGEgdHVwbGUgb2Ygc3RyaW5ncyB0byB0cnkuIik7CiAKIHN0YXRpYyBQeU9iamVjdCAqCiB1bmljb2RlX2VuZHN3aXRoKFB5VW5pY29kZU9iamVjdCAqc2VsZiwKIAkJIFB5T2JqZWN0ICphcmdzKQogeworICAgIFB5T2JqZWN0ICpzdWJvYmo7CiAgICAgUHlVbmljb2RlT2JqZWN0ICpzdWJzdHJpbmc7CiAgICAgUHlfc3NpemVfdCBzdGFydCA9IDA7CiAgICAgUHlfc3NpemVfdCBlbmQgPSBQWV9TU0laRV9UX01BWDsKLSAgICBQeU9iamVjdCAqcmVzdWx0OworICAgIGludCByZXN1bHQ7CiAKLSAgICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyZPJjplbmRzd2l0aCIsICZzdWJzdHJpbmcsCi0JCV9QeUV2YWxfU2xpY2VJbmRleCwgJnN0YXJ0LCBfUHlFdmFsX1NsaWNlSW5kZXgsICZlbmQpKQorICAgIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xPJk8mOmVuZHN3aXRoIiwgJnN1Ym9iaiwKKyAgICAgICAgX1B5RXZhbF9TbGljZUluZGV4LCAmc3RhcnQsIF9QeUV2YWxfU2xpY2VJbmRleCwgJmVuZCkpCiAJcmV0dXJuIE5VTEw7Ci0gICAgc3Vic3RyaW5nID0gKFB5VW5pY29kZU9iamVjdCAqKVB5VW5pY29kZV9Gcm9tT2JqZWN0KAotCQkJCQkJKFB5T2JqZWN0ICopc3Vic3RyaW5nKTsKKyAgICBpZiAoUHlUdXBsZV9DaGVjayhzdWJvYmopKSB7CisgICAgICAgIFB5X3NzaXplX3QgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IFB5VHVwbGVfR0VUX1NJWkUoc3Vib2JqKTsgaSsrKSB7CisgICAgICAgICAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlUdXBsZV9HRVRfSVRFTShzdWJvYmosIGkpKTsKKyAgICAgICAgICAgIGlmIChzdWJzdHJpbmcgPT0gTlVMTCkKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmVzdWx0ID0gdGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgKzEpOworICAgICAgICAgICAgUHlfREVDUkVGKHN1YnN0cmluZyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgUHlfUkVUVVJOX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgUHlfUkVUVVJOX0ZBTFNFOworICAgIH0KKyAgICBzdWJzdHJpbmcgPSAoUHlVbmljb2RlT2JqZWN0ICopUHlVbmljb2RlX0Zyb21PYmplY3Qoc3Vib2JqKTsKICAgICBpZiAoc3Vic3RyaW5nID09IE5VTEwpCi0JcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CiAKLSAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodGFpbG1hdGNoKHNlbGYsIHN1YnN0cmluZywgc3RhcnQsIGVuZCwgKzEpKTsKLQorICAgIHJlc3VsdCA9IHRhaWxtYXRjaChzZWxmLCBzdWJzdHJpbmcsIHN0YXJ0LCBlbmQsICsxKTsKICAgICBQeV9ERUNSRUYoc3Vic3RyaW5nKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcocmVzdWx0KTsKIH0KIAogCkBAIC03NzQ4LDYgKzc5MTQsOSBAQAogICAgIHVuaWNvZGVfZnJlZWxpc3QgPSBOVUxMOwogICAgIHVuaWNvZGVfZnJlZWxpc3Rfc2l6ZSA9IDA7CiAgICAgdW5pY29kZV9lbXB0eSA9IF9QeVVuaWNvZGVfTmV3KDApOworICAgIGlmICghdW5pY29kZV9lbXB0eSkKKwlyZXR1cm47CisKICAgICBzdHJjcHkodW5pY29kZV9kZWZhdWx0X2VuY29kaW5nLCAiYXNjaWkiKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCiAJdW5pY29kZV9sYXRpbjFbaV0gPSBOVUxMOwpAQCAtNzc1OCw2ICs3OTI3LDggQEAKICAgICBibG9vbV9saW5lYnJlYWsgPSBtYWtlX2Jsb29tX21hc2soCiAgICAgICAgIGxpbmVicmVhaywgc2l6ZW9mKGxpbmVicmVhaykgLyBzaXplb2YobGluZWJyZWFrWzBdKQogICAgICAgICApOworCisgICAgUHlUeXBlX1JlYWR5KCZFbmNvZGluZ01hcFR5cGUpOwogfQogCiAvKiBGaW5hbGl6ZSB0aGUgVW5pY29kZSBpbXBsZW1lbnRhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvT2JqZWN0cy93ZWFrcmVmb2JqZWN0LmMgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwppbmRleCBjNTVkZDRjLi5mODE0MzA2IDEwMDY0NAotLS0gYS9PYmplY3RzL3dlYWtyZWZvYmplY3QuYworKysgYi9PYmplY3RzL3dlYWtyZWZvYmplY3QuYwpAQCAtNiwxMCArNiwxMCBAQAogICAgICAgICAoKFB5V2Vha1JlZmVyZW5jZSAqKikgUHlPYmplY3RfR0VUX1dFQUtSRUZTX0xJU1RQVFIobykpCiAKIAotbG9uZworUHlfc3NpemVfdAogX1B5V2Vha3JlZl9HZXRXZWFrcmVmQ291bnQoUHlXZWFrUmVmZXJlbmNlICpoZWFkKQogewotICAgIGxvbmcgY291bnQgPSAwOworICAgIFB5X3NzaXplX3QgY291bnQgPSAwOwogCiAgICAgd2hpbGUgKGhlYWQgIT0gTlVMTCkgewogICAgICAgICArK2NvdW50OwpkaWZmIC0tZ2l0IGEvUEMvX3dpbnJlZy5jIGIvUEMvX3dpbnJlZy5jCmluZGV4IDVlZDU4YmIuLjVlZDNmNmMgMTAwNjQ0Ci0tLSBhL1BDL193aW5yZWcuYworKysgYi9QQy9fd2lucmVnLmMKQEAgLTk1OSw3ICs5NTksOSBAQAogCQlyZXR1cm4gTlVMTDsKIAlpZiAoIVB5SEtFWV9Bc0hLRVkob2JLZXksICZoS2V5LCBGQUxTRSkpCiAJCXJldHVybiBOVUxMOworCVB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKIAlyYyA9IFJlZ0Nvbm5lY3RSZWdpc3RyeShzekNvbXBOYW1lLCBoS2V5LCAmcmV0S2V5KTsKKwlQeV9FTkRfQUxMT1dfVEhSRUFEUwogCWlmIChyYyAhPSBFUlJPUl9TVUNDRVNTKQogCQlyZXR1cm4gUHlFcnJfU2V0RnJvbVdpbmRvd3NFcnJXaXRoRnVuY3Rpb24ocmMsCiAJCQkJCQkJICAgIkNvbm5lY3RSZWdpc3RyeSIpOwpkaWZmIC0tZ2l0IGEvUEMvY29uZmlnLmMgYi9QQy9jb25maWcuYwppbmRleCBiODMyZDdjLi5hOWEyODBkIDEwMDY0NAotLS0gYS9QQy9jb25maWcuYworKysgYi9QQy9jb25maWcuYwpAQCAtNjcsNiArNjcsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF9zdWJwcm9jZXNzKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9sc3Byb2Yodm9pZCk7CiBleHRlcm4gdm9pZCBpbml0X2FzdCh2b2lkKTsKK2V4dGVybiB2b2lkIGluaXRfdHlwZXModm9pZCk7CiAKIC8qIHRvb2xzL2ZyZWV6ZS9tYWtlY29uZmlnLnB5IG1hcmtlciBmb3IgYWRkaXRpb25hbCAiZXh0ZXJuIiAqLwogLyogLS0gQURETU9EVUxFIE1BUktFUiAxIC0tICovCkBAIC0xNjEsNiArMTYyLDggQEAKICAgICAgICAgeyJfX2J1aWx0aW5fXyIsIE5VTEx9LAogICAgICAgICB7InN5cyIsIE5VTEx9LAogCXsiZXhjZXB0aW9ucyIsIE5VTEx9LAorICAgICAgICAKKyAgICAgICAgeyJfdHlwZXMiLCBpbml0X3R5cGVzfSwKIAogICAgICAgICAvKiBTZW50aW5lbCAqLwogICAgICAgICB7MCwgMH0KZGlmZiAtLWdpdCBhL1BDL2dldHBhdGhwLmMgYi9QQy9nZXRwYXRocC5jCmluZGV4IDM3YTljMGIuLjcyOWQyZTQgMTAwNjQ0Ci0tLSBhL1BDL2dldHBhdGhwLmMKKysrIGIvUEMvZ2V0cGF0aHAuYwpAQCAtNjIsOCArNjIsMTQgQEAKICNpbmNsdWRlIDx0Y2hhci5oPgogI2VuZGlmCiAKKyNpZmRlZiBIQVZFX1NZU19UWVBFU19ICiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYgLyogSEFWRV9TWVNfVFlQRVNfSCAqLworCisjaWZkZWYgSEFWRV9TWVNfU1RBVF9ICiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNlbmRpZiAvKiBIQVZFX1NZU19TVEFUX0ggKi8KKwogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAvKiBTZWFyY2ggaW4gc29tZSBjb21tb24gbG9jYXRpb25zIGZvciB0aGUgYXNzb2NpYXRlZCBQeXRob24gbGlicmFyaWVzLgpAQCAtMjkxLDYgKzI5NywxMCBAQAogCQl9CiAJCVJlZ0Nsb3NlS2V5KHN1YktleSk7CiAJfQorCisJLyogcmV0dXJuIG51bGwgaWYgbm8gcGF0aCB0byByZXR1cm4gKi8KKwlpZiAoZGF0YVNpemUgPT0gMCkgZ290byBkb25lOworCiAJLyogb3JpZ2luYWwgZGF0YXNpemUgZnJvbSBSZWdRdWVyeUluZm8gZG9lc24ndCBpbmNsdWRlIHRoZSBcMCAqLwogCWRhdGFCdWYgPSBtYWxsb2MoKGRhdGFTaXplKzEpICogc2l6ZW9mKFRDSEFSKSk7CiAJaWYgKGRhdGFCdWYpIHsKZGlmZiAtLWdpdCBhL1BDL29zMmVteC9NYWtlZmlsZSBiL1BDL29zMmVteC9NYWtlZmlsZQppbmRleCA3NjJiZmRiLi44MzNmM2FiIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvTWFrZWZpbGUKKysrIGIvUEMvb3MyZW14L01ha2VmaWxlCkBAIC0yLDE1ICsyLDE1IEBACiAjCiAjIFRvcC1MZXZlbCBNYWtlZmlsZSBmb3IgQnVpbGRpbmcgUHl0aG9uIDIuNCBmb3IgT1MvMiB1c2luZyBHQ0MvRU1YCiAjIE9yaWdpbmFsbHkgd3JpdHRlbiBieSBBbmRyZXcgWmFib2xvdG55LCA8Yml0QGVsdGVjaC5ydT4gZm9yIFB5dGhvbiAxLjUuMgotIyBNb2RpZmllZCBieSBBbmRyZXcgTWFjSW50eXJlLCA8YW5keW1hY0BwY3VnLm9yZy5hdT4gZm9yIFB5dGhvbiAyLjQKKyMgTW9kaWZpZWQgYnkgQW5kcmV3IE1hY0ludHlyZSwgPGFuZHltYWNAcGN1Zy5vcmcuYXU+IGZvciBQeXRob24gMi41CiAjCiAjIFRoaXMgbWFrZWZpbGUgd2FzIGRldmVsb3BlZCBmb3IgdXNlIHdpdGggW1BdR0NDL0VNWCBjb21waWxlciBhbnkKICMgdmVyc2lvbiBhbmQgR05VIE1ha2UuCiAjCi0jIFRoZSBvdXRwdXQgb2YgdGhlIGJ1aWxkIGlzIGEgbGFyZ2lzaCBQeXRob24yNC5ETEwgY29udGFpbmluZyB0aGUKKyMgVGhlIG91dHB1dCBvZiB0aGUgYnVpbGQgaXMgYSBsYXJnaXNoIFB5dGhvbjI1LkRMTCBjb250YWluaW5nIHRoZQogIyBlc3NlbnRpYWwgbW9kdWxlcyBvZiBQeXRob24gYW5kIGEgc21hbGwgUHl0aG9uLmV4ZSBwcm9ncmFtIHRvIHN0YXJ0CiAjIHRoZSBpbnRlcnByZXRlci4gV2hlbiBlbWJlZGRpbmcgUHl0aG9uIHdpdGhpbiBhbm90aGVyIHByb2dyYW0sIG9ubHkKLSMgUHl0aG9uMjQuRExMIGlzIG5lZWRlZC4gV2UgYWxzbyBidWlsZCBweXRob25fcy5hIHN0YXRpYyBsaWJyYXJ5ICh3aGljaAorIyBQeXRob24yNS5ETEwgaXMgbmVlZGVkLiBXZSBhbHNvIGJ1aWxkIHB5dGhvbl9zLmEgc3RhdGljIGxpYnJhcnkgKHdoaWNoCiAjIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBPTUYgKC5saWIpIGZvcm1hdCB1c2luZyBlbXhvbWYgdG9vbCkgYW5kIGJvdGgKICMgcHl0aG9uLmEgYW5kIHB5dGhvbi5saWIgaW1wb3J0IGxpYnJhcmllcy4gIFRoZW4gdGhlIG9wdGlvbmFsIAogIyBleHRlbnNpb24gbW9kdWxlcywgd2hpY2ggYXJlIE9TLzIgRExMcyByZW5hbWVkIHdpdGggYSBQWUQgZmlsZSBleHRlbnNpb24uCkBAIC02NCw3ICs2NCw3IEBACiAKICMgPT09IGluc3RhbGwgbG9jYXRpb25zID09PQogIyBkZWZhdWx0IHZhbHVlIG9mIFBZVEhPTkhPTUUKLUxJQl9ESVI9QzovUHl0aG9uMjQKK0xJQl9ESVI9QzovUHl0aG9uMjUKICMgZGVmYXVsdCBpcyB0byBoYXZlIGV2ZXJ5dGhpbmcgaW4gb3IgdW5kZXIgUFlUSE9OSE9NRQogRVhFX0RJUj0kKExJQl9ESVIpCiBETExfRElSPSQoRVhFX0RJUikKQEAgLTIzNiw4ICsyMzYsOCBAQAogCUBlY2hvIFNUQUNLU0laRSAyMDk3MTUyID4+JEAKIAogIyBPdXRwdXQgZmlsZSBuYW1lcwotUFlUSE9OX1ZFUj0JMi40Ci1QWVRIT05fTElCPQlweXRob24yNAorUFlUSE9OX1ZFUj0JMi41CitQWVRIT05fTElCPQlweXRob24yNQogUFlUSE9OLkxJQj0JJChQWVRIT05fTElCKV9zJEEKIFBZVEhPTi5JTVBMSUI9CSQoUFlUSE9OX0xJQikkQQogaWZlcSAoJChFWEVPTUYpLHllcykKQEAgLTI5NSwyMCArMjk1LDIzIEBACiAJCU1vZHVsZXMvZGxtb2R1bGUuYyBcCiAJCU1vZHVsZXMvZXJybm9tb2R1bGUuYyBcCiAJCU1vZHVsZXMvZmNudGxtb2R1bGUuYyBcCisJCU1vZHVsZXMvX2Z1bmN0b29sc21vZHVsZS5jIFwKIAkJTW9kdWxlcy9faGVhcHFtb2R1bGUuYyBcCiAJCU1vZHVsZXMvaW1hZ2VvcC5jIFwKIAkJTW9kdWxlcy9pdGVydG9vbHNtb2R1bGUuYyBcCiAJCU1vZHVsZXMvX2xvY2FsZW1vZHVsZS5jIFwKIAkJTW9kdWxlcy9tYXRobW9kdWxlLmMgXAotCQlNb2R1bGVzL21kNWMuYyBcCisJCU1vZHVsZXMvbWQ1LmMgXAogCQlNb2R1bGVzL21kNW1vZHVsZS5jIFwKIAkJTW9kdWxlcy9vcGVyYXRvci5jIFwKIAkJTW9kdWxlcy9fcmFuZG9tbW9kdWxlLmMgXAogCQlNb2R1bGVzL3JnYmltZ21vZHVsZS5jIFwKIAkJTW9kdWxlcy9zaGFtb2R1bGUuYyBcCisJCU1vZHVsZXMvc2hhMjU2bW9kdWxlLmMgXAorCQlNb2R1bGVzL3NoYTUxMm1vZHVsZS5jIFwKIAkJTW9kdWxlcy9fc3JlLmMgXAogCQlNb2R1bGVzL3N0cm9wbW9kdWxlLmMgXAotCQlNb2R1bGVzL3N0cnVjdG1vZHVsZS5jIFwKKwkJTW9kdWxlcy9fc3RydWN0LmMgXAogCQlNb2R1bGVzL3N5bXRhYmxlbW9kdWxlLmMgXAogCQlNb2R1bGVzL3Rlcm1pb3MuYyBcCiAJCU1vZHVsZXMvdGltZW1vZHVsZS5jIFwKQEAgLTMzMSw2ICszMzQsOSBAQAogU1JDLlBBUlNFUj0JJChTUkMuUEFSU0UxKSBcCiAJCSQoU1JDLlBBUlNFMikKIFNSQy5QWVRIT049CSQoYWRkcHJlZml4ICQoVE9QKSwgXAorCQlQeXRob24vUHl0aG9uLWFzdC5jIFwKKwkJUHl0aG9uL2FzZGwuYyBcCisJCVB5dGhvbi9hc3QuYyBcCiAJCVB5dGhvbi9ibHRpbm1vZHVsZS5jIFwKIAkJUHl0aG9uL2V4Y2VwdGlvbnMuYyBcCiAJCVB5dGhvbi9jZXZhbC5jIFwKQEAgLTM1Myw2ICszNTksNyBAQAogCQlQeXRob24vbW9kc3VwcG9ydC5jIFwKIAkJUHl0aG9uL215c25wcmludGYuYyBcCiAJCVB5dGhvbi9teXN0cnRvdWwuYyBcCisJCVB5dGhvbi9weWFyZW5hLmMgXAogCQlQeXRob24vcHlmcGUuYyBcCiAJCVB5dGhvbi9weXN0YXRlLmMgXAogCQlQeXRob24vcHlzdHJ0b2QuYyBcCkBAIC0zNzEsNiArMzc4LDcgQEAKIAkJT2JqZWN0cy9jZWxsb2JqZWN0LmMgXAogCQlPYmplY3RzL2NsYXNzb2JqZWN0LmMgXAogCQlPYmplY3RzL2NvYmplY3QuYyBcCisJCU9iamVjdHMvY29kZW9iamVjdC5jIFwKIAkJT2JqZWN0cy9jb21wbGV4b2JqZWN0LmMgXAogCQlPYmplY3RzL2Rlc2Nyb2JqZWN0LmMgXAogCQlPYmplY3RzL2RpY3RvYmplY3QuYyBcCmRpZmYgLS1naXQgYS9QQy9vczJlbXgvUkVBRE1FLm9zMmVteCBiL1BDL29zMmVteC9SRUFETUUub3MyZW14CmluZGV4IDkxNzJhMmQuLjRmZTVjNTMgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9SRUFETUUub3MyZW14CisrKyBiL1BDL29zMmVteC9SRUFETUUub3MyZW14CkBAIC02MTIsMjIgKzYxMiwxMSBAQAogCiB0ZXN0X3Bvc2l4cGF0aCBzaG91bGQgc2tpcCB0aGVzZSB0ZXN0cyBvbiBFTVguCiAKLTI0LiAgSSBoYXZlIGhhZCBhIHJlcG9ydCB0aGF0IGF0dGVtcHRpbmcgdG8gdXNlIHRoZSBCaXR0b3JyZW50IHBhY2thZ2UKLShodHRwOi8vYml0Y29uanVyZXIub3JnL0JpdFRvcnJlbnQvKSB3aXRoIHRoaXMgcG9ydCBjYXVzZXMgdHJhcHMgbm90Ci1sb25nIGFmdGVyIHN0YXJ0aW5nIHRoZSBkb3dubG9hZDsgdGhpcyB1c2luZyB0aGUgImhlYWRsZXNzIiBkb3dubG9hZAotc2NyaXB0IG9uIGVDUyB2MS4xLiAgSSBoYXZlIG5vdCBiZWVuIGFibGUgdG8gZHVwbGljYXRlIHRoaXMgbXlzZWxmLAotYnV0IHRoZSBpbmRpY2F0aW9ucyBJIGhhdmUgc3VnZ2VzdCBhIGZhaWx1cmUgaW4gdGhlIDMyIGJpdCBUQ1AvSVAKLXN0YWNrICh2NC4zLjI/IG9uIGVDUyB2MS4xKSAtIG9uIG15IHY0LjAgRlAxMiBzeXN0ZW0gd2l0aCBNUFRTIGZpeHBhY2sKLVdSODQyNSBhcHBsaWVkICgxNiBiaXQgVENQL0lQIHN0YWNrIHY0LjAyKSwgQml0VG9ycmVudCBhcHBlYXJzIHRvIHdvcmsKLW5vcm1hbGx5IGluIHRlc3Rpbmcgb24gYSAxMDBNYml0IExBTi4gIFdpdGggdGhlIGN1cnNlcy5wYW5lbCBmaXggKHNlZQotaXRlbSAxMyBhYm92ZSksIHRoZSBCaXRUb3JyZW50IGN1cnNlcyBkb3dubG9hZGVyIHdvcmtzIHRvby4gIEknZAotYXBwcmVjaWF0ZSBhbnkgc3VjY2VzcyBvciBmYWlsdXJlIHJlcG9ydHMgd2l0aCBCaXRUb3JyZW50LCB0aG91Z2gKLUkndmUgcmVncmV0ZnVsbHkgcmVjb21tZW5kZWQgdGhhdCB0aGUgcGVyc29uIHdobyByZXBvcnRlZCB0aGUgZmFpbHVyZQotdGFrZSB0aGlzIHVwIHdpdGggZUNTIHN1cHBvcnQuICBTaW5jZSB0aGlzIHJlcG9ydCwgSSBoYXZlIHJlY2VpdmVkIGEgCi1mb2xsb3d1cCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoZSBwcm9ibGVtIG1heSBiZSBhZGRyZXNzZWQgYnkgVENQL0lQIAotZml4ZXMgKElDMzUwMDUrUEoyOTQ1NywgY29udGFpbmVkIGluIE5FV1NUQUNLLlpJUCBpbiB0aGUgSG9iYmVzIAotYXJjaGl2ZSkuICBJIHRoaW5rIGl0IHN1ZmZpY2VzIHRvIHNheSB0aGF0IEJpdFRvcnJlbnQgaXMgYSBmYWlyIHN0cmVzcyAKLXRlc3Qgb2YgYSBzeXN0ZW0ncyBuZXR3b3JraW5nIGNhcGFiaWxpdHkuCisyNC4gIEkgaGF2ZSByZXBvcnRzIG9mIEJpdFRvcnJlbnQgbm90IHdvcmtpbmcuICBJdCBhcHBlYXJzIHRoYXQgdGhlCitFTVggc2VsZWN0KCkgZW11bGF0aW9uLCBwb3NzaWJseSBpbiBjb25jZXJ0IHdpdGggYnVncyBpbiB0aGUgVENQL0lQCitzdGFjaywgcnVucyBpbnRvIHByb2JsZW1zIHVuZGVyIHRoZSBzdHJlc3MgaW1wb3NlZCBieSB0aGlzIGFwcGxpY2F0aW9uLgorSSB0aGluayBpdCBzdWZmaWNlcyB0byBzYXkgdGhhdCBCaXRUb3JyZW50IGlzIGEgZmFpciBzdHJlc3MgdGVzdCBvZiBhCitzeXN0ZW0ncyBuZXR3b3JraW5nIGNhcGFiaWxpdHkuCiAKIDI1LiAgSW4gdGhlIGFic2VuY2Ugb2YgYW4gRU1YIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaW5rKCkgZnVuY3Rpb24sIEkndmUgCiBpbXBsZW1lbnRlZCBhIGNydWRlIFB5dGhvbiBlbXVsYXRpb24sIGluIHRoZSBmaWxlIApAQCAtNjU5LDE0ICs2NDgsMTYgQEAKIAogMjkuICBUaGUgZGVmYXVsdCBzdGFjayBzaXplIGZvciB0aHJlYWRzIGhhcyBiZWVuIDY0ay4gIFRoaXMgaXMgcHJvdmluZwogaW5zdWZmaWNpZW50IGZvciBzb21lIGNvZGViYXNlcywgc3VjaCBhcyBab3BlLiAgVGhlIHRocmVhZCBzdGFjayBzaXplCi1zdGlsbCBkZWZhdWx0cyB0byA2NGssIGJ1dCB0aGlzIGNhbiBub3cgYmUgaW5jcmVhc2VkIGJ5IGRlZmluaW5nCitzdGlsbCBkZWZhdWx0cyB0byA2NGssIGJ1dCB0aGlzIGNhbiBub3cgYmUgaW5jcmVhc2VkIHZpYSB0aGUgc3RhY2tfc2l6ZSgpCitmdW5jdGlvbiBleHBvc2VkIGJ5IHRoZSB0aHJlYWRpbmcgJiB0aHJlYWQgbW9kdWxlcyBhcyB3ZWxsIGFzIGJ5IGRlZmluaW5nCiBUSFJFQURfU1RBQ0tfU0laRSB0byBhbiBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgTWFrZWZpbGUgKHdoaWNoIGNvbnRhaW5zCiBhIGNvbW1lbnRlZCBvdXQgZGVmaW5pdGlvbiBmb3IgMTI4a0IgdGhyZWFkIHN0YWNrcykuICBJIGhhdmUgc2VlbgogcmVmZXJlbmNlcyB0byBoZWF2eSBab3BlL1Bsb25lIHVzYWdlIHJlcXVpcmluZyAxTUIgdGhyZWFkIHN0YWNrcyBvbgogRnJlZUJTRCBhbmQgTGludXgsIGJ1dCBkb3VidCB0aGF0IGZvciBtb3N0IGxpa2VseSB1c2FnZSBvbiBPUy8yIHRoYXQKIG1vcmUgdGhhbiAyNTZrQiBpcyBuZWNlc3NhcnkuICBUaGUgc2l6ZSBvZiB0aGUgcmVxdWlyZWQgc3RhY2tzIChtYWluIAogYW5kIHRocmVhZCkgY2FuIHZhcnkgc2lnbmlmaWNhbnRseSBkZXBlbmRpbmcgb24gd2hpY2ggdmVyc2lvbiBvZiBnY2MKLWlzIHVzZWQgYWxvbmcgd2l0aCB0aGUgY29tcGlsZXIgb3B0aW1pc2F0aW9ucyBzZWxlY3RlZC4KK2lzIHVzZWQgYWxvbmcgd2l0aCB0aGUgY29tcGlsZXIgb3B0aW1pc2F0aW9ucyBzZWxlY3RlZC4gIE5vdGUgdGhhdCB0aGUKK21haW4gdGhyZWFkIHN0YWNrIHNpemUgaXMgc2V0IGR1cmluZyBsaW5raW5nIGFuZCBpcyBjdXJyZW50bHkgMk1CLgogCiAuLi4gcHJvYmFibHkgb3RoZXIgaXNzdWVzIHRoYXQgSSd2ZSBub3QgZW5jb3VudGVyZWQsIG9yIGRvbid0IHJlbWVtYmVyIDotKAogCkBAIC03MDcsNCArNjk4LDQgQEAKIEUtbWFpbDogYW5keW1hY0BidWxsc2V5ZS5hcGFuYS5vcmcuYXUsIG9yIGFuZHltYWNAcGN1Zy5vcmcuYXUKIFdlYjogICAgaHR0cDovL3d3dy5hbmR5bWFjLm9yZy8KIAotMTcgRmVicnVhcnksIDIwMDUuCisyMyBKdWx5LCAyMDA2LgpkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L2NvbmZpZy5jIGIvUEMvb3MyZW14L2NvbmZpZy5jCmluZGV4IDQwYzJjZGMuLjY5NmMzYmIgMTAwNjQ0Ci0tLSBhL1BDL29zMmVteC9jb25maWcuYworKysgYi9QQy9vczJlbXgvY29uZmlnLmMKQEAgLTU4LDE2ICs1OCwxOSBAQAogZXh0ZXJuIHZvaWQgaW5pdGRsKCk7CiBleHRlcm4gdm9pZCBpbml0ZXJybm8oKTsKIGV4dGVybiB2b2lkIGluaXRmY250bCgpOworZXh0ZXJuIHZvaWQgaW5pdF9mdW5jdG9vbHMoKTsKIGV4dGVybiB2b2lkIGluaXRfaGVhcHEoKTsKIGV4dGVybiB2b2lkIGluaXRpbWFnZW9wKCk7CiBleHRlcm4gdm9pZCBpbml0aXRlcnRvb2xzKCk7CiBleHRlcm4gdm9pZCBpbml0bWF0aCgpOwotZXh0ZXJuIHZvaWQgaW5pdG1kNSgpOworZXh0ZXJuIHZvaWQgaW5pdF9tZDUoKTsKIGV4dGVybiB2b2lkIGluaXRvcGVyYXRvcigpOwogZXh0ZXJuIHZvaWQgaW5pdHJnYmltZygpOwotZXh0ZXJuIHZvaWQgaW5pdHNoYSgpOworZXh0ZXJuIHZvaWQgaW5pdF9zaGEoKTsKK2V4dGVybiB2b2lkIGluaXRfc2hhMjU2KCk7CitleHRlcm4gdm9pZCBpbml0X3NoYTUxMigpOwogZXh0ZXJuIHZvaWQgaW5pdHN0cm9wKCk7Ci1leHRlcm4gdm9pZCBpbml0c3RydWN0KCk7CitleHRlcm4gdm9pZCBpbml0X3N0cnVjdCgpOwogZXh0ZXJuIHZvaWQgaW5pdHRlcm1pb3MoKTsKIGV4dGVybiB2b2lkIGluaXR0aW1lKCk7CiBleHRlcm4gdm9pZCBpbml0dGltaW5nKCk7CkBAIC0xMjEsMTYgKzEyNCwxOSBAQAogCXsiZGwiLCBpbml0ZGx9LAogCXsiZXJybm8iLCBpbml0ZXJybm99LAogCXsiZmNudGwiLCBpbml0ZmNudGx9LAorCXsiX2Z1bmN0b29scyIsIGluaXRfZnVuY3Rvb2xzfSwKIAl7Il9oZWFwcSIsIGluaXRfaGVhcHF9LAogCXsiaW1hZ2VvcCIsIGluaXRpbWFnZW9wfSwKIAl7Iml0ZXJ0b29scyIsIGluaXRpdGVydG9vbHN9LAogCXsibWF0aCIsIGluaXRtYXRofSwKLQl7Im1kNSIsIGluaXRtZDV9LAorCXsiX21kNSIsIGluaXRfbWQ1fSwKIAl7Im9wZXJhdG9yIiwgaW5pdG9wZXJhdG9yfSwKIAl7InJnYmltZyIsIGluaXRyZ2JpbWd9LAotCXsic2hhIiwgaW5pdHNoYX0sCisJeyJfc2hhIiwgaW5pdF9zaGF9LAorCXsiX3NoYTI1NiIsIGluaXRfc2hhMjU2fSwKKwl7Il9zaGE1MTIiLCBpbml0X3NoYTUxMn0sCiAJeyJzdHJvcCIsIGluaXRzdHJvcH0sCi0JeyJzdHJ1Y3QiLCBpbml0c3RydWN0fSwKKwl7Il9zdHJ1Y3QiLCBpbml0X3N0cnVjdH0sCiAJeyJ0ZXJtaW9zIiwgaW5pdHRlcm1pb3N9LAogCXsidGltZSIsIGluaXR0aW1lfSwKIAl7InRpbWluZyIsIGluaXR0aW1pbmd9LApkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L3B5Y29uZmlnLmggYi9QQy9vczJlbXgvcHljb25maWcuaAppbmRleCBhZmU3OWU0Li4xMDM5ZDNkIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvcHljb25maWcuaAorKysgYi9QQy9vczJlbXgvcHljb25maWcuaApAQCAtNDYsNiArNDYsNyBAQAogI2RlZmluZSBUQ1BJUFY0CQkxCiAjZGVmaW5lIFVTRV9TT0NLRVQJMQogI2RlZmluZSBzb2NrbGVuX3QJaW50CisjZGVmaW5lIEZEX1NFVFNJWkUJMTAyNAogCiAvKiBlbmFibGUgdGhlIFB5dGhvbiBvYmplY3QgYWxsb2NhdG9yICovCiAjZGVmaW5lCVdJVEhfUFlNQUxMT0MJMQpAQCAtNjEsNiArNjIsOSBAQAogI2RlZmluZSBQWV9VTklDT0RFX1RZUEUJd2NoYXJfdAogI2RlZmluZSBQeV9VTklDT0RFX1NJWkUgU0laRU9GX1NIT1JUCiAKKy8qIEVNWCBkZWZpbmVzIHNzaXplX3QgKi8KKyNkZWZpbmUgSEFWRV9TU0laRV9UCTEKKwogLyogc3lzdGVtIGNhcGFiaWxpdGllcyAqLwogI2RlZmluZSBIQVZFX1RUWU5BTUUJMQogI2RlZmluZSBIQVZFX1dBSVQJMQpAQCAtMTM3LDYgKzE0MSw5IEBACiAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGluIGEgdm9pZCAqLiAqLwogI2RlZmluZSBTSVpFT0ZfVk9JRF9QIDQKIAorLyogVGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHNpemVfdC4gKi8KKyNkZWZpbmUgU0laRU9GX1NJWkVfVCA0CisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgYWxhcm0gZnVuY3Rpb24uICovCiAjZGVmaW5lIEhBVkVfQUxBUk0gMQogCkBAIC0yNTQsMTUgKzI2MSwzMyBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSB3YWl0cGlkIGZ1bmN0aW9uLiAqLwogI2RlZmluZSBIQVZFX1dBSVRQSUQgMQogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxjb25pby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0NPTklPX0gKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRElSRUNUX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX0RJUkVOVF9IIDEKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX0ZDTlRMX0ggMQogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxpby5oPiBoZWFkZXIgZmlsZS4gKi8KKyN1bmRlZiBIQVZFX0lPX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bmN1cnNlcy5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9OQ1VSU0VTX0ggMQogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHByb2Nlc3MuaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfUFJPQ0VTU19IIDEKKworLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NJR05BTF9IIDEKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2ZpbGUuaD4gaGVhZGVyIGZpbGUuICovCiAjZGVmaW5lIEhBVkVfU1lTX0ZJTEVfSCAxCiAKQEAgLTI3MiwxMiArMjk3LDE4IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1NZU19TRUxFQ1RfSCAxCiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gKi8KICNkZWZpbmUgSEFWRV9TWVNfVElNRV9IIDEKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3RpbWVzLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1NZU19USU1FU19IIDEKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3R5cGVzLmg+IGhlYWRlciBmaWxlLiAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBIQVZFX1NZU19VTl9IIDEKIApkaWZmIC0tZ2l0IGEvUEMvb3MyZW14L3B5dGhvbjI0LmRlZiBiL1BDL29zMmVteC9weXRob24yNS5kZWYKc2ltaWxhcml0eSBpbmRleCA3NSUKcmVuYW1lIGZyb20gUEMvb3MyZW14L3B5dGhvbjI0LmRlZgpyZW5hbWUgdG8gUEMvb3MyZW14L3B5dGhvbjI1LmRlZgppbmRleCA1MzRkZmY4Li4zYzYwMDRmIDEwMDY0NAotLS0gYS9QQy9vczJlbXgvcHl0aG9uMjQuZGVmCisrKyBiL1BDL29zMmVteC9weXRob24yNS5kZWYKQEAgLTEsODkgKzEsOTMgQEAKLUxJQlJBUlkgcHl0aG9uMjQgSU5JVElOU1RBTkNFIFRFUk1JTlNUQU5DRSAKLURFU0NSSVBUSU9OICJQeXRob24gMi40IENvcmUgRExMIiAKK0xJQlJBUlkgcHl0aG9uMjUgSU5JVElOU1RBTkNFIFRFUk1JTlNUQU5DRSAKK0RFU0NSSVBUSU9OICJQeXRob24gMi41IENvcmUgRExMIiAKIFBST1RNT0RFIAogREFUQSBNVUxUSVBMRSBOT05TSEFSRUQgCiBFWFBPUlRTIAogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY29uZmlnKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvbmZpZykKICAgIl9QeUltcG9ydF9Jbml0dGFiIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZGxmY24pCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZGxmY24pCiA7ICAiZGxvcGVuIgogOyAgImRsc3ltIgogOyAgImRsY2xvc2UiCiA7ICAiZGxlcnJvciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldHBhdGhwKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdldHBhdGhwKQogICAiUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoIgogICAiUHlfR2V0UHJlZml4IgogICAiUHlfR2V0RXhlY1ByZWZpeCIKICAgIlB5X0dldFBhdGgiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZXRidWlsZGluZm8pCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0YnVpbGRpbmZvKQogICAiUHlfR2V0QnVpbGRJbmZvIgorICAiX1B5X3N2bnZlcnNpb24iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtYWluKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1haW4pCiAgICJQeV9NYWluIgogICAiUHlfR2V0QXJnY0FyZ3YiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihhY2NlbGVyKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGFjY2VsZXIpCiAgICJQeUdyYW1tYXJfQWRkQWNjZWxlcmF0b3JzIgogICAiUHlHcmFtbWFyX1JlbW92ZUFjY2VsZXJhdG9ycyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdyYW1tYXIxKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdyYW1tYXIxKQogICAiUHlHcmFtbWFyX0ZpbmRERkEiCiAgICJQeUdyYW1tYXJfTGFiZWxSZXByIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobGlzdG5vZGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobGlzdG5vZGUpCiAgICJQeU5vZGVfTGlzdFRyZWUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihub2RlKQotICAiUHlOb2RlX0FkZENoaWxkIgorOyBGcm9tIHB5dGhvbjI1X3MubGliKG5vZGUpCiAgICJQeU5vZGVfTmV3IgorICAiUHlOb2RlX0FkZENoaWxkIgogICAiUHlOb2RlX0ZyZWUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihwYXJzZXIpCis7IEZyb20gcHl0aG9uMjVfcy5saWIocGFyc2VyKQogICAiUHlQYXJzZXJfQWRkVG9rZW4iCiAgICJQeVBhcnNlcl9OZXciCiAgICJQeVBhcnNlcl9EZWxldGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihwYXJzZXRvaykKKzsgRnJvbSBweXRob24yNV9zLmxpYihwYXJzZXRvaykKICAgIlB5X1RhYmNoZWNrRmxhZyIKICAgIlB5UGFyc2VyX1BhcnNlU3RyaW5nIgotICAiUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyIKKyAgIlB5UGFyc2VyX1BhcnNlU3RyaW5nRmxhZ3NGaWxlbmFtZSIKICAgIlB5UGFyc2VyX1BhcnNlRmlsZSIKICAgIlB5UGFyc2VyX1BhcnNlRmlsZUZsYWdzIgotICAiUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lIgorICAiUHlQYXJzZXJfUGFyc2VTdHJpbmdGbGFncyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGJpdHNldCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihiaXRzZXQpCiAgICJfUHlfbmV3Yml0c2V0IgogICAiX1B5X2RlbGJpdHNldCIKICAgIl9QeV9hZGRiaXQiCiAgICJfUHlfc2FtZWJpdHNldCIKICAgIl9QeV9tZXJnZWJpdHNldCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG1ldGFncmFtbWFyKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1ldGFncmFtbWFyKQogICAiX1B5X21ldGFfZ3JhbW1hciIKICAgIlB5X21ldGFfZ3JhbW1hciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRva2VuaXplcikKKzsgRnJvbSBweXRob24yNV9zLmxpYih0b2tlbml6ZXIpCiAgICJQeVRva2VuX09uZUNoYXIiCiAgICJQeVRva2VuX1R3b0NoYXJzIgogICAiUHlUb2tlbl9UaHJlZUNoYXJzIgogICAiUHlUb2tlbml6ZXJfRnJvbVN0cmluZyIKLSAgIlB5VG9rZW5pemVyX0Zyb21GaWxlIgogICAiUHlUb2tlbml6ZXJfRnJlZSIKKyAgIlB5VG9rZW5pemVyX0Zyb21GaWxlIgogICAiUHlUb2tlbml6ZXJfR2V0IgogICAiX1B5UGFyc2VyX1Rva2VuTmFtZXMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihteXJlYWRsaW5lKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG15cmVhZGxpbmUpCiAgICJfUHlPU19SZWFkbGluZVRTdGF0ZSIKICAgIlB5T1NfUmVhZGxpbmVGdW5jdGlvblBvaW50ZXIiCiAgICJQeU9TX1N0ZGlvUmVhZGxpbmUiCiAgICJQeU9TX1JlYWRsaW5lIgogICAiUHlPU19JbnB1dEhvb2siCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihhYnN0cmFjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihhYnN0cmFjdCkKKyAgIl9QeU9iamVjdF9MZW5ndGhIaW50IgorICAiUHlNYXBwaW5nX1NpemUiCisgICJQeU9iamVjdF9DYWxsTWV0aG9kIgogICAiUHlPYmplY3RfR2V0SXRlbSIKICAgIlB5U2VxdWVuY2VfR2V0SXRlbSIKICAgIlB5T2JqZWN0X1NldEl0ZW0iCkBAIC05NiwxNSArMTAwLDIwIEBACiAgICJQeU51bWJlcl9JbnQiCiAgICJQeU51bWJlcl9Mb25nIgogICAiUHlOdW1iZXJfRmxvYXQiCisgICJQeVNlcXVlbmNlX0NvbmNhdCIKKyAgIlB5U2VxdWVuY2VfUmVwZWF0IgorICAiUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0IgorICAiUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0IgogICAiUHlTZXF1ZW5jZV9HZXRTbGljZSIKICAgIlB5U2VxdWVuY2VfU2V0U2xpY2UiCiAgICJQeVNlcXVlbmNlX1R1cGxlIgogICAiUHlPYmplY3RfR2V0SXRlciIKLSAgIlB5TWFwcGluZ19TaXplIgogICAiUHlJdGVyX05leHQiCisgICJQeVNlcXVlbmNlX0Zhc3QiCiAgICJfUHlTZXF1ZW5jZV9JdGVyU2VhcmNoIgogICAiUHlPYmplY3RfQ2FsbEZ1bmN0aW9uIgotICAiUHlPYmplY3RfQ2FsbE1ldGhvZCIKKyAgIl9QeU9iamVjdF9DYWxsRnVuY3Rpb25fU2l6ZVQiCisgICJfUHlPYmplY3RfQ2FsbE1ldGhvZF9TaXplVCIKICAgIlB5T2JqZWN0X0NhbGxNZXRob2RPYmpBcmdzIgogICAiUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncyIKICAgIlB5T2JqZWN0X0NtcCIKQEAgLTEzNiw2ICsxNDUsNyBAQAogICAiUHlOdW1iZXJfQW5kIgogICAiUHlOdW1iZXJfWG9yIgogICAiUHlOdW1iZXJfT3IiCisgICJQeU51bWJlcl9JbmRleCIKICAgIlB5TnVtYmVyX0luUGxhY2VTdWJ0cmFjdCIKICAgIlB5TnVtYmVyX0luUGxhY2VEaXZpZGUiCiAgICJQeU51bWJlcl9JblBsYWNlRmxvb3JEaXZpZGUiCkBAIC0xNTAsMTcgKzE2MCwxMiBAQAogICAiUHlTZXF1ZW5jZV9DaGVjayIKICAgIlB5U2VxdWVuY2VfU2l6ZSIKICAgIlB5U2VxdWVuY2VfTGVuZ3RoIgotICAiUHlTZXF1ZW5jZV9Db25jYXQiCi0gICJQeVNlcXVlbmNlX1JlcGVhdCIKICAgIlB5U2VxdWVuY2VfRGVsU2xpY2UiCiAgICJQeVNlcXVlbmNlX0xpc3QiCi0gICJQeVNlcXVlbmNlX0Zhc3QiCiAgICJQeVNlcXVlbmNlX0NvdW50IgogICAiUHlTZXF1ZW5jZV9Db250YWlucyIKICAgIlB5U2VxdWVuY2VfSW4iCiAgICJQeVNlcXVlbmNlX0luZGV4IgotICAiUHlTZXF1ZW5jZV9JblBsYWNlQ29uY2F0IgotICAiUHlTZXF1ZW5jZV9JblBsYWNlUmVwZWF0IgogICAiUHlNYXBwaW5nX0NoZWNrIgogICAiUHlNYXBwaW5nX0xlbmd0aCIKICAgIlB5TWFwcGluZ19IYXNLZXlTdHJpbmciCkBAIC0xNzAsMTMgKzE3NSwxMyBAQAogICAiUHlPYmplY3RfSXNJbnN0YW5jZSIKICAgIlB5T2JqZWN0X0lzU3ViY2xhc3MiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihib29sb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGJvb2xvYmplY3QpCiAgICJQeUJvb2xfRnJvbUxvbmciCiAgICJQeUJvb2xfVHlwZSIKICAgIl9QeV9aZXJvU3RydWN0IgogICAiX1B5X1RydWVTdHJ1Y3QiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihidWZmZXJvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYnVmZmVyb2JqZWN0KQogICAiUHlCdWZmZXJfRnJvbU9iamVjdCIKICAgIlB5QnVmZmVyX0Zyb21SZWFkV3JpdGVPYmplY3QiCiAgICJQeUJ1ZmZlcl9Gcm9tTWVtb3J5IgpAQCAtMTg0LDEzICsxODksMTMgQEAKICAgIlB5QnVmZmVyX05ldyIKICAgIlB5QnVmZmVyX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjZWxsb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNlbGxvYmplY3QpCiAgICJQeUNlbGxfTmV3IgogICAiUHlDZWxsX0dldCIKICAgIlB5Q2VsbF9TZXQiCiAgICJQeUNlbGxfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNsYXNzb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNsYXNzb2JqZWN0KQogICAiUHlDbGFzc19OZXciCiAgICJQeUNsYXNzX0lzU3ViY2xhc3MiCiAgICJQeUluc3RhbmNlX05ldyIKQEAgLTIwNSw3ICsyMTAsNyBAQAogICAiUHlJbnN0YW5jZV9UeXBlIgogICAiUHlNZXRob2RfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY29iamVjdCkKICAgIlB5Q09iamVjdF9Gcm9tVm9pZFB0ciIKICAgIlB5Q09iamVjdF9Gcm9tVm9pZFB0ckFuZERlc2MiCiAgICJQeUNPYmplY3RfQXNWb2lkUHRyIgpAQCAtMjE0LDcgKzIxOSwxMyBAQAogICAiUHlDT2JqZWN0X1NldFZvaWRQdHIiCiAgICJQeUNPYmplY3RfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNvbXBsZXhvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY29kZW9iamVjdCkKKyAgIlB5Q29kZV9OZXciCisgICJQeUNvZGVfQWRkcjJMaW5lIgorICAiUHlDb2RlX0NoZWNrTGluZU51bWJlciIKKyAgIlB5Q29kZV9UeXBlIgorCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY29tcGxleG9iamVjdCkKICAgIl9QeV9jX3BvdyIKICAgIl9QeV9jX3N1bSIKICAgIl9QeV9jX2RpZmYiCkBAIC0yMjgsNyArMjM5LDcgQEAKICAgIlB5Q29tcGxleF9Bc0NDb21wbGV4IgogICAiUHlDb21wbGV4X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihkZXNjcm9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihkZXNjcm9iamVjdCkKICAgIlB5V3JhcHBlcl9OZXciCiAgICJQeURlc2NyX05ld01ldGhvZCIKICAgIlB5RGVzY3JfTmV3Q2xhc3NNZXRob2QiCkBAIC0yMzksOCArMjUwLDkgQEAKICAgIlB5V3JhcHBlckRlc2NyX1R5cGUiCiAgICJQeVByb3BlcnR5X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihkaWN0b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGRpY3RvYmplY3QpCiAgICJQeURpY3RfTmV3IgorICAiUHlEaWN0X0dldEl0ZW0iCiAgICJQeURpY3RfU2V0SXRlbSIKICAgIlB5RGljdF9EZWxJdGVtIgogICAiUHlEaWN0X0NsZWFyIgpAQCAtMjQ5LDcgKzI2MSw2IEBACiAgICJQeURpY3RfS2V5cyIKICAgIlB5RGljdF9WYWx1ZXMiCiAgICJQeURpY3RfQ29udGFpbnMiCi0gICJQeURpY3RfR2V0SXRlbSIKICAgIlB5RGljdF9OZXh0IgogICAiUHlEaWN0X0l0ZW1zIgogICAiUHlEaWN0X1NpemUiCkBAIC0yNjMsMTEgKzI3NCwxMiBAQAogICAiUHlEaWN0SXRlclZhbHVlX1R5cGUiCiAgICJQeURpY3RJdGVySXRlbV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZW51bW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihlbnVtb2JqZWN0KQogICAiUHlFbnVtX1R5cGUiCiAgICJQeVJldmVyc2VkX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihmaWxlb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZpbGVvYmplY3QpCisgICJQeUZpbGVfRnJvbVN0cmluZyIKICAgIlB5X1VuaXZlcnNhbE5ld2xpbmVGcmVhZCIKICAgIlB5RmlsZV9HZXRMaW5lIgogICAiUHlGaWxlX1NvZnRTcGFjZSIKQEAgLTI3NSw3ICsyODcsNiBAQAogICAiUHlGaWxlX1dyaXRlU3RyaW5nIgogICAiUHlPYmplY3RfQXNGaWxlRGVzY3JpcHRvciIKICAgIlB5X1VuaXZlcnNhbE5ld2xpbmVGZ2V0cyIKLSAgIlB5RmlsZV9Gcm9tU3RyaW5nIgogICAiUHlGaWxlX1NldEJ1ZlNpemUiCiAgICJQeUZpbGVfU2V0RW5jb2RpbmciCiAgICJQeUZpbGVfRnJvbUZpbGUiCkBAIC0yODMsMjEgKzI5NCwyMiBAQAogICAiUHlGaWxlX05hbWUiCiAgICJQeUZpbGVfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZsb2F0b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZsb2F0b2JqZWN0KQogICAiUHlGbG9hdF9Gcm9tU3RyaW5nIgogICAiUHlGbG9hdF9Bc0RvdWJsZSIKICAgIlB5RmxvYXRfRmluaSIKICAgIl9QeUZsb2F0X1BhY2s0IgogICAiX1B5RmxvYXRfUGFjazgiCisgICJfUHlGbG9hdF9VbnBhY2s0IgorICAiX1B5RmxvYXRfVW5wYWNrOCIKICAgIlB5RmxvYXRfRnJvbURvdWJsZSIKICAgIlB5RmxvYXRfQXNSZXByU3RyaW5nIgogICAiUHlGbG9hdF9Bc1N0cmluZyIKLSAgIl9QeUZsb2F0X1VucGFjazQiCi0gICJfUHlGbG9hdF9VbnBhY2s4IgorICAiX1B5RmxvYXRfSW5pdCIKICAgIlB5RmxvYXRfQXNTdHJpbmdFeCIKICAgIlB5RmxvYXRfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZyYW1lb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZyYW1lb2JqZWN0KQogICAiUHlGcmFtZV9OZXciCiAgICJQeUZyYW1lX0Zhc3RUb0xvY2FscyIKICAgIlB5RnJhbWVfTG9jYWxzVG9GYXN0IgpAQCAtMzA3LDcgKzMxOSw3IEBACiAgICJQeUZyYW1lX0Jsb2NrUG9wIgogICAiUHlGcmFtZV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZnVuY29iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihmdW5jb2JqZWN0KQogICAiUHlGdW5jdGlvbl9OZXciCiAgICJQeUZ1bmN0aW9uX0dldENvZGUiCiAgICJQeUZ1bmN0aW9uX0dldEdsb2JhbHMiCkBAIC0zMjIsMjkgKzMzNCwzMyBAQAogICAiUHlDbGFzc01ldGhvZF9UeXBlIgogICAiUHlTdGF0aWNNZXRob2RfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdlbm9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZW5vYmplY3QpCiAgICJQeUdlbl9OZXciCisgICJQeUdlbl9OZWVkc0ZpbmFsaXppbmciCiAgICJQeUdlbl9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoaW50b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGludG9iamVjdCkKICAgIlB5SW50X0FzTG9uZyIKICAgIlB5SW50X0FzVW5zaWduZWRMb25nTWFzayIKICAgIlB5SW50X0FzVW5zaWduZWRMb25nTG9uZ01hc2siCiAgICJQeUludF9Gcm9tU3RyaW5nIgorICAiUHlJbnRfQXNTc2l6ZV90IgogICAiUHlJbnRfRmluaSIKICAgIlB5SW50X0Zyb21Vbmljb2RlIgogICAiUHlJbnRfRnJvbUxvbmciCisgICJQeUludF9Gcm9tU2l6ZV90IgorICAiUHlJbnRfRnJvbVNzaXplX3QiCiAgICJQeUludF9HZXRNYXgiCiAgICJfUHlJbnRfSW5pdCIKICAgIlB5SW50X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihpdGVyb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGl0ZXJvYmplY3QpCiAgICJQeVNlcUl0ZXJfTmV3IgogICAiUHlDYWxsSXRlcl9OZXciCiAgICJQeVNlcUl0ZXJfVHlwZSIKICAgIlB5Q2FsbEl0ZXJfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGxpc3RvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobGlzdG9iamVjdCkKICAgIlB5TGlzdF9OZXciCiAgICJQeUxpc3RfQXBwZW5kIgogICAiUHlMaXN0X1NpemUiCkBAIC0zNTcsMjcgKzM3MywzMSBAQAogICAiUHlMaXN0X1JldmVyc2UiCiAgICJQeUxpc3RfQXNUdXBsZSIKICAgIl9QeUxpc3RfRXh0ZW5kIgorICAiUHlMaXN0X0ZpbmkiCiAgICJQeUxpc3RfVHlwZSIKICAgIlB5TGlzdEl0ZXJfVHlwZSIKICAgIlB5TGlzdFJldkl0ZXJfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGxvbmdvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobG9uZ29iamVjdCkKICAgIlB5TG9uZ19Gcm9tRG91YmxlIgogICAiUHlMb25nX0FzTG9uZyIKKyAgIl9QeUxvbmdfQXNTc2l6ZV90IgogICAiUHlMb25nX0FzVW5zaWduZWRMb25nIgogICAiX1B5TG9uZ19Gcm9tQnl0ZUFycmF5IgogICAiX1B5TG9uZ19Bc0J5dGVBcnJheSIKICAgIlB5TG9uZ19Bc0RvdWJsZSIKKyAgIlB5TG9uZ19Gcm9tTG9uZ0xvbmciCisgICJQeUxvbmdfQXNMb25nTG9uZyIKICAgIlB5TG9uZ19Gcm9tU3RyaW5nIgogICAiUHlMb25nX0Zyb21Mb25nIgogICAiUHlMb25nX0Zyb21VbnNpZ25lZExvbmciCiAgICJQeUxvbmdfQXNVbnNpZ25lZExvbmdNYXNrIgorICAiX1B5TG9uZ19Gcm9tU2l6ZV90IgorICAiX1B5TG9uZ19Gcm9tU3NpemVfdCIKICAgIl9QeUxvbmdfQXNTY2FsZWREb3VibGUiCiAgICJQeUxvbmdfRnJvbVZvaWRQdHIiCiAgICJQeUxvbmdfQXNWb2lkUHRyIgotICAiUHlMb25nX0Zyb21Mb25nTG9uZyIKICAgIlB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyIKLSAgIlB5TG9uZ19Bc0xvbmdMb25nIgogICAiUHlMb25nX0FzVW5zaWduZWRMb25nTG9uZyIKICAgIlB5TG9uZ19Bc1Vuc2lnbmVkTG9uZ0xvbmdNYXNrIgogICAiUHlMb25nX0Zyb21Vbmljb2RlIgpAQCAtMzg2LDggKzQwNiw5IEBACiAgICJfUHlMb25nX05ldyIKICAgIl9QeUxvbmdfQ29weSIKICAgIlB5TG9uZ19UeXBlIgorICAiX1B5TG9uZ19EaWdpdFZhbHVlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobWV0aG9kb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1ldGhvZG9iamVjdCkKICAgIlB5Q0Z1bmN0aW9uX0NhbGwiCiAgICJQeV9GaW5kTWV0aG9kSW5DaGFpbiIKICAgIlB5Q0Z1bmN0aW9uX0dldEZ1bmN0aW9uIgpAQCAtMzk5LDcgKzQyMCw3IEBACiAgICJQeUNGdW5jdGlvbl9OZXciCiAgICJQeUNGdW5jdGlvbl9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobW9kdWxlb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1vZHVsZW9iamVjdCkKICAgIlB5TW9kdWxlX05ldyIKICAgIl9QeU1vZHVsZV9DbGVhciIKICAgIlB5TW9kdWxlX0dldERpY3QiCkBAIC00MDcsMTAgKzQyOCwxMSBAQAogICAiUHlNb2R1bGVfR2V0RmlsZW5hbWUiCiAgICJQeU1vZHVsZV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIob2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG9iamVjdCkKICAgIlB5X0RpdmlzaW9uV2FybmluZ0ZsYWciCiAgICJQeU9iamVjdF9TdHIiCiAgICJQeU9iamVjdF9SZXByIgorICAiX1B5T2JqZWN0X1N0ciIKICAgIlB5T2JqZWN0X1VuaWNvZGUiCiAgICJQeU9iamVjdF9HZXRBdHRyIgogICAiUHlPYmplY3RfSXNUcnVlIgpAQCAtNDU5LDI3ICs0ODEsMzggQEAKICAgIl9QeVRyYXNoX2RlbGV0ZV9uZXN0aW5nIgogICAiX1B5VHJhc2hfZGVsZXRlX2xhdGVyIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIob2JtYWxsb2MpCis7IEZyb20gcHl0aG9uMjVfcy5saWIob2JtYWxsb2MpCiAgICJQeU9iamVjdF9NYWxsb2MiCi0gICJQeU9iamVjdF9SZWFsbG9jIgogICAiUHlPYmplY3RfRnJlZSIKKyAgIlB5T2JqZWN0X1JlYWxsb2MiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihyYW5nZW9iamVjdCkKLSAgIlB5UmFuZ2VfTmV3IgorOyBGcm9tIHB5dGhvbjI1X3MubGliKHJhbmdlb2JqZWN0KQogICAiUHlSYW5nZV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc2V0b2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHNldG9iamVjdCkKKyAgIlB5U2V0X1BvcCIKKyAgIlB5U2V0X05ldyIKKyAgIlB5RnJvemVuU2V0X05ldyIKKyAgIlB5U2V0X1NpemUiCisgICJQeVNldF9DbGVhciIKKyAgIlB5U2V0X0NvbnRhaW5zIgorICAiUHlTZXRfRGlzY2FyZCIKKyAgIlB5U2V0X0FkZCIKKyAgIl9QeVNldF9OZXh0IgorICAiX1B5U2V0X1VwZGF0ZSIKKyAgIlB5U2V0X0ZpbmkiCiAgICJQeVNldF9UeXBlIgogICAiUHlGcm96ZW5TZXRfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHNsaWNlb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHNsaWNlb2JqZWN0KQorICAiX1B5U2xpY2VfRnJvbUluZGljZXMiCiAgICJQeVNsaWNlX0dldEluZGljZXMiCiAgICJQeVNsaWNlX0dldEluZGljZXNFeCIKICAgIlB5U2xpY2VfTmV3IgogICAiX1B5X0VsbGlwc2lzT2JqZWN0IgogICAiUHlTbGljZV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3RyaW5nb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHN0cmluZ29iamVjdCkKICAgIlB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIgogICAiUHlTdHJpbmdfSW50ZXJuSW5QbGFjZSIKICAgIlB5U3RyaW5nX0Zyb21TdHJpbmciCkBAIC00OTAsMTIgKzUyMywxMiBAQAogICAiUHlTdHJpbmdfQXNEZWNvZGVkU3RyaW5nIgogICAiUHlTdHJpbmdfQXNFbmNvZGVkU3RyaW5nIgogICAiUHlTdHJpbmdfRGVjb2RlRXNjYXBlIgotICAiUHlTdHJpbmdfU2l6ZSIKICAgIlB5U3RyaW5nX1JlcHIiCiAgICJQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUiCiAgICJfUHlTdHJpbmdfRm9ybWF0TG9uZyIKICAgIlB5U3RyaW5nX0Zvcm1hdCIKICAgIl9QeV9SZWxlYXNlSW50ZXJuZWRTdHJpbmdzIgorICAiUHlTdHJpbmdfU2l6ZSIKICAgIlB5U3RyaW5nX0NvbmNhdCIKICAgIlB5U3RyaW5nX0NvbmNhdEFuZERlbCIKICAgIl9QeVN0cmluZ19FcSIKQEAgLTUxMCwxMiArNTQzLDEyIEBACiAgICJQeVN0cmluZ19UeXBlIgogICAiUHlCYXNlU3RyaW5nX1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzdHJ1Y3RzZXEpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3RydWN0c2VxKQogICAiUHlTdHJ1Y3RTZXF1ZW5jZV9Jbml0VHlwZSIKICAgIlB5U3RydWN0U2VxdWVuY2VfTmV3IgogICAiUHlTdHJ1Y3RTZXF1ZW5jZV9Vbm5hbWVkRmllbGQiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0dXBsZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYih0dXBsZW9iamVjdCkKICAgIlB5VHVwbGVfTmV3IgogICAiUHlUdXBsZV9QYWNrIgogICAiX1B5VHVwbGVfUmVzaXplIgpAQCAtNTI3LDcgKzU2MCw3IEBACiAgICJQeVR1cGxlX1R5cGUiCiAgICJQeVR1cGxlSXRlcl9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIodHlwZW9iamVjdCkKKzsgRnJvbSBweXRob24yNV9zLmxpYih0eXBlb2JqZWN0KQogICAiUHlUeXBlX0lzU3VidHlwZSIKICAgIl9QeVR5cGVfTG9va3VwIgogICAiUHlUeXBlX1JlYWR5IgpAQCAtNTM4LDcgKzU3MSw3IEBACiAgICJQeUJhc2VPYmplY3RfVHlwZSIKICAgIlB5U3VwZXJfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHVuaWNvZGVvYmplY3QpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodW5pY29kZW9iamVjdCkKICAgIlB5VW5pY29kZVVDUzJfUmVzaXplIgogICAiUHlVbmljb2RlVUNTMl9Gcm9tT3JkaW5hbCIKICAgIlB5VW5pY29kZVVDUzJfRnJvbU9iamVjdCIKQEAgLTU2MSwxMyArNTk0LDE0IEBACiAgICJQeVVuaWNvZGVVQ1MyX0RlY29kZVVuaWNvZGVFc2NhcGUiCiAgICJQeVVuaWNvZGVVQ1MyX0RlY29kZVJhd1VuaWNvZGVFc2NhcGUiCiAgICJQeVVuaWNvZGVVQ1MyX0VuY29kZVJhd1VuaWNvZGVFc2NhcGUiCisgICJfUHlVbmljb2RlX0RlY29kZVVuaWNvZGVJbnRlcm5hbCIKICAgIlB5VW5pY29kZVVDUzJfRGVjb2RlQ2hhcm1hcCIKKyAgIlB5VW5pY29kZV9CdWlsZEVuY29kaW5nTWFwIgogICAiUHlVbmljb2RlVUNTMl9FbmNvZGVDaGFybWFwIgogICAiUHlVbmljb2RlVUNTMl9UcmFuc2xhdGVDaGFybWFwIgogICAiUHlVbmljb2RlVUNTMl9FbmNvZGVEZWNpbWFsIgogICAiUHlVbmljb2RlVUNTMl9Db3VudCIKICAgIlB5VW5pY29kZVVDUzJfRmluZCIKLSAgIlB5VW5pY29kZVVDUzJfVGFpbG1hdGNoIgogICAiUHlVbmljb2RlVUNTMl9Kb2luIgogICAiUHlVbmljb2RlVUNTMl9TcGxpdGxpbmVzIgogICAiUHlVbmljb2RlVUNTMl9Db21wYXJlIgpAQCAtNTc4LDYgKzYxMiw3IEBACiAgICJQeVVuaWNvZGVVQ1MyX1NwbGl0IgogICAiUHlVbmljb2RlVUNTMl9SU3BsaXQiCiAgICJQeVVuaWNvZGVVQ1MyX0Zvcm1hdCIKKyAgIl9QeVVuaWNvZGVVQ1MyX0luaXQiCiAgICJfUHlVbmljb2RlVUNTMl9GaW5pIgogICAiUHlVbmljb2RlVUNTMl9Gcm9tVW5pY29kZSIKICAgIlB5VW5pY29kZVVDUzJfQXNVbmljb2RlIgpAQCAtNTk1LDEyICs2MzAsMTQgQEAKICAgIlB5VW5pY29kZVVDUzJfRW5jb2RlTGF0aW4xIgogICAiUHlVbmljb2RlVUNTMl9FbmNvZGVBU0NJSSIKICAgIlB5VW5pY29kZVVDUzJfQXNDaGFybWFwU3RyaW5nIgorICAiUHlVbmljb2RlVUNTMl9QYXJ0aXRpb24iCisgICJQeVVuaWNvZGVVQ1MyX1JQYXJ0aXRpb24iCiAgICJQeVVuaWNvZGVVQ1MyX1RyYW5zbGF0ZSIKKyAgIlB5VW5pY29kZVVDUzJfVGFpbG1hdGNoIgogICAiUHlVbmljb2RlX0FzRGVjb2RlZE9iamVjdCIKLSAgIl9QeVVuaWNvZGVVQ1MyX0luaXQiCiAgICJQeVVuaWNvZGVfVHlwZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHVuaWNvZGVjdHlwZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYih1bmljb2RlY3R5cGUpCiAgICJfUHlVbmljb2RlX1R5cGVSZWNvcmRzIgogICAiX1B5VW5pY29kZVVDUzJfVG9OdW1lcmljIgogICAiX1B5VW5pY29kZVVDUzJfSXNMb3dlcmNhc2UiCkBAIC02MTgsNyArNjU1LDcgQEAKICAgIl9QeVVuaWNvZGVVQ1MyX0lzTnVtZXJpYyIKICAgIl9QeVVuaWNvZGVVQ1MyX0lzQWxwaGEiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih3ZWFrcmVmb2JqZWN0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHdlYWtyZWZvYmplY3QpCiAgICJQeVdlYWtyZWZfTmV3UmVmIgogICAiUHlXZWFrcmVmX05ld1Byb3h5IgogICAiUHlPYmplY3RfQ2xlYXJXZWFrUmVmcyIKQEAgLTYyOSw2MSArNjY2LDgyIEBACiAgICJfUHlXZWFrcmVmX1Byb3h5VHlwZSIKICAgIl9QeVdlYWtyZWZfQ2FsbGFibGVQcm94eVR5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihibHRpbm1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihQeXRob24tYXN0KQorOyAgImluaXRfYXN0IgorICAiTW9kdWxlIgorICAiSW50ZXJhY3RpdmUiCisgICJFeHByZXNzaW9uIgorICAiU3VpdGUiCisgICJGdW5jdGlvbkRlZiIKKyAgIkNsYXNzRGVmIgorICAiUmV0dXJuIgorICAiRGVsZXRlIgorICAiQXNzaWduIgorICAiQXVnQXNzaWduIgorICAiUHJpbnQiCisgICJGb3IiCisgICJXaGlsZSIKKyAgIklmIgorICAiV2l0aCIKKyAgIlJhaXNlIgorICAiVHJ5RXhjZXB0IgorICAiVHJ5RmluYWxseSIKKyAgIkFzc2VydCIKKyAgIkltcG9ydCIKKyAgIkltcG9ydEZyb20iCisgICJFeGVjIgorICAiR2xvYmFsIgorICAiRXhwciIKKyAgIlBhc3MiCisgICJCcmVhayIKKyAgIkNvbnRpbnVlIgorICAiQm9vbE9wIgorICAiQmluT3AiCisgICJVbmFyeU9wIgorICAiTGFtYmRhIgorICAiSWZFeHAiCisgICJEaWN0IgorICAiTGlzdENvbXAiCisgICJHZW5lcmF0b3JFeHAiCisgICJZaWVsZCIKKyAgIkNvbXBhcmUiCisgICJDYWxsIgorICAiUmVwciIKKyAgIk51bSIKKyAgIlN0ciIKKyAgIkF0dHJpYnV0ZSIKKyAgIlN1YnNjcmlwdCIKKyAgIk5hbWUiCisgICJMaXN0IgorICAiVHVwbGUiCisgICJFbGxpcHNpcyIKKyAgIlNsaWNlIgorICAiRXh0U2xpY2UiCisgICJJbmRleCIKKyAgImNvbXByZWhlbnNpb24iCisgICJleGNlcHRoYW5kbGVyIgorICAiYXJndW1lbnRzIgorICAia2V5d29yZCIKKyAgImFsaWFzIgorICAiUHlBU1RfbW9kMm9iaiIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKGFzZGwpCisgICJhc2RsX3NlcV9uZXciCisgICJhc2RsX2ludF9zZXFfbmV3IgorCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYXN0KQorICAiUHlBU1RfRnJvbU5vZGUiCisKKzsgRnJvbSBweXRob24yNV9zLmxpYihibHRpbm1vZHVsZSkKICAgIl9QeUJ1aWx0aW5fSW5pdCIKICAgIlB5X0ZpbGVTeXN0ZW1EZWZhdWx0RW5jb2RpbmciCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihleGNlcHRpb25zKQotICAiUHlFeGNfRXhjZXB0aW9uIgotICAiUHlFeGNfVHlwZUVycm9yIgotICAiUHlFeGNfU3RvcEl0ZXJhdGlvbiIKLSAgIlB5RXhjX1N0YW5kYXJkRXJyb3IiCi0gICJQeUV4Y19TeXN0ZW1FeGl0IgotICAiUHlFeGNfS2V5Ym9hcmRJbnRlcnJ1cHQiCi0gICJQeUV4Y19JbXBvcnRFcnJvciIKLSAgIlB5RXhjX0Vudmlyb25tZW50RXJyb3IiCi0gICJQeUV4Y19JT0Vycm9yIgotICAiUHlFeGNfT1NFcnJvciIKLSAgIlB5RXhjX0VPRkVycm9yIgotICAiUHlFeGNfUnVudGltZUVycm9yIgotICAiUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvciIKLSAgIlB5RXhjX05hbWVFcnJvciIKLSAgIlB5RXhjX1VuYm91bmRMb2NhbEVycm9yIgotICAiUHlFeGNfQXR0cmlidXRlRXJyb3IiCi0gICJQeUV4Y19TeW50YXhFcnJvciIKLSAgIlB5RXhjX0luZGVudGF0aW9uRXJyb3IiCi0gICJQeUV4Y19UYWJFcnJvciIKLSAgIlB5RXhjX0Fzc2VydGlvbkVycm9yIgotICAiUHlFeGNfTG9va3VwRXJyb3IiCi0gICJQeUV4Y19JbmRleEVycm9yIgotICAiUHlFeGNfS2V5RXJyb3IiCi0gICJQeUV4Y19Bcml0aG1ldGljRXJyb3IiCi0gICJQeUV4Y19PdmVyZmxvd0Vycm9yIgotICAiUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IiCi0gICJQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IiCi0gICJQeUV4Y19WYWx1ZUVycm9yIgotICAiUHlFeGNfVW5pY29kZUVycm9yIgotICAiUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIgotICAiUHlFeGNfVW5pY29kZURlY29kZUVycm9yIgotICAiUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIgotICAiUHlFeGNfUmVmZXJlbmNlRXJyb3IiCi0gICJQeUV4Y19TeXN0ZW1FcnJvciIKLSAgIlB5RXhjX01lbW9yeUVycm9yIgotICAiUHlFeGNfV2FybmluZyIKLSAgIlB5RXhjX1VzZXJXYXJuaW5nIgotICAiUHlFeGNfRGVwcmVjYXRpb25XYXJuaW5nIgotICAiUHlFeGNfUGVuZGluZ0RlcHJlY2F0aW9uV2FybmluZyIKLSAgIlB5RXhjX1N5bnRheFdhcm5pbmciCi0gICJQeUV4Y19PdmVyZmxvd1dhcm5pbmciCi0gICJQeUV4Y19SdW50aW1lV2FybmluZyIKLSAgIlB5RXhjX0Z1dHVyZVdhcm5pbmciCi0gICJQeUV4Y19NZW1vcnlFcnJvckluc3QiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZXhjZXB0aW9ucykKICAgIlB5VW5pY29kZUVuY29kZUVycm9yX0dldFN0YXJ0IgogICAiUHlVbmljb2RlRGVjb2RlRXJyb3JfR2V0U3RhcnQiCiAgICJQeVVuaWNvZGVFbmNvZGVFcnJvcl9HZXRFbmQiCiAgICJQeVVuaWNvZGVEZWNvZGVFcnJvcl9HZXRFbmQiCiAgICJfUHlFeGNfSW5pdCIKLSAgIl9QeUV4Y19GaW5pIgogICAiUHlVbmljb2RlRGVjb2RlRXJyb3JfQ3JlYXRlIgogICAiUHlVbmljb2RlRW5jb2RlRXJyb3JfQ3JlYXRlIgogICAiUHlVbmljb2RlVHJhbnNsYXRlRXJyb3JfQ3JlYXRlIgpAQCAtNzA2LDEyICs3NjQsNTggQEAKICAgIlB5VW5pY29kZUVuY29kZUVycm9yX1NldFJlYXNvbiIKICAgIlB5VW5pY29kZURlY29kZUVycm9yX1NldFJlYXNvbiIKICAgIlB5VW5pY29kZVRyYW5zbGF0ZUVycm9yX1NldFJlYXNvbiIKKyAgIl9QeUV4Y19GaW5pIgorICAiUHlFeGNfQmFzZUV4Y2VwdGlvbiIKKyAgIlB5RXhjX0V4Y2VwdGlvbiIKKyAgIlB5RXhjX1N0YW5kYXJkRXJyb3IiCisgICJQeUV4Y19UeXBlRXJyb3IiCisgICJQeUV4Y19TdG9wSXRlcmF0aW9uIgorICAiUHlFeGNfR2VuZXJhdG9yRXhpdCIKKyAgIlB5RXhjX1N5c3RlbUV4aXQiCisgICJQeUV4Y19LZXlib2FyZEludGVycnVwdCIKKyAgIlB5RXhjX0ltcG9ydEVycm9yIgorICAiUHlFeGNfRW52aXJvbm1lbnRFcnJvciIKKyAgIlB5RXhjX0lPRXJyb3IiCisgICJQeUV4Y19PU0Vycm9yIgorICAiUHlFeGNfRU9GRXJyb3IiCisgICJQeUV4Y19SdW50aW1lRXJyb3IiCisgICJQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yIgorICAiUHlFeGNfTmFtZUVycm9yIgorICAiUHlFeGNfVW5ib3VuZExvY2FsRXJyb3IiCisgICJQeUV4Y19BdHRyaWJ1dGVFcnJvciIKKyAgIlB5RXhjX0luZGV4RXJyb3IiCisgICJQeUV4Y19TeW50YXhFcnJvciIKKyAgIlB5RXhjX0luZGVudGF0aW9uRXJyb3IiCisgICJQeUV4Y19UYWJFcnJvciIKKyAgIlB5RXhjX0xvb2t1cEVycm9yIgorICAiUHlFeGNfS2V5RXJyb3IiCisgICJQeUV4Y19WYWx1ZUVycm9yIgorICAiUHlFeGNfVW5pY29kZUVycm9yIgorICAiUHlFeGNfVW5pY29kZUVuY29kZUVycm9yIgorICAiUHlFeGNfVW5pY29kZURlY29kZUVycm9yIgorICAiUHlFeGNfVW5pY29kZVRyYW5zbGF0ZUVycm9yIgorICAiUHlFeGNfQXNzZXJ0aW9uRXJyb3IiCisgICJQeUV4Y19Bcml0aG1ldGljRXJyb3IiCisgICJQeUV4Y19GbG9hdGluZ1BvaW50RXJyb3IiCisgICJQeUV4Y19PdmVyZmxvd0Vycm9yIgorICAiUHlFeGNfWmVyb0RpdmlzaW9uRXJyb3IiCisgICJQeUV4Y19TeXN0ZW1FcnJvciIKKyAgIlB5RXhjX1JlZmVyZW5jZUVycm9yIgorICAiUHlFeGNfTWVtb3J5RXJyb3IiCisgICJQeUV4Y19XYXJuaW5nIgorICAiUHlFeGNfVXNlcldhcm5pbmciCisgICJQeUV4Y19EZXByZWNhdGlvbldhcm5pbmciCisgICJQeUV4Y19QZW5kaW5nRGVwcmVjYXRpb25XYXJuaW5nIgorICAiUHlFeGNfU3ludGF4V2FybmluZyIKKyAgIlB5RXhjX1J1bnRpbWVXYXJuaW5nIgorICAiUHlFeGNfRnV0dXJlV2FybmluZyIKKyAgIlB5RXhjX0ltcG9ydFdhcm5pbmciCisgICJQeUV4Y19NZW1vcnlFcnJvckluc3QiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjZXZhbCkKLSAgIlB5RXZhbF9FdmFsRnJhbWUiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoY2V2YWwpCisgICJQeUV2YWxfRXZhbEZyYW1lRXgiCiAgICJQeUV2YWxfQ2FsbE9iamVjdFdpdGhLZXl3b3JkcyIKICAgIlB5RXZhbF9FdmFsQ29kZUV4IgotICAiX1B5RXZhbF9TbGljZUluZGV4IgogICAiUHlFdmFsX0dldEZyYW1lIgogICAiUHlFdmFsX0NhbGxPYmplY3QiCiAgICJQeUV2YWxfU2V0UHJvZmlsZSIKQEAgLTczMCwzNSArODM0LDMxIEBACiAgICJQeUV2YWxfR2V0RnVuY05hbWUiCiAgICJQeUV2YWxfR2V0RnVuY0Rlc2MiCiAgICJQeUV2YWxfR2V0Q2FsbFN0YXRzIgorICAiUHlFdmFsX0V2YWxGcmFtZSIKICAgIlB5RXZhbF9TYXZlVGhyZWFkIgogICAiUHlFdmFsX1Jlc3RvcmVUaHJlYWQiCisgICJQeUV2YWxfVGhyZWFkc0luaXRpYWxpemVkIgogICAiUHlFdmFsX0luaXRUaHJlYWRzIgogICAiUHlFdmFsX0FjcXVpcmVMb2NrIgogICAiUHlFdmFsX1JlbGVhc2VMb2NrIgogICAiUHlFdmFsX0FjcXVpcmVUaHJlYWQiCiAgICJQeUV2YWxfUmVsZWFzZVRocmVhZCIKICAgIlB5RXZhbF9SZUluaXRUaHJlYWRzIgorICAiX1B5RXZhbF9TbGljZUluZGV4IgogICAiUHlFdmFsX0V2YWxDb2RlIgogICAiX1B5RXZhbF9DYWxsVHJhY2luZyIKICAgIl9QeV9DaGVja1JlY3Vyc2lvbkxpbWl0IgogICAiX1B5X0NoZWNrSW50ZXJ2YWwiCiAgICJfUHlfVGlja2VyIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY29tcGlsZSkKLSAgIlB5Q29kZV9OZXciCi0gICJQeVN5bXRhYmxlX0ZyZWUiCi0gICJQeU5vZGVfQ29tcGlsZSIKLSAgIlB5Tm9kZV9Db21waWxlRmxhZ3MiCi0gICJQeUNvZGVfQWRkcjJMaW5lIgorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvbXBpbGUpCiAgICJfUHlfTWFuZ2xlIgotICAiUHlOb2RlX0NvbXBpbGVTeW10YWJsZSIKKyAgIlB5QVNUX0NvbXBpbGUiCisgICJQeU5vZGVfQ29tcGlsZSIKICAgIlB5X09wdGltaXplRmxhZyIKLSAgIlB5Q29kZV9UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY29kZWNzKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGNvZGVjcykKICAgIl9QeUNvZGVjX0xvb2t1cCIKLSAgIlB5Q29kZWNfU3RyZWFtUmVhZGVyIgotICAiUHlDb2RlY19TdHJlYW1Xcml0ZXIiCiAgICJQeUNvZGVjX0VuY29kZSIKICAgIlB5Q29kZWNfRGVjb2RlIgogICAiUHlDb2RlY19JZ25vcmVFcnJvcnMiCkBAIC03NjgsMTQgKzg2OCwxNyBAQAogICAiUHlDb2RlY19SZWdpc3RlciIKICAgIlB5Q29kZWNfRW5jb2RlciIKICAgIlB5Q29kZWNfRGVjb2RlciIKKyAgIlB5Q29kZWNfSW5jcmVtZW50YWxFbmNvZGVyIgorICAiUHlDb2RlY19JbmNyZW1lbnRhbERlY29kZXIiCisgICJQeUNvZGVjX1N0cmVhbVJlYWRlciIKKyAgIlB5Q29kZWNfU3RyZWFtV3JpdGVyIgogICAiUHlDb2RlY19SZWdpc3RlckVycm9yIgogICAiUHlDb2RlY19Mb29rdXBFcnJvciIKICAgIlB5Q29kZWNfU3RyaWN0RXJyb3JzIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZXJyb3JzKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGVycm9ycykKICAgIlB5RXJyX1NldE5vbmUiCiAgICJQeUVycl9TZXRTdHJpbmciCi0gICJQeUVycl9FeGNlcHRpb25NYXRjaGVzIgogICAiUHlFcnJfR2l2ZW5FeGNlcHRpb25NYXRjaGVzIgogICAiUHlFcnJfTm9ybWFsaXplRXhjZXB0aW9uIgogICAiUHlFcnJfRmV0Y2giCkBAIC03OTAsNiArODkzLDcgQEAKICAgIlB5RXJyX1NldE9iamVjdCIKICAgIlB5RXJyX09jY3VycmVkIgogICAiUHlFcnJfUmVzdG9yZSIKKyAgIlB5RXJyX0V4Y2VwdGlvbk1hdGNoZXMiCiAgICJQeUVycl9CYWRBcmd1bWVudCIKICAgIlB5RXJyX1NldEZyb21FcnJubyIKICAgIlB5RXJyX1NldEZyb21FcnJub1dpdGhGaWxlbmFtZSIKQEAgLTc5OCw0MiArOTAyLDQ4IEBACiAgICJQeUVycl9XYXJuIgogICAiUHlFcnJfV2FybkV4cGxpY2l0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZnJvemVuKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZyb3plbikKICAgIlB5SW1wb3J0X0Zyb3plbk1vZHVsZXMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihmcm96ZW5tYWluKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZyb3plbm1haW4pCiAgICJQeV9Gcm96ZW5NYWluIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZnV0dXJlKQotICAiUHlOb2RlX0Z1dHVyZSIKKzsgRnJvbSBweXRob24yNV9zLmxpYihmdXR1cmUpCisgICJQeUZ1dHVyZV9Gcm9tQVNUIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0YXJncykKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRhcmdzKQogICAiUHlBcmdfUGFyc2UiCisgICJfUHlBcmdfUGFyc2VfU2l6ZVQiCiAgICJQeUFyZ19QYXJzZVR1cGxlIgorICAiX1B5QXJnX1BhcnNlVHVwbGVfU2l6ZVQiCiAgICJQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMiCisgICJfUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUIgogICAiUHlBcmdfVW5wYWNrVHVwbGUiCisgICJfUHlBcmdfTm9LZXl3b3JkcyIKICAgIlB5QXJnX1ZhUGFyc2UiCiAgICJQeUFyZ19WYVBhcnNlVHVwbGVBbmRLZXl3b3JkcyIKKyAgIl9QeUFyZ19WYVBhcnNlX1NpemVUIgorICAiX1B5QXJnX1ZhUGFyc2VUdXBsZUFuZEtleXdvcmRzX1NpemVUIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0Y29tcGlsZXIpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2V0Y29tcGlsZXIpCiAgICJQeV9HZXRDb21waWxlciIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdldGNvcHlyaWdodCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRjb3B5cmlnaHQpCiAgICJQeV9HZXRDb3B5cmlnaHQiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZXRtdGltZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRtdGltZSkKICAgIlB5T1NfR2V0TGFzdE1vZGlmaWNhdGlvblRpbWUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihnZXRwbGF0Zm9ybSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXRwbGF0Zm9ybSkKICAgIlB5X0dldFBsYXRmb3JtIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0dmVyc2lvbikKKzsgRnJvbSBweXRob24yNV9zLmxpYihnZXR2ZXJzaW9uKQogICAiUHlfR2V0VmVyc2lvbiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGdyYW1pbml0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdyYW1pbml0KQogICAiX1B5UGFyc2VyX0dyYW1tYXIiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihpbXBvcnQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoaW1wb3J0KQogICAiX1B5SW1wb3J0X0luaXQiCiAgICJfUHlJbXBvcnRIb29rc19Jbml0IgogICAiUHlJbXBvcnRfSW1wb3J0TW9kdWxlIgpAQCAtODQzLDYgKzk1Myw3IEBACiAgICJQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4IgogICAiUHlJbXBvcnRfSW1wb3J0RnJvemVuTW9kdWxlIgogICAiUHlJbXBvcnRfSW1wb3J0TW9kdWxlRXgiCisgICJQeUltcG9ydF9JbXBvcnRNb2R1bGVMZXZlbCIKICAgIlB5SW1wb3J0X1JlbG9hZE1vZHVsZSIKICAgIlB5SW1wb3J0X0ltcG9ydCIKIDsgICJpbml0aW1wIgpAQCAtODUwLDE2ICs5NjEsMTkgQEAKICAgIlB5SW1wb3J0X0dldE1hZ2ljTnVtYmVyIgogICAiUHlJbXBvcnRfRXhlY0NvZGVNb2R1bGUiCiAgICJQeUltcG9ydF9HZXRNb2R1bGVEaWN0IgorICAiX1B5SW1wb3J0X0ZpbmRNb2R1bGUiCisgICJfUHlJbXBvcnRfSXNTY3JpcHQiCisgICJfUHlJbXBvcnRfUmVJbml0TG9jayIKICAgIl9QeUltcG9ydF9GaW5kRXh0ZW5zaW9uIgogICAiUHlJbXBvcnRfQXBwZW5kSW5pdHRhYiIKICAgIlB5SW1wb3J0X0V4dGVuZEluaXR0YWIiCiAgICJQeUltcG9ydF9Jbml0dGFiIgogICAiX1B5SW1wb3J0X0ZpbGV0YWIiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihpbXBvcnRkbCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihpbXBvcnRkbCkKICAgIl9QeUltcG9ydF9Mb2FkRHluYW1pY01vZHVsZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG1hcnNoYWwpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobWFyc2hhbCkKICAgIlB5TWFyc2hhbF9SZWFkTG9uZ0Zyb21GaWxlIgogICAiUHlNYXJzaGFsX1dyaXRlT2JqZWN0VG9TdHJpbmciCiAgICJQeU1hcnNoYWxfV3JpdGVMb25nVG9GaWxlIgpAQCAtODcwLDMxICs5ODQsNDAgQEAKICAgIlB5TWFyc2hhbF9SZWFkT2JqZWN0RnJvbVN0cmluZyIKICAgIlB5TWFyc2hhbF9Jbml0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIobW9kc3VwcG9ydCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihtb2RzdXBwb3J0KQogICAiUHlfSW5pdE1vZHVsZTQiCiAgICJQeV9CdWlsZFZhbHVlIgotICAiUHlfVmFCdWlsZFZhbHVlIgorICAiX1B5X0J1aWxkVmFsdWVfU2l6ZVQiCiAgICJQeUV2YWxfQ2FsbEZ1bmN0aW9uIgogICAiUHlFdmFsX0NhbGxNZXRob2QiCisgICJfUHlfVmFCdWlsZFZhbHVlX1NpemVUIgorICAiUHlfVmFCdWlsZFZhbHVlIgogICAiUHlNb2R1bGVfQWRkT2JqZWN0IgogICAiUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQiCiAgICJQeU1vZHVsZV9BZGRTdHJpbmdDb25zdGFudCIKICAgIl9QeV9QYWNrYWdlQ29udGV4dCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG15c25wcmludGYpCis7IEZyb20gcHl0aG9uMjVfcy5saWIobXlzbnByaW50ZikKICAgIlB5T1Nfc25wcmludGYiCiAgICJQeU9TX3ZzbnByaW50ZiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKG15c3RydG91bCkKKzsgRnJvbSBweXRob24yNV9zLmxpYihteXN0cnRvdWwpCiAgICJQeU9TX3N0cnRvdWwiCiAgICJQeU9TX3N0cnRvbCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHB5ZnBlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHB5YXJlbmEpCisgICJQeUFyZW5hX05ldyIKKyAgIlB5QXJlbmFfRnJlZSIKKyAgIlB5QXJlbmFfTWFsbG9jIgorICAiUHlBcmVuYV9BZGRQeU9iamVjdCIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKHB5ZnBlKQogICAiUHlGUEVfZHVtbXkiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihweXN0YXRlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHB5c3RhdGUpCiAgICJQeUludGVycHJldGVyU3RhdGVfQ2xlYXIiCiAgICJQeVRocmVhZFN0YXRlX0NsZWFyIgorICAiX1B5VGhyZWFkX0N1cnJlbnRGcmFtZXMiCiAgICJQeUdJTFN0YXRlX0Vuc3VyZSIKICAgIlB5R0lMU3RhdGVfUmVsZWFzZSIKICAgIlB5SW50ZXJwcmV0ZXJTdGF0ZV9OZXciCkBAIC05MTYsMTIgKzEwMzksMTIgQEAKICAgIl9QeVRocmVhZFN0YXRlX0N1cnJlbnQiCiAgICJfUHlUaHJlYWRTdGF0ZV9HZXRGcmFtZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHB5c3RydG9kKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHB5c3RydG9kKQogICAiUHlPU19hc2NpaV9zdHJ0b2QiCiAgICJQeU9TX2FzY2lpX2Zvcm1hdGQiCiAgICJQeU9TX2FzY2lpX2F0b2YiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihweXRob25ydW4pCis7IEZyb20gcHl0aG9uMjVfcy5saWIocHl0aG9ucnVuKQogICAiUHlfSWdub3JlRW52aXJvbm1lbnRGbGFnIgogICAiUHlfRGVidWdGbGFnIgogICAiUHlfVmVyYm9zZUZsYWciCkBAIC05MzMsNiArMTA1Niw3IEBACiAgICJQeV9OZXdJbnRlcnByZXRlciIKICAgIlB5RXJyX1ByaW50IgogICAiUHlSdW5fSW50ZXJhY3RpdmVPbmVGbGFncyIKKyAgIlB5UGFyc2VyX0FTVEZyb21GaWxlIgogICAiUHlSdW5fU2ltcGxlRmlsZUV4RmxhZ3MiCiAgICJQeVJ1bl9GaWxlRXhGbGFncyIKICAgIlB5X0V4aXQiCkBAIC05NDYsMjkgKzEwNzAsMTUgQEAKICAgIlB5X0ZpbmFsaXplIgogICAiUHlfSXNJbml0aWFsaXplZCIKICAgIlB5X0VuZEludGVycHJldGVyIgotICAiUHlSdW5fQW55RmlsZSIKLSAgIlB5UnVuX0FueUZpbGVFeEZsYWdzIgotICAiUHlSdW5fQW55RmlsZUV4IgogICAiUHlSdW5fQW55RmlsZUZsYWdzIgogICAiUHlfRmRJc0ludGVyYWN0aXZlIgogICAiUHlSdW5fSW50ZXJhY3RpdmVMb29wRmxhZ3MiCi0gICJQeVJ1bl9TaW1wbGVTdHJpbmciCisgICJQeVJ1bl9BbnlGaWxlRXhGbGFncyIKICAgIlB5UnVuX1NpbXBsZVN0cmluZ0ZsYWdzIgogICAiUHlSdW5fU3RyaW5nRmxhZ3MiCi0gICJQeVJ1bl9TaW1wbGVGaWxlIgotICAiUHlSdW5fU2ltcGxlRmlsZUV4IgotICAiUHlSdW5fSW50ZXJhY3RpdmVPbmUiCi0gICJQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AiCi0gICJQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZyIKLSAgIlB5UGFyc2VyX1NpbXBsZVBhcnNlRmlsZSIKKyAgIlB5UGFyc2VyX0FTVEZyb21TdHJpbmciCiAgICJQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzIgotICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmdGbGFnc0ZpbGVuYW1lIgogICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlRmxhZ3MiCi0gICJQeVJ1bl9TdHJpbmciCi0gICJQeVJ1bl9GaWxlIgotICAiUHlSdW5fRmlsZUV4IgotICAiUHlSdW5fRmlsZUZsYWdzIgotICAiUHlfQ29tcGlsZVN0cmluZyIKICAgIlB5X0NvbXBpbGVTdHJpbmdGbGFncyIKICAgIlB5X1N5bXRhYmxlU3RyaW5nIgogICAiUHlfQXRFeGl0IgpAQCAtOTc2LDQ5ICsxMDg2LDY5IEBACiAgICJQeU9TX3NldHNpZyIKICAgIlB5UGFyc2VyX1NldEVycm9yIgogICAiUHlNb2R1bGVfR2V0V2FybmluZ3NNb2R1bGUiCisgICJQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZsYWdzRmlsZW5hbWUiCiAgICJQeVBhcnNlcl9TaW1wbGVQYXJzZVN0cmluZ0ZpbGVuYW1lIgorICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VGaWxlIgorICAiUHlQYXJzZXJfU2ltcGxlUGFyc2VTdHJpbmciCisgICJQeVJ1bl9BbnlGaWxlIgorICAiUHlSdW5fQW55RmlsZUV4IgorICAiUHlSdW5fRmlsZSIKKyAgIlB5UnVuX0ZpbGVFeCIKKyAgIlB5UnVuX0ZpbGVGbGFncyIKKyAgIlB5UnVuX1NpbXBsZUZpbGUiCisgICJQeVJ1bl9TaW1wbGVGaWxlRXgiCisgICJQeVJ1bl9TdHJpbmciCisgICJQeVJ1bl9TaW1wbGVTdHJpbmciCisgICJQeV9Db21waWxlU3RyaW5nIgorICAiUHlSdW5fSW50ZXJhY3RpdmVPbmUiCisgICJQeVJ1bl9JbnRlcmFjdGl2ZUxvb3AiCiAgICJQeV9Vc2VDbGFzc0V4Y2VwdGlvbnNGbGFnIgogICAiUHlfVW5pY29kZUZsYWciCiAgICJfUHlfUW5ld0ZsYWciCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzdHJ1Y3RtZW1iZXIpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3RydWN0bWVtYmVyKQogICAiUHlNZW1iZXJfR2V0IgogICAiUHlNZW1iZXJfR2V0T25lIgogICAiUHlNZW1iZXJfU2V0T25lIgogICAiUHlNZW1iZXJfU2V0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3ltdGFibGUpCi0gICJQeVN5bXRhYmxlRW50cnlfTmV3IgotICAiUHlTeW10YWJsZUVudHJ5X1R5cGUiCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3ltdGFibGUpCisgICJQeVN5bXRhYmxlX0J1aWxkIgorICAiUHlTeW10YWJsZV9GcmVlIgorICAiUHlTVF9HZXRTY29wZSIKKyAgIlB5U3ltdGFibGVfTG9va3VwIgorICAiUHlTVEVudHJ5X1R5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzeXNtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3lzbW9kdWxlKQogICAiX1B5U3lzX0luaXQiCisgICJQeVN5c19Xcml0ZVN0ZGVyciIKICAgIlB5U3lzX1NldFBhdGgiCiAgICJQeVN5c19TZXRBcmd2IgogICAiUHlTeXNfV3JpdGVTdGRvdXQiCi0gICJQeVN5c19Xcml0ZVN0ZGVyciIKKyAgIlB5X1N1YnZlcnNpb25SZXZpc2lvbiIKKyAgIlB5X1N1YnZlcnNpb25TaG9ydEJyYW5jaCIKICAgIlB5U3lzX0dldE9iamVjdCIKICAgIlB5U3lzX1NldE9iamVjdCIKICAgIlB5U3lzX0dldEZpbGUiCiAgICJQeVN5c19SZXNldFdhcm5PcHRpb25zIgogICAiUHlTeXNfQWRkV2Fybk9wdGlvbiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRyYWNlYmFjaykKKzsgRnJvbSBweXRob24yNV9zLmxpYih0cmFjZWJhY2spCiAgICJQeVRyYWNlQmFja19IZXJlIgogICAiUHlUcmFjZUJhY2tfUHJpbnQiCiAgICJQeVRyYWNlQmFja19UeXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2V0b3B0KQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGdldG9wdCkKICAgIl9QeU9TX0dldE9wdCIKICAgIl9QeU9TX29wdGVyciIKICAgIl9QeU9TX29wdGluZCIKICAgIl9QeU9TX29wdGFyZyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGR5bmxvYWRfc2hsaWIpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZHlubG9hZF9zaGxpYikKICAgIl9QeUltcG9ydF9EeW5Mb2FkRmlsZXRhYiIKICAgIl9QeUltcG9ydF9HZXREeW5Mb2FkRnVuYyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRocmVhZCkKKzsgRnJvbSBweXRob24yNV9zLmxpYih0aHJlYWQpCiAgICJQeVRocmVhZF9kZWxldGVfa2V5X3ZhbHVlIgogICAiUHlUaHJlYWRfaW5pdF90aHJlYWQiCiAgICJQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkIgpAQCAtMTAyOCwxMyArMTE1OCwxNSBAQAogICAiUHlUaHJlYWRfZnJlZV9sb2NrIgogICAiUHlUaHJlYWRfYWNxdWlyZV9sb2NrIgogICAiUHlUaHJlYWRfcmVsZWFzZV9sb2NrIgorICAiUHlUaHJlYWRfZ2V0X3N0YWNrc2l6ZSIKKyAgIlB5VGhyZWFkX3NldF9zdGFja3NpemUiCiAgICJQeVRocmVhZF9jcmVhdGVfa2V5IgogICAiUHlUaHJlYWRfZGVsZXRlX2tleSIKICAgIlB5VGhyZWFkX3NldF9rZXlfdmFsdWUiCiAgICJQeVRocmVhZF9nZXRfa2V5X3ZhbHVlIgogICAiUHlUaHJlYWRfX2V4aXRfdGhyZWFkIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoZ2Ntb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoZ2Ntb2R1bGUpCiA7ICAiaW5pdGdjIgogICAiX1B5T2JqZWN0X0dDX05ldyIKICAgIl9QeU9iamVjdF9HQ19OZXdWYXIiCkBAIC0xMDUwLDcgKzExODIsNyBAQAogICAiX1B5T2JqZWN0X0dDX0RlbCIKICAgIl9QeUdDX2dlbmVyYXRpb24wIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc2lnbmFsbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHNpZ25hbG1vZHVsZSkKIDsgICJpbml0c2lnbmFsIgogICAiUHlFcnJfQ2hlY2tTaWduYWxzIgogICAiUHlFcnJfU2V0SW50ZXJydXB0IgpAQCAtMTA1OSwxMTUgKzExOTEsMTI0IEBACiAgICJQeU9TX0luaXRJbnRlcnJ1cHRzIgogICAiUHlPU19BZnRlckZvcmsiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihwb3NpeG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihwb3NpeG1vZHVsZSkKIDsgICJpbml0b3MyIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIodGhyZWFkbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHRocmVhZG1vZHVsZSkKIDsgICJpbml0dGhyZWFkIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoYXJyYXltb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoYXJyYXltb2R1bGUpCiA7ICAiaW5pdGFycmF5IgogOyAgImFycmF5X21ldGhvZHMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihiaW5hc2NpaSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihiaW5hc2NpaSkKIDsgICJpbml0YmluYXNjaWkiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjbWF0aG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihjbWF0aG1vZHVsZSkKIDsgICJpbml0Y21hdGgiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfY29kZWNzbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKF9jb2RlY3Ntb2R1bGUpCiA7ICAiaW5pdF9jb2RlY3MiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihjb2xsZWN0aW9uc21vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihjb2xsZWN0aW9uc21vZHVsZSkKIDsgICJpbml0Y29sbGVjdGlvbnMiCiAgICJkZXF1ZWl0ZXJfdHlwZSIKICAgImRlcXVlcmV2aXRlcl90eXBlIgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoY1BpY2tsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihjUGlja2xlKQogOyAgImluaXRjUGlja2xlIgogOyAgImZhc3Rfc2F2ZV9sZWF2ZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGNTdHJpbmdJTykKKzsgRnJvbSBweXRob24yNV9zLmxpYihjU3RyaW5nSU8pCiA7ICAiaW5pdGNTdHJpbmdJTyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKF9jc3YpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoX2NzdikKIDsgICJpbml0X2NzdiIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGRhdGV0aW1lbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGRhdGV0aW1lbW9kdWxlKQogOyAgImluaXRkYXRldGltZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGRsbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGRsbW9kdWxlKQogOyAgImluaXRkbCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGVycm5vbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGVycm5vbW9kdWxlKQogOyAgImluaXRlcnJubyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKGZjbnRsbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGZjbnRsbW9kdWxlKQogOyAgImluaXRmY250bCIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKF9oZWFwcW1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihfZnVuY3Rvb2xzbW9kdWxlKQorOyAgImluaXRfZnVuY3Rvb2xzIgorCis7IEZyb20gcHl0aG9uMjVfcy5saWIoX2hlYXBxbW9kdWxlKQogOyAgImluaXRfaGVhcHEiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihpbWFnZW9wKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKGltYWdlb3ApCiA7ICAiaW5pdGltYWdlb3AiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihpdGVydG9vbHNtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoaXRlcnRvb2xzbW9kdWxlKQogOyAgImluaXRpdGVydG9vbHMiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfbG9jYWxlbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKF9sb2NhbGVtb2R1bGUpCiA7ICAiaW5pdF9sb2NhbGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtYXRobW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1hdGhtb2R1bGUpCiA7ICAiaW5pdG1hdGgiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtZDVjKQotOyAgIl9QeV9NRDVGaW5hbCIKLTsgICJfUHlfTUQ1SW5pdCIKLTsgICJfUHlfTUQ1VXBkYXRlIgorOyBGcm9tIHB5dGhvbjI1X3MubGliKG1kNSkKKyAgIm1kNV9maW5pc2giCisgICJtZDVfaW5pdCIKKyAgIm1kNV9hcHBlbmQiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihtZDVtb2R1bGUpCi07ICAiaW5pdG1kNSIKKzsgRnJvbSBweXRob24yNV9zLmxpYihtZDVtb2R1bGUpCis7ICAiaW5pdF9tZDUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihvcGVyYXRvcikKKzsgRnJvbSBweXRob24yNV9zLmxpYihvcGVyYXRvcikKIDsgICJpbml0b3BlcmF0b3IiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfcmFuZG9tbW9kdWxlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKF9yYW5kb21tb2R1bGUpCiA7ICAiaW5pdF9yYW5kb20iCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihyZ2JpbWdtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIocmdiaW1nbW9kdWxlKQogOyAgImluaXRyZ2JpbWciCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzaGFtb2R1bGUpCi07ICAiaW5pdHNoYSIKKzsgRnJvbSBweXRob24yNV9zLmxpYihzaGFtb2R1bGUpCis7ICAiaW5pdF9zaGEiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfc3JlKQorOyBGcm9tIHB5dGhvbjI1X3MubGliKHNoYTI1Nm1vZHVsZSkKKzsgICJpbml0X3NoYTI1NiIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKHNoYTUxMm1vZHVsZSkKKzsgICJpbml0X3NoYTUxMiIKKworOyBGcm9tIHB5dGhvbjI1X3MubGliKF9zcmUpCiA7ICAiaW5pdF9zcmUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzdHJvcG1vZHVsZSkKKzsgRnJvbSBweXRob24yNV9zLmxpYihzdHJvcG1vZHVsZSkKIDsgICJpbml0c3Ryb3AiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihzdHJ1Y3Rtb2R1bGUpCi07ICAiaW5pdHN0cnVjdCIKKzsgRnJvbSBweXRob24yNV9zLmxpYihfc3RydWN0KQorOyAgImluaXRfc3RydWN0IgogCi07IEZyb20gcHl0aG9uMjRfcy5saWIoc3ltdGFibGVtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoc3ltdGFibGVtb2R1bGUpCiA7ICAiaW5pdF9zeW10YWJsZSIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRlcm1pb3MpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodGVybWlvcykKIDsgICJpbml0dGVybWlvcyIKIAotOyBGcm9tIHB5dGhvbjI0X3MubGliKHRpbWVtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodGltZW1vZHVsZSkKIDsgICJpbml0dGltZSIKICAgIl9QeVRpbWVfRG91YmxlVG9UaW1ldCIKIDsgICJpbml0dGltZXpvbmUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih0aW1pbmdtb2R1bGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIodGltaW5nbW9kdWxlKQogOyAgImluaXR0aW1pbmciCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYihfd2Vha3JlZikKKzsgRnJvbSBweXRob24yNV9zLmxpYihfd2Vha3JlZikKIDsgICJpbml0X3dlYWtyZWYiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih4eHN1YnR5cGUpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoeHhzdWJ0eXBlKQogOyAgImluaXR4eHN1YnR5cGUiCiAKLTsgRnJvbSBweXRob24yNF9zLmxpYih6aXBpbXBvcnQpCis7IEZyb20gcHl0aG9uMjVfcy5saWIoemlwaW1wb3J0KQogOyAgImluaXR6aXBpbXBvcnQiCmRpZmYgLS1naXQgYS9QQy9vczJ2YWNwcC9weWNvbmZpZy5oIGIvUEMvb3MydmFjcHAvcHljb25maWcuaAppbmRleCBjODU4ZmU5Li45N2Y5YjgwIDEwMDY0NAotLS0gYS9QQy9vczJ2YWNwcC9weWNvbmZpZy5oCisrKyBiL1BDL29zMnZhY3BwL3B5Y29uZmlnLmgKQEAgLTExMiw2ICsxMTIsMTAgQEAKICNkZWZpbmUgSEFWRV9IWVBPVCAgICAgICAgICAgICAgIDEgLyogaHlwb3QoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBIQVZFX1BVVEVOViAgICAgICAgICAgICAgMSAvKiBwdXRlbnYoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAjZGVmaW5lIFZBX0xJU1RfSVNfQVJSQVkgICAxICovIC8qIGlmIHZhX2xpc3QgaXMgYW4gYXJyYXkgb2Ygc29tZSBraW5kICAgKi8KKy8qICNkZWZpbmUgSEFWRV9DT05JT19IICAgICAgIDEgKi8gLyogI2luY2x1ZGUgPGNvbmlvLmg+ICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBIQVZFX0VSUk5PX0ggICAgICAgICAgICAgMSAvKiAjaW5jbHVkZSA8ZXJybm8uaD4gICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRfSCAgICAgICAgICAxIC8qICNpbmNsdWRlIDxzeXMvc3RhdC5oPiAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9TWVNfVFlQRVNfSCAgICAgICAgIDEgLyogI2luY2x1ZGUgPHN5cy90eXBlcy5oPiAgICAgICAgICAgICAgICAqLwogCiAgIC8qIFZhcmlhYmxlLUFyZ3VtZW50cy9Qcm90b3R5cGVzICovCiAjZGVmaW5lIEhBVkVfUFJPVE9UWVBFUyAgICAgICAgICAxIC8qIFZBQysrIHN1cHBvcnRzIEMgRnVuY3Rpb24gUHJvdG90eXBlcyAgKi8KQEAgLTEyNCw2ICsxMjgsNyBAQAogI2RlZmluZSBNQUxMT0NfWkVST19SRVRVUk5TX05VTEwgMSAvKiBPdXIgbWFsbG9jKDApIHJldHVybnMgYSBOVUxMIHB0ciAgICAgICovCiAKICAgLyogU2lnbmFsIEhhbmRsaW5nICovCisjZGVmaW5lIEhBVkVfU0lHTkFMX0ggICAgICAgICAgICAxIC8qIHNpZ25hbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgUkVUU0lHVFlQRSAgICAgICAgICAgIHZvaWQgLyogUmV0dXJuIHR5cGUgb2YgaGFuZGxlcnMgKGludCBvciB2b2lkKSAqLwogLyogI3VuZGVmIFdBTlRfU0lHRlBFX0hBTkRMRVIgICAqLyAvKiBIYW5kbGUgU0lHRlBFIChzZWUgSW5jbHVkZS9weWZwZS5oKSAgICovCiAvKiAjZGVmaW5lIEhBVkVfQUxBUk0gICAgICAgICAxICovIC8qIGFsYXJtKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE2Myw3ICsxNjgsOSBAQAogI2RlZmluZSBIQVZFX1NFVFZCVUYgICAgICAgICAgICAgMSAvKiBzZXR2YnVmKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfR0VUQ1dEICAgICAgICAgICAgICAxIC8qIGdldGN3ZCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSEFWRV9QSVBFICAgICAgICAgICAgICAgIDEgLyogcGlwZSgpICAgICBbT1MvMi1zcGVjaWZpYyBjb2RlIGFkZGVkXSAqLworI2RlZmluZSBIQVZFX0lPX0ggICAgICAgICAgICAgICAgMSAvKiAjaW5jbHVkZSA8aW8uaD4gICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfRkNOVExfSCAgICAgICAgICAgICAxIC8qICNpbmNsdWRlIDxmY250bC5oPiAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgSEFWRV9ESVJFQ1RfSCAgICAgICAgICAgIDEgLyogI2luY2x1ZGUgPGRpcmVjdC5oPiAgICAgICAgICAgICAgICAgICAqLwogLyogI2RlZmluZSBIQVZFX0ZMT0NLICAgICAgICAgMSAqLyAvKiBmbG9jaygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAjZGVmaW5lIEhBVkVfVFJVTkNBVEUgICAgICAxICovIC8qIHRydW5jYXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICNkZWZpbmUgSEFWRV9GVFJVTkNBVEUgICAgIDEgKi8gLyogZnRydW5jYXRlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTcyLDYgKzE3OSw3IEBACiAvKiAjZGVmaW5lIEhBVkVfT1BFTkRJUiAgICAgICAxICovIC8qIG9wZW5kaXIoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAogICAvKiBQcm9jZXNzIE9wZXJhdGlvbnMgKi8KKyNkZWZpbmUgSEFWRV9QUk9DRVNTX0ggICAgICAgICAgIDEgLyogI2luY2x1ZGUgPHByb2Nlc3MuaD4gICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBIQVZFX0dFVFBJRCAgICAgICAgICAgICAgMSAvKiBnZXRwaWQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAjZGVmaW5lIEhBVkVfU1lTVEVNICAgICAgICAgICAgICAxIC8qIHN5c3RlbSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICNkZWZpbmUgSEFWRV9XQUlUICAgICAgICAgICAgICAgIDEgLyogd2FpdCgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvUEMvcHljb25maWcuaCBiL1BDL3B5Y29uZmlnLmgKaW5kZXggY2I0MjEzMS4uZTBkZjY3MyAxMDA2NDQKLS0tIGEvUEMvcHljb25maWcuaAorKysgYi9QQy9weWNvbmZpZy5oCkBAIC03OCw4ICs3OCwxNSBAQAogI2VuZGlmCiAKICNpZmRlZiBNU19XSU5DRQotI2RlZmluZSBET05UX0hBVkVfU1lTX1NUQVRfSAotI2RlZmluZSBET05UX0hBVkVfRVJSTk9fSAorLyogUHl0aG9uIHVzZXMgR2V0VmVyc2lvbigpIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAqIFdpbmRvd3MgTlQgYW5kIDl4L01FIHdoZXJlIE9TIFVuaWNvZGUgc3VwcG9ydCBpcyBjb25jZXJuZWQuCisgKiBXaW5kb3dzIENFIHN1cHBvcnRzIFVuaWNvZGUgaW4gdGhlIHNhbWUgd2F5IGFzIE5UIHNvIHdlCisgKiBkZWZpbmUgdGhlIG1pc3NpbmcgR2V0VmVyc2lvbigpIGFjY29yZGluZ2x5LgorICovCisjZGVmaW5lIEdldFZlcnNpb24oKSAoNCkKKy8qIFdpbmRvd3MgQ0UgZG9lcyBub3Qgc3VwcG9ydCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgKi8KKyNkZWZpbmUgZ2V0ZW52KHYpIChOVUxMKQorI2RlZmluZSBlbnZpcm9uIChOVUxMKQogI2VuZGlmCiAKIC8qIENvbXBpbGVyIHNwZWNpZmljIGRlZmluZXMgKi8KQEAgLTE2NCw2ICsxNzEsMTIgQEAKICNkZWZpbmUgUHlfSVNfSU5GSU5JVFkoWCkgKCFfZmluaXRlKFgpICYmICFfaXNuYW4oWCkpCiAjZGVmaW5lIFB5X0lTX0ZJTklURShYKSBfZmluaXRlKFgpCiAKKy8qIFR1cm4gb2ZmIHdhcm5pbmdzIGFib3V0IGRlcHJlY2F0ZWQgQyBydW50aW1lIGZ1bmN0aW9ucyBpbiAKKyAgIFZpc3VhbFN0dWRpbyAuTkVUIDIwMDUgKi8KKyNpZiBfTVNDX1ZFUiA+PSAxNDAwICYmICFkZWZpbmVkIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURQorI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEUKKyNlbmRpZgorCiAjZW5kaWYgLyogX01TQ19WRVIgKi8KIAogLyogZGVmaW5lIHNvbWUgQU5TSSB0eXBlcyB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBlYXJsaWVyIFdpbiBoZWFkZXJzICovCkBAIC0zNTAsNiArMzYzLDE2IEBACiAvKiBEZWZpbmUgdG8gZW1wdHkgaWYgdGhlIGtleXdvcmQgZG9lcyBub3Qgd29yay4gICovCiAvKiAjZGVmaW5lIGNvbnN0ICAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLworI2lmbmRlZiBNU19XSU5DRQorI2RlZmluZSBIQVZFX0NPTklPX0ggMQorI2VuZGlmCisKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI2lmbmRlZiBNU19XSU5DRQorI2RlZmluZSBIQVZFX0RJUkVDVF9IIDEKKyNlbmRpZgorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgZGlyZW50LmguICAqLwogLyogI2RlZmluZSBESVJFTlQgMSAqLwogCkBAIC01NTUsMTEgKzU3OCwyNiBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGxmY24uaD4gaGVhZGVyIGZpbGUuICAqLwogLyogI3VuZGVmIEhBVkVfRExGQ05fSCAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGVycm5vLmg+IGhlYWRlciBmaWxlLiAqLworI2lmbmRlZiBNU19XSU5DRQorI2RlZmluZSBIQVZFX0VSUk5PX0ggMQorI2VuZGlmCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KICNpZm5kZWYgTVNfV0lOQ0UKICNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKICNlbmRpZgogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHByb2Nlc3MuaD4gaGVhZGVyIGZpbGUuICovCisjaWZuZGVmIE1TX1dJTkNFCisjZGVmaW5lIEhBVkVfUFJPQ0VTU19IIDEKKyNlbmRpZgorCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gKi8KKyNpZm5kZWYgTVNfV0lOQ0UKKyNkZWZpbmUgSEFWRV9TSUdOQUxfSCAxCisjZW5kaWYKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3RkYXJnLmg+IHByb3RvdHlwZXMuICAqLwogI2RlZmluZSBIQVZFX1NUREFSR19QUk9UT1RZUEVTCiAKQEAgLTU3NSwxMiArNjEzLDIyIEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvc2VsZWN0Lmg+IGhlYWRlciBmaWxlLiAgKi8KIC8qICNkZWZpbmUgSEFWRV9TWVNfU0VMRUNUX0ggMSAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy9zdGF0Lmg+IGhlYWRlciBmaWxlLiAgKi8KKyNpZm5kZWYgTVNfV0lOQ0UKKyNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKKyNlbmRpZgorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1RJTUVfSCAxICovCiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1RJTUVTX0ggMSAqLwogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90eXBlcy5oPiBoZWFkZXIgZmlsZS4gICovCisjaWZuZGVmIE1TX1dJTkNFCisjZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQorI2VuZGlmCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy91bi5oPiBoZWFkZXIgZmlsZS4gICovCiAvKiAjZGVmaW5lIEhBVkVfU1lTX1VOX0ggMSAqLwogCmRpZmYgLS1naXQgYS9QQy93aW5zb3VuZC5jIGIvUEMvd2luc291bmQuYwppbmRleCBiYzMwY2NjLi40ZTk0MjMwIDEwMDY0NAotLS0gYS9QQy93aW5zb3VuZC5jCisrKyBiL1BDL3dpbnNvdW5kLmMKQEAgLTM3LDggKzM3LDEwIEBACiAKICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5jbHVkZSA8bW1zeXN0ZW0uaD4KLSNpbmNsdWRlIDxjb25pby5oPgkvKiBwb3J0IGZ1bmN0aW9ucyBvbiBXaW45eCAqLwogI2luY2x1ZGUgPFB5dGhvbi5oPgorI2lmZGVmIEhBVkVfQ09OSU9fSAorI2luY2x1ZGUgPGNvbmlvLmg+CS8qIHBvcnQgZnVuY3Rpb25zIG9uIFdpbjl4ICovCisjZW5kaWYKIAogUHlEb2NfU1RSVkFSKHNvdW5kX3BsYXlzb3VuZF9kb2MsCiAiUGxheVNvdW5kKHNvdW5kLCBmbGFncykgLSBhIHdyYXBwZXIgYXJvdW5kIHRoZSBXaW5kb3dzIFBsYXlTb3VuZCBBUElcbiIKQEAgLTE0NSw3ICsxNDcsNyBAQAogCQkJcmV0dXJuIE5VTEw7CiAJCX0KIAl9Ci0jaWZkZWYgX01fSVg4NgorI2lmIGRlZmluZWQoX01fSVg4NikgJiYgZGVmaW5lZChIQVZFX0NPTklPX0gpCiAJZWxzZSBpZiAod2hpY2hPUyA9PSBXaW45WCkgewogCQlpbnQgc3BlYWtlcl9zdGF0ZTsKIAkJLyogRm9yY2UgdGltZXIgaW50byBvc2NpbGxhdG9yIG1vZGUgdmlhIHRpbWVyIGNvbnRyb2wgcG9ydC4gKi8KQEAgLTE3MCw3ICsxNzIsNyBAQAogCQkvKiBSZXN0b3JlIHNwZWFrZXIgY29udHJvbCB0byBvcmlnaW5hbCBzdGF0ZS4gKi8KIAkJX291dHAoMHg2MSwgc3BlYWtlcl9zdGF0ZSk7CiAJfQotI2VuZGlmIC8qIF9NX0lYODYgKi8KKyNlbmRpZiAvKiBfTV9JWDg2ICYmIEhBVkVfQ09OSU9fSCAqLwogCWVsc2UgewogCQlhc3NlcnQoISJ3aW5zb3VuZCdzIHdoaWNoT1MgaGFzIGluc2FuZSB2YWx1ZSIpOwogCX0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvX21zaS52Y3Byb2ogYi9QQ2J1aWxkL19tc2kudmNwcm9qCmluZGV4IGZiODkyNWUuLmI0YWZlYjQgMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX21zaS52Y3Byb2oKKysrIGIvUENidWlsZC9fbXNpLnZjcHJvagpAQCAtMzYsMTEgKzM2LDExIEBACiAJCQk8VG9vbAogCQkJCU5hbWU9IlZDTGlua2VyVG9vbCIKIAkJCQlBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPSJmY2kubGliIG1zaS5saWIgcnBjcnQ0LmxpYiIKLQkJCQlPdXRwdXRGaWxlPSIuL19tc2kucHlkIgorCQkJCU91dHB1dEZpbGU9Ii4vX21zaV9kLnB5ZCIKIAkJCQlMaW5rSW5jcmVtZW50YWw9IjEiCiAJCQkJU3VwcHJlc3NTdGFydHVwQmFubmVyPSJUUlVFIgogCQkJCUdlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj0iVFJVRSIKLQkJCQlQcm9ncmFtRGF0YWJhc2VGaWxlPSIuXC4vX21zaS5wZGIiCisJCQkJUHJvZ3JhbURhdGFiYXNlRmlsZT0iLlwuL19tc2lfZC5wZGIiCiAJCQkJQmFzZUFkZHJlc3M9IjB4MUQxNjAwMDAiCiAJCQkJSW1wb3J0TGlicmFyeT0iLlwuL19tc2kubGliIgogCQkJCVRhcmdldE1hY2hpbmU9IjEiLz4KZGlmZiAtLWdpdCBhL1BDYnVpbGQvX3NzbC52Y3Byb2ogYi9QQ2J1aWxkL19zc2wudmNwcm9qCmluZGV4IDNlYmVkYmQuLmJjNjllZTggMTAwNjQ0Ci0tLSBhL1BDYnVpbGQvX3NzbC52Y3Byb2oKKysrIGIvUENidWlsZC9fc3NsLnZjcHJvagpAQCAtMjEsOCArMjEsOCBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNOTWFrZVRvb2wiCi0JCQkJQnVpbGRDb21tYW5kTGluZT0icHl0aG9uIGJ1aWxkX3NzbC5weSIKLQkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkgLWEiCisJCQkJQnVpbGRDb21tYW5kTGluZT0iYnVpbGRfc3NsLmJhdCAkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkgLWEiCiAJCQkJQ2xlYW5Db21tYW5kTGluZT0iZWNobyBOb3RoaW5nIHRvIGRvIgogCQkJCU91dHB1dD0iX3NzbC5weWQiLz4KIAkJPC9Db25maWd1cmF0aW9uPgpAQCAtMzUsOCArMzUsOCBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNOTWFrZVRvb2wiCi0JCQkJQnVpbGRDb21tYW5kTGluZT0icHl0aG9uX2QgLXUgYnVpbGRfc3NsLnB5IC1kIgotCQkJCVJlQnVpbGRDb21tYW5kTGluZT0icHl0aG9uX2QgLXUgYnVpbGRfc3NsLnB5IC1kIC1hIgorCQkJCUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkiCisJCQkJUmVCdWlsZENvbW1hbmRMaW5lPSJidWlsZF9zc2wuYmF0ICQoQ29uZmlndXJhdGlvbk5hbWUpIC1hIgogCQkJCUNsZWFuQ29tbWFuZExpbmU9ImVjaG8gTm90aGluZyB0byBkbyIKIAkJCQlPdXRwdXQ9Il9zc2xfZC5weWQiLz4KIAkJPC9Db25maWd1cmF0aW9uPgpAQCAtNDksOCArNDksOSBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNOTWFrZVRvb2wiCi0JCQkJQnVpbGRDb21tYW5kTGluZT0icHl0aG9uIGJ1aWxkX3NzbC5weSIKLQkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkgLWEiCisJCQkJQnVpbGRDb21tYW5kTGluZT0iYnVpbGRfc3NsLmJhdCAkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkgLWEiCisJCQkJQ2xlYW5Db21tYW5kTGluZT0iZWNobyBOb3RoaW5nIHRvIGRvIgogCQkJCU91dHB1dD0iX3NzbC5weWQiLz4KIAkJPC9Db25maWd1cmF0aW9uPgogCQk8Q29uZmlndXJhdGlvbgpAQCAtNjIsOCArNjMsOSBAQAogCQkJQVRMTWluaW1pemVzQ1J1blRpbWVMaWJyYXJ5VXNhZ2U9IkZBTFNFIj4KIAkJCTxUb29sCiAJCQkJTmFtZT0iVkNOTWFrZVRvb2wiCi0JCQkJQnVpbGRDb21tYW5kTGluZT0icHl0aG9uIGJ1aWxkX3NzbC5weSIKLQkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9InB5dGhvbiBidWlsZF9zc2wucHkgLWEiCisJCQkJQnVpbGRDb21tYW5kTGluZT0iYnVpbGRfc3NsLmJhdCAkKENvbmZpZ3VyYXRpb25OYW1lKSIKKwkJCQlSZUJ1aWxkQ29tbWFuZExpbmU9ImJ1aWxkX3NzbC5iYXQgJChDb25maWd1cmF0aW9uTmFtZSkgLWEiCisJCQkJQ2xlYW5Db21tYW5kTGluZT0iZWNobyBOb3RoaW5nIHRvIGRvIgogCQkJCU91dHB1dD0iX3NzbC5weWQiLz4KIAkJPC9Db25maWd1cmF0aW9uPgogCTwvQ29uZmlndXJhdGlvbnM+CmRpZmYgLS1naXQgYS9QQ2J1aWxkL2J1aWxkX3NzbC5iYXQgYi9QQ2J1aWxkL2J1aWxkX3NzbC5iYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI1NzJlZAotLS0gL2Rldi9udWxsCisrKyBiL1BDYnVpbGQvYnVpbGRfc3NsLmJhdApAQCAtMCwwICsxLDEwIEBACitAZWNobyBvZmYNCitpZiBub3QgZGVmaW5lZCBIT1NUX1BZVEhPTiAoDQorICBpZiAlMSBFUVUgRGVidWcgKA0KKyAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uX2QuZXhlDQorICApIEVMU0UgKA0KKyAgICBzZXQgSE9TVF9QWVRIT049cHl0aG9uLmV4ZQ0KKyAgKQ0KKykNCislSE9TVF9QWVRIT04lIGJ1aWxkX3NzbC5weSAlMSAlMg0KKw0KZGlmZiAtLWdpdCBhL1BDYnVpbGQvYnVpbGRfc3NsLnB5IGIvUENidWlsZC9idWlsZF9zc2wucHkKaW5kZXggOGY0ODVhMi4uZDRiZWVlNSAxMDA2NDQKLS0tIGEvUENidWlsZC9idWlsZF9zc2wucHkKKysrIGIvUENidWlsZC9idWlsZF9zc2wucHkKQEAgLTg0LDkgKzg0LDU5IEBACiAgICAgICAgIHByaW50ICJDb3VsZCBub3QgZmluZCBhbiBTU0wgZGlyZWN0b3J5IGluICclcyciICUgKHNvdXJjZXMsKQogICAgIHJldHVybiBiZXN0X25hbWUKIAorZGVmIHJ1bl8zMmFsbF9weSgpOgorICAgICMgbXNcMzJhbGwuYmF0IHdpbGwgcmVjb25maWd1cmUgT3BlblNTTCBhbmQgdGhlbiB0cnkgdG8gYnVpbGQKKyAgICAjIGFsbCBvdXRwdXRzIChkZWJ1Zy9ub25kZWJ1Zy9kbGwvbGliKS4gIFNvIHdlIGZpbHRlciB0aGUgZmlsZQorICAgICMgdG8gZXhjbHVkZSBhbnkgIm5tYWtlIiBjb21tYW5kcyBhbmQgdGhlbiBleGVjdXRlLgorICAgIHRlbXBuYW1lID0gIm1zXFwzMmFsbF9weS5iYXQiCisKKyAgICBpbl9iYXQgID0gb3BlbigibXNcXDMyYWxsLmJhdCIpCisgICAgdGVtcF9iYXQgPSBvcGVuKHRlbXBuYW1lLCJ3IikKKyAgICB3aGlsZSAxOgorICAgICAgICBjbWQgPSBpbl9iYXQucmVhZGxpbmUoKQorICAgICAgICBwcmludCAnY21kJywgcmVwcihjbWQpCisgICAgICAgIGlmIG5vdCBjbWQ6IGJyZWFrCisgICAgICAgIGlmIGNtZC5zdHJpcCgpWzo1XS5sb3dlcigpID09ICJubWFrZSI6CisgICAgICAgICAgICBjb250aW51ZQorICAgICAgICB0ZW1wX2JhdC53cml0ZShjbWQpCisgICAgaW5fYmF0LmNsb3NlKCkKKyAgICB0ZW1wX2JhdC5jbG9zZSgpCisgICAgb3Muc3lzdGVtKHRlbXBuYW1lKQorICAgIHRyeToKKyAgICAgICAgb3MucmVtb3ZlKHRlbXBuYW1lKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworCitkZWYgcnVuX2NvbmZpZ3VyZShjb25maWd1cmUsIGRvX3NjcmlwdCk6CisgICAgb3Muc3lzdGVtKCJwZXJsIENvbmZpZ3VyZSAiK2NvbmZpZ3VyZSkKKyAgICBvcy5zeXN0ZW0oZG9fc2NyaXB0KQorCiBkZWYgbWFpbigpOgotICAgIGRlYnVnID0gIi1kIiBpbiBzeXMuYXJndgogICAgIGJ1aWxkX2FsbCA9ICItYSIgaW4gc3lzLmFyZ3YKKyAgICBpZiBzeXMuYXJndlsxXSA9PSAiUmVsZWFzZSI6CisgICAgICAgIGFyY2ggPSAieDg2IgorICAgICAgICBkZWJ1ZyA9IEZhbHNlCisgICAgICAgIGNvbmZpZ3VyZSA9ICJWQy1XSU4zMiIKKyAgICAgICAgbWFrZWZpbGUgPSAiMzIubWFrIgorICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gIkRlYnVnIjoKKyAgICAgICAgYXJjaCA9ICJ4ODYiCisgICAgICAgIGRlYnVnID0gVHJ1ZQorICAgICAgICBjb25maWd1cmUgPSAiVkMtV0lOMzIiCisgICAgICAgIG1ha2VmaWxlPSJkMzIubWFrIgorICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gIlJlbGVhc2VJdGFuaXVtIjoKKyAgICAgICAgYXJjaCA9ICJpYTY0IgorICAgICAgICBkZWJ1ZyA9IEZhbHNlCisgICAgICAgIGNvbmZpZ3VyZSA9ICJWQy1XSU42NEkiCisgICAgICAgIGRvX3NjcmlwdCA9ICJtc1xcZG9fd2luNjRpIgorICAgICAgICBtYWtlZmlsZSA9ICJtc1xcbnQubWFrIgorICAgICAgICBvcy5lbnZpcm9uWyJWU0VYVENPTVBfVVNFQ0wiXSA9ICJNU19JVEFOSVVNIgorICAgIGVsaWYgc3lzLmFyZ3ZbMV0gPT0gIlJlbGVhc2VBTUQ2NCI6CisgICAgICAgIGFyY2g9ImFtZDY0IgorICAgICAgICBkZWJ1Zz1GYWxzZQorICAgICAgICBjb25maWd1cmUgPSAiVkMtV0lONjRBIgorICAgICAgICBkb19zY3JpcHQgPSAibXNcXGRvX3dpbjY0YSIKKyAgICAgICAgbWFrZWZpbGUgPSAibXNcXG50Lm1hayIKKyAgICAgICAgb3MuZW52aXJvblsiVlNFWFRDT01QX1VTRUNMIl0gPSAiTVNfT1BURVJPTiIKICAgICBtYWtlX2ZsYWdzID0gIiIKICAgICBpZiBidWlsZF9hbGw6CiAgICAgICAgIG1ha2VfZmxhZ3MgPSAiLWEiCkBAIC0xMDcsNDkgKzE1NywyNCBAQAogICAgIHRyeToKICAgICAgICAgb3MuY2hkaXIoc3NsX2RpcikKICAgICAgICAgIyBJZiB0aGUgc3NsIG1ha2VmaWxlcyBkbyBub3QgZXhpc3QsIHdlIGludm9rZSBQZXJsIHRvIGdlbmVyYXRlIHRoZW0uCi0gICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3NsX2RpciwgIjMyLm1hayIpKSBvciBcCi0gICAgICAgICAgIG5vdCBvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmpvaW4oc3NsX2RpciwgImQzMi5tYWsiKSk6CisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZmlsZShtYWtlZmlsZSk6CiAgICAgICAgICAgICBwcmludCAiQ3JlYXRpbmcgdGhlIG1ha2VmaWxlcy4uLiIKICAgICAgICAgICAgICMgUHV0IG91ciB3b3JraW5nIFBlcmwgYXQgdGhlIGZyb250IG9mIG91ciBwYXRoCiAgICAgICAgICAgICBvcy5lbnZpcm9uWyJQQVRIIl0gPSBvcy5wYXRoLnNwbGl0KHBlcmwpWzBdICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aHNlcCArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLmVudmlyb25bIlBBVEgiXQotICAgICAgICAgICAgIyBtc1wzMmFsbC5iYXQgd2lsbCByZWNvbmZpZ3VyZSBPcGVuU1NMIGFuZCB0aGVuIHRyeSB0byBidWlsZAotICAgICAgICAgICAgIyBhbGwgb3V0cHV0cyAoZGVidWcvbm9uZGVidWcvZGxsL2xpYikuICBTbyB3ZSBmaWx0ZXIgdGhlIGZpbGUKLSAgICAgICAgICAgICMgdG8gZXhjbHVkZSBhbnkgIm5tYWtlIiBjb21tYW5kcyBhbmQgdGhlbiBleGVjdXRlLgotICAgICAgICAgICAgdGVtcG5hbWUgPSAibXNcXDMyYWxsX3B5LmJhdCIKLQotICAgICAgICAgICAgaW5fYmF0ICA9IG9wZW4oIm1zXFwzMmFsbC5iYXQiKQotICAgICAgICAgICAgdGVtcF9iYXQgPSBvcGVuKHRlbXBuYW1lLCJ3IikKLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgY21kID0gaW5fYmF0LnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICBwcmludCAnY21kJywgcmVwcihjbWQpCi0gICAgICAgICAgICAgICAgaWYgbm90IGNtZDogYnJlYWsKLSAgICAgICAgICAgICAgICBpZiBjbWQuc3RyaXAoKVs6NV0ubG93ZXIoKSA9PSAibm1ha2UiOgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgICAgIHRlbXBfYmF0LndyaXRlKGNtZCkKLSAgICAgICAgICAgIGluX2JhdC5jbG9zZSgpCi0gICAgICAgICAgICB0ZW1wX2JhdC5jbG9zZSgpCi0gICAgICAgICAgICBvcy5zeXN0ZW0odGVtcG5hbWUpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MucmVtb3ZlKHRlbXBuYW1lKQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIGlmIGFyY2g9PSJ4ODYiOgorICAgICAgICAgICAgICAgIHJ1bl8zMmFsbF9weSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJ1bl9jb25maWd1cmUoY29uZmlndXJlLCBkb19zY3JpcHQpCiAKICAgICAgICAgIyBOb3cgcnVuIG1ha2UuCiAgICAgICAgIHByaW50ICJFeGVjdXRpbmcgbm1ha2Ugb3ZlciB0aGUgc3NsIG1ha2VmaWxlcy4uLiIKLSAgICAgICAgaWYgZGVidWc6Ci0gICAgICAgICAgICByYyA9IG9zLnN5c3RlbSgibm1ha2UgL25vbG9nbyAtZiBkMzIubWFrIikKLSAgICAgICAgICAgIGlmIHJjOgotICAgICAgICAgICAgICAgIHByaW50ICJFeGVjdXRpbmcgZDMyLm1hayBmYWlsZWQiCi0gICAgICAgICAgICAgICAgcHJpbnQgcmMKLSAgICAgICAgICAgICAgICBzeXMuZXhpdChyYykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJjID0gb3Muc3lzdGVtKCJubWFrZSAvbm9sb2dvIC1mIDMyLm1hayIpCi0gICAgICAgICAgICBpZiByYzoKLSAgICAgICAgICAgICAgICBwcmludCAiRXhlY3V0aW5nIDMyLm1hayBmYWlsZWQiCi0gICAgICAgICAgICAgICAgcHJpbnQgcmMKLSAgICAgICAgICAgICAgICBzeXMuZXhpdChyYykKKyAgICAgICAgcmMgPSBvcy5zeXN0ZW0oIm5tYWtlIC9ub2xvZ28gLWYgIittYWtlZmlsZSkKKyAgICAgICAgaWYgcmM6CisgICAgICAgICAgICBwcmludCAiRXhlY3V0aW5nIGQzMi5tYWsgZmFpbGVkIgorICAgICAgICAgICAgcHJpbnQgcmMKKyAgICAgICAgICAgIHN5cy5leGl0KHJjKQogICAgIGZpbmFsbHk6CiAgICAgICAgIG9zLmNoZGlyKG9sZF9jZCkKICAgICAjIEFuZCBmaW5hbGx5LCB3ZSBjYW4gYnVpbGQgdGhlIF9zc2wgbW9kdWxlIGl0c2VsZiBmb3IgUHl0aG9uLgpkaWZmIC0tZ2l0IGEvUENidWlsZC9weXRob25jb3JlLnZjcHJvaiBiL1BDYnVpbGQvcHl0aG9uY29yZS52Y3Byb2oKaW5kZXggYmI5ZjdhZi4uZWYyMDBjNCAxMDA2NDQKLS0tIGEvUENidWlsZC9weXRob25jb3JlLnZjcHJvagorKysgYi9QQ2J1aWxkL3B5dGhvbmNvcmUudmNwcm9qCkBAIC0zNDQsOSArMzQ0LDYgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfYmlzZWN0bW9kdWxlLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCi0JCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3N0cnVjdC5jIj4KLQkJPC9GaWxlPgotCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXGNqa2NvZGVjc1xfY29kZWNzX2NuLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCkBAIC0zNzEsNiArMzY4LDkgQEAKIAkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfY3N2LmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX2Z1bmN0b29sc21vZHVsZS5jIj4KKwkJPC9GaWxlPgorCQk8RmlsZQogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9oZWFwcW1vZHVsZS5jIj4KIAkJPC9GaWxlPgogCQk8RmlsZQpAQCAtMzg5LDkgKzM4OSwxNSBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlxNb2R1bGVzXF9zcmUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKKwkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfc3RydWN0LmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXFBjXF9zdWJwcm9jZXNzLmMiPgogCQk8L0ZpbGU+CiAJCTxGaWxlCisJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3R5cGVzbW9kdWxlLmMiPgorCQk8L0ZpbGU+CisJCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXE1vZHVsZXNcX3dlYWtyZWYuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKQEAgLTUxNSw5ICs1MjEsNiBAQAogCQkJUmVsYXRpdmVQYXRoPSIuLlxPYmplY3RzXGZ1bmNvYmplY3QuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKLQkJCVJlbGF0aXZlUGF0aD0iLi5cTW9kdWxlc1xfZnVuY3Rvb2xzbW9kdWxlLmMiPgotCQk8L0ZpbGU+Ci0JCTxGaWxlCiAJCQlSZWxhdGl2ZVBhdGg9Ii4uXFB5dGhvblxmdXR1cmUuYyI+CiAJCTwvRmlsZT4KIAkJPEZpbGUKZGlmZiAtLWdpdCBhL1BDYnVpbGQvcmVhZG1lLnR4dCBiL1BDYnVpbGQvcmVhZG1lLnR4dAppbmRleCAxODRkMTFmLi40NTM2MzY4IDEwMDY0NAotLS0gYS9QQ2J1aWxkL3JlYWRtZS50eHQKKysrIGIvUENidWlsZC9yZWFkbWUudHh0CkBAIC0yNjQsNyArMjY0LDcgQEAKIEluIGFkZGl0aW9uLCB5b3UgbmVlZCB0aGUgVmlzdWFsIFN0dWRpbyBwbHVnaW4gZm9yIGV4dGVybmFsIEMgY29tcGlsZXJzLAogZnJvbSBodHRwOi8vc2YubmV0L3Byb2plY3RzL3ZzZXh0Y29tcC4gVGhlIHBsdWdpbiB3aWxsIHdyYXAgY2wuZXhlLCB0bwogbG9jYXRlIHRoZSBwcm9wZXIgdGFyZ2V0IGNvbXBpbGVyLCBhbmQgY29udmVydCBjb21waWxlciBvcHRpb25zCi1hY2NvcmRpbmdseS4gVGhlIHByb2plY3QgZmlsZXMgcmVxdWlyZSBhdGxlYXN0IHZlcnNpb24gMC44LgorYWNjb3JkaW5nbHkuIFRoZSBwcm9qZWN0IGZpbGVzIHJlcXVpcmUgYXRsZWFzdCB2ZXJzaW9uIDAuOS4KIAogQnVpbGRpbmcgZm9yIEFNRDY0CiAtLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTI4MCwxMiArMjgwLDIxIEBACiBUb29sa2l0IENvbXBpbGVyLiBUaGlzIHByb3ZpZGVzIGEgd2F5IG9mIGJ1aWxkaW5nIFB5dGhvbiB1c2luZyBmcmVlbHkKIGF2YWlsYWJsZSBzb2Z0d2FyZS4KIAorTm90ZSB0aGF0IE1pY3Jvc29mdCBoYXZlIHdpdGhkcmF3biB0aGUgZnJlZSBNUyBUb29sa2l0IENvbXBpbGVyLCBzbyB0aGlzIGNhbgorbm8gbG9uZ2VyIGJlIGNvbnNpZGVyZWQgYSBzdXBwb3J0ZWQgb3B0aW9uLiBUaGUgaW5zdHJ1Y3Rpb25zIGFyZSBzdGlsbAorY29ycmVjdCwgYnV0IHlvdSBuZWVkIHRvIGFscmVhZHkgaGF2ZSBhIGNvcHkgb2YgdGhlIGNvbXBpbGVyIGluIG9yZGVyIHRvIHVzZQordGhlbS4gTWljcm9zb2Z0IG5vdyBzdXBwbHkgVmlzdWFsIEMrKyAyMDA1IEV4cHJlc3MgRWRpdGlvbiBmb3IgZnJlZSwgYnV0IHRoaXMKK2lzIE5PVCBjb21wYXRpYmxlIHdpdGggVmlzdWFsIEMrKyA3LjEgKGl0IHVzZXMgYSBkaWZmZXJlbnQgQyBydW50aW1lKSwgYW5kIHNvCitjYW5ub3QgYmUgdXNlZCB0byBidWlsZCBhIHZlcnNpb24gb2YgUHl0aG9uIGNvbXBhdGlibGUgd2l0aCB0aGUgc3RhbmRhcmQKK3B5dGhvbi5vcmcgYnVpbGQuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB1c2luZyBWaXN1YWwgQysrIDIwMDUgRXhwcmVzcworRWRpdGlvbiwgaG93ZXZlciwgeW91IHNob3VsZCBsb29rIGF0IHRoZSBQQ0J1aWxkOCBkaXJlY3RvcnkuCisKIFJlcXVpcmVtZW50cwogCiAgICAgVG8gYnVpbGQgUHl0aG9uLCB0aGUgZm9sbG93aW5nIHRvb2xzIGFyZSByZXF1aXJlZDoKIAogICAgICogVGhlIFZpc3VhbCBDKysgVG9vbGtpdCBDb21waWxlcgotICAgICAgICBmcm9tIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vdmlzdWFsYy92Y3Rvb2xraXQyMDAzLworICAgICAgICBubyBsb25nZXIgYXZhaWxhYmxlIGZvciBkb3dubG9hZCAtIHNlZSBhYm92ZQogICAgICogQSByZWNlbnQgUGxhdGZvcm0gU0RLCiAgICAgICAgIGZyb20gaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2Rvd25sb2Fkcy9kZXRhaWxzLmFzcHg/RmFtaWx5SUQ9NDg0MjY5ZTItM2I4OS00N2UzLThlYjctMWYyYmU2ZDcxMjNhCiAgICAgKiBUaGUgLk5FVCAxLjEgU0RLCmRpZmYgLS1naXQgYS9QeXRob24vYXN0LmMgYi9QeXRob24vYXN0LmMKaW5kZXggZjNlNjExYi4uY2E4MzJhYSAxMDA2NDQKLS0tIGEvUHl0aG9uL2FzdC5jCisrKyBiL1B5dGhvbi9hc3QuYwpAQCAtMzM5LDcgKzMzOSw3IEBACiAgICAgLyogVGhlIGFzdCBkZWZpbmVzIGF1Z21lbnRlZCBzdG9yZSBhbmQgbG9hZCBjb250ZXh0cywgYnV0IHRoZQogICAgICAgIGltcGxlbWVudGF0aW9uIGhlcmUgZG9lc24ndCBhY3R1YWxseSB1c2UgdGhlbS4gIFRoZSBjb2RlIG1heSBiZQogICAgICAgIGEgbGl0dGxlIG1vcmUgY29tcGxleCB0aGFuIG5lY2Vzc2FyeSBhcyBhIHJlc3VsdC4gIEl0IGFsc28gbWVhbnMKLSAgICAgICB0aGF0IGV4cHJlc3Npb25zIGluIGFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGhhdmUgbm8gY29udGV4dC4KKyAgICAgICB0aGF0IGV4cHJlc3Npb25zIGluIGFuIGF1Z21lbnRlZCBhc3NpZ25tZW50IGhhdmUgYSBTdG9yZSBjb250ZXh0LgogICAgICAgIENvbnNpZGVyIHJlc3RydWN0dXJpbmcgc28gdGhhdCBhdWdtZW50ZWQgYXNzaWdubWVudCB1c2VzCiAgICAgICAgc2V0X2NvbnRleHQoKSwgdG9vLgogICAgICovCkBAIC0zODcsNiArMzg3LDkgQEAKICAgICAgICAgY2FzZSBHZW5lcmF0b3JFeHBfa2luZDoKICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJnZW5lcmF0b3IgZXhwcmVzc2lvbiI7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBZaWVsZF9raW5kOgorICAgICAgICAgICAgZXhwcl9uYW1lID0gInlpZWxkIGV4cHJlc3Npb24iOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTGlzdENvbXBfa2luZDoKICAgICAgICAgICAgIGV4cHJfbmFtZSA9ICJsaXN0IGNvbXByZWhlbnNpb24iOwogICAgICAgICAgICAgYnJlYWs7CkBAIC02MTksMTAgKzYyMiwxMCBAQAogICAgIH0KICAgICBhcmdzID0gKG5fYXJncyA/IGFzZGxfc2VxX25ldyhuX2FyZ3MsIGMtPmNfYXJlbmEpIDogTlVMTCk7CiAgICAgaWYgKCFhcmdzICYmIG5fYXJncykKLSAgICAJcmV0dXJuIE5VTEw7IC8qIERvbid0IG5lZWQgdG8gZ28gdG8gTlVMTDsgbm90aGluZyBhbGxvY2F0ZWQgKi8KKyAgICAJcmV0dXJuIE5VTEw7IC8qIERvbid0IG5lZWQgdG8gZ290byBlcnJvcjsgbm8gb2JqZWN0cyBhbGxvY2F0ZWQgKi8KICAgICBkZWZhdWx0cyA9IChuX2RlZmF1bHRzID8gYXNkbF9zZXFfbmV3KG5fZGVmYXVsdHMsIGMtPmNfYXJlbmEpIDogTlVMTCk7CiAgICAgaWYgKCFkZWZhdWx0cyAmJiBuX2RlZmF1bHRzKQotICAgICAgICBnb3RvIGVycm9yOworICAgIAlyZXR1cm4gTlVMTDsgLyogRG9uJ3QgbmVlZCB0byBnb3RvIGVycm9yOyBubyBvYmplY3RzIGFsbG9jYXRlZCAqLwogCiAgICAgLyogZnBkZWY6IE5BTUUgfCAnKCcgZnBsaXN0ICcpJwogICAgICAgIGZwbGlzdDogZnBkZWYgKCcsJyBmcGRlZikqIFsnLCddCkBAIC02MzgsOCArNjQxLDExIEBACiAgICAgICAgICAgICAgICAgICAgYW55dGhpbmcgb3RoZXIgdGhhbiBFUVVBTCBvciBhIGNvbW1hPyAqLwogICAgICAgICAgICAgICAgIC8qIFhYWCBTaG91bGQgTkNIKG4pIGNoZWNrIGJlIG1hZGUgYSBzZXBhcmF0ZSBjaGVjaz8gKi8KICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBOQ0gobikgJiYgVFlQRShDSElMRChuLCBpICsgMSkpID09IEVRVUFMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzZGxfc2VxX1NFVChkZWZhdWx0cywgaisrLCAKLQkJCQkgICAgYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIGkgKyAyKSkpOworICAgICAgICAgICAgICAgICAgICBleHByX3R5IGV4cHJlc3Npb24gPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgaSArIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFleHByZXNzaW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydChkZWZhdWx0cyAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgYXNkbF9zZXFfU0VUKGRlZmF1bHRzLCBqKyssIGV4cHJlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBpICs9IDI7CiAJCSAgICBmb3VuZF9kZWZhdWx0ID0gMTsKICAgICAgICAgICAgICAgICB9CkBAIC0xNDg0LDYgKzE0OTAsNTcgQEAKIH0KIAogc3RhdGljIGV4cHJfdHkKK2FzdF9mb3JfZmFjdG9yKHN0cnVjdCBjb21waWxpbmcgKmMsIGNvbnN0IG5vZGUgKm4pCit7CisgICAgbm9kZSAqcGZhY3RvciwgKnBwb3dlciwgKnBhdG9tLCAqcG51bTsKKyAgICBleHByX3R5IGV4cHJlc3Npb247CisKKyAgICAvKiBJZiB0aGUgdW5hcnkgLSBvcGVyYXRvciBpcyBhcHBsaWVkIHRvIGEgY29uc3RhbnQsIGRvbid0IGdlbmVyYXRlCisgICAgICAgYSBVTkFSWV9ORUdBVElWRSBvcGNvZGUuICBKdXN0IHN0b3JlIHRoZSBhcHByb3JpYXRlIHZhbHVlIGFzIGEKKyAgICAgICBjb25zdGFudC4gIFRoZSBwZWVwaG9sZSBvcHRpbWl6ZXIgYWxyZWFkeSBkb2VzIHNvbWV0aGluZyBsaWtlCisgICAgICAgdGhpcyBidXQgaXQgZG9lc24ndCBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvbnN0YW50IGlzCisgICAgICAgKHN5cy5tYXhpbnQgLSAxKS4gIEluIHRoYXQgY2FzZSwgd2Ugd2FudCBhIFB5SW50T2JqZWN0LCBub3QgYQorICAgICAgIFB5TG9uZ09iamVjdC4KKyAgICAqLworICAgIGlmIChUWVBFKENISUxEKG4sIDApKSA9PSBNSU5VUworICAgICAgICAmJiBOQ0gobikgPT0gMgorICAgICAgICAmJiBUWVBFKChwZmFjdG9yID0gQ0hJTEQobiwgMSkpKSA9PSBmYWN0b3IKKyAgICAgICAgJiYgTkNIKHBmYWN0b3IpID09IDEKKyAgICAgICAgJiYgVFlQRSgocHBvd2VyID0gQ0hJTEQocGZhY3RvciwgMCkpKSA9PSBwb3dlcgorICAgICAgICAmJiBOQ0gocHBvd2VyKSA9PSAxCisgICAgICAgICYmIFRZUEUoKHBhdG9tID0gQ0hJTEQocHBvd2VyLCAwKSkpID09IGF0b20KKyAgICAgICAgJiYgVFlQRSgocG51bSA9IENISUxEKHBhdG9tLCAwKSkpID09IE5VTUJFUikgeworICAgICAgICBjaGFyICpzID0gUHlPYmplY3RfTUFMTE9DKHN0cmxlbihTVFIocG51bSkpICsgMik7CisgICAgICAgIGlmIChzID09IE5VTEwpCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgc1swXSA9ICctJzsKKyAgICAgICAgc3RyY3B5KHMgKyAxLCBTVFIocG51bSkpOworICAgICAgICBQeU9iamVjdF9GUkVFKFNUUihwbnVtKSk7CisgICAgICAgIFNUUihwbnVtKSA9IHM7CisgICAgICAgIHJldHVybiBhc3RfZm9yX2F0b20oYywgcGF0b20pOworICAgIH0KKworICAgIGV4cHJlc3Npb24gPSBhc3RfZm9yX2V4cHIoYywgQ0hJTEQobiwgMSkpOworICAgIGlmICghZXhwcmVzc2lvbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBzd2l0Y2ggKFRZUEUoQ0hJTEQobiwgMCkpKSB7CisgICAgICAgIGNhc2UgUExVUzoKKyAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKFVBZGQsIGV4cHJlc3Npb24sIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+Y19hcmVuYSk7CisgICAgICAgIGNhc2UgTUlOVVM6CisgICAgICAgICAgICByZXR1cm4gVW5hcnlPcChVU3ViLCBleHByZXNzaW9uLCBMSU5FTk8obiksIG4tPm5fY29sX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOworICAgICAgICBjYXNlIFRJTERFOgorICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoSW52ZXJ0LCBleHByZXNzaW9uLCBMSU5FTk8obiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOworICAgIH0KKyAgICBQeUVycl9Gb3JtYXQoUHlFeGNfU3lzdGVtRXJyb3IsICJ1bmhhbmRsZWQgZmFjdG9yOiAlZCIsCisgICAgICAgICAgICAgICAgIFRZUEUoQ0hJTEQobiwgMCkpKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGV4cHJfdHkKIGFzdF9mb3JfcG93ZXIoc3RydWN0IGNvbXBpbGluZyAqYywgY29uc3Qgbm9kZSAqbikKIHsKICAgICAvKiBwb3dlcjogYXRvbSB0cmFpbGVyKiAoJyoqJyBmYWN0b3IpKgpAQCAtMTY2MiwzMCArMTcxOSwxMiBAQAogCSAgICB9CiAJICAgIHJldHVybiBZaWVsZChleHAsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKIAl9Ci0gICAgICAgIGNhc2UgZmFjdG9yOiB7Ci0gICAgICAgICAgICBleHByX3R5IGV4cHJlc3Npb247Ci0gICAgICAgICAgICAKKyAgICAgICAgY2FzZSBmYWN0b3I6CiAgICAgICAgICAgICBpZiAoTkNIKG4pID09IDEpIHsKICAgICAgICAgICAgICAgICBuID0gQ0hJTEQobiwgMCk7CiAgICAgICAgICAgICAgICAgZ290byBsb29wOwogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleHByZXNzaW9uID0gYXN0X2Zvcl9leHByKGMsIENISUxEKG4sIDEpKTsKLSAgICAgICAgICAgIGlmICghZXhwcmVzc2lvbikKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKLQotICAgICAgICAgICAgc3dpdGNoIChUWVBFKENISUxEKG4sIDApKSkgewotICAgICAgICAgICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVuYXJ5T3AoVUFkZCwgZXhwcmVzc2lvbiwgTElORU5PKG4pLCBuLT5uX2NvbF9vZmZzZXQsIGMtPmNfYXJlbmEpOwotICAgICAgICAgICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBVbmFyeU9wKFVTdWIsIGV4cHJlc3Npb24sIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5hcnlPcChJbnZlcnQsIGV4cHJlc3Npb24sIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19TeXN0ZW1FcnJvciwgInVuaGFuZGxlZCBmYWN0b3I6ICVkIiwKLQkgICAgCQkgVFlQRShDSElMRChuLCAwKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KKwkgICAgcmV0dXJuIGFzdF9mb3JfZmFjdG9yKGMsIG4pOwogICAgICAgICBjYXNlIHBvd2VyOgogICAgICAgICAgICAgcmV0dXJuIGFzdF9mb3JfcG93ZXIoYywgbik7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODkzLDIwICsxOTMyLDE5IEBACiAgICAgICAgIG9wZXJhdG9yX3R5IG5ld29wZXJhdG9yOwogCW5vZGUgKmNoID0gQ0hJTEQobiwgMCk7CiAKLQlpZiAoVFlQRShjaCkgPT0gdGVzdGxpc3QpCi0JICAgIGV4cHIxID0gYXN0X2Zvcl90ZXN0bGlzdChjLCBjaCk7Ci0JZWxzZQotCSAgICBleHByMSA9IFlpZWxkKGFzdF9mb3JfZXhwcihjLCBDSElMRChjaCwgMCkpLCBMSU5FTk8oY2gpLCBuLT5uX2NvbF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGMtPmNfYXJlbmEpOwotCisJZXhwcjEgPSBhc3RfZm9yX3Rlc3RsaXN0KGMsIGNoKTsKICAgICAgICAgaWYgKCFleHByMSkKICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAvKiBUT0RPKGpoeWx0b24pOiBGaWd1cmUgb3V0IHdoeSBzZXRfY29udGV4dCgpIGNhbid0IGJlIHVzZWQgaGVyZS4gKi8KKyAgICAgICAgLyogVE9ETyhuYXMpOiBSZW1vdmUgZHVwbGljYXRlZCBlcnJvciBjaGVja3MgKHNldF9jb250ZXh0IGRvZXMgaXQpICovCiAgICAgICAgIHN3aXRjaCAoZXhwcjEtPmtpbmQpIHsKICAgICAgICAgICAgIGNhc2UgR2VuZXJhdG9yRXhwX2tpbmQ6CiAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGNoLCAiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8gZ2VuZXJhdG9yICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cHJlc3Npb24gbm90IHBvc3NpYmxlIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICBjYXNlIFlpZWxkX2tpbmQ6CisgICAgICAgICAgICAgICAgYXN0X2Vycm9yKGNoLCAiYXVnbWVudGVkIGFzc2lnbm1lbnQgdG8geWllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwcmVzc2lvbiBub3QgcG9zc2libGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIGNhc2UgTmFtZV9raW5kOiB7CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdmFyX25hbWUgPSBQeVN0cmluZ19BU19TVFJJTkcoZXhwcjEtPnYuTmFtZS5pZCk7CiAgICAgICAgICAgICAgICAgaWYgKHZhcl9uYW1lWzBdID09ICdOJyAmJiAhc3RyY21wKHZhcl9uYW1lLCAiTm9uZSIpKSB7CkBAIC0xOTIzLDEyICsxOTYxLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NpZ25tZW50Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KKwlzZXRfY29udGV4dChleHByMSwgU3RvcmUsIGNoKTsKIAogCWNoID0gQ0hJTEQobiwgMik7CiAJaWYgKFRZUEUoY2gpID09IHRlc3RsaXN0KQogCSAgICBleHByMiA9IGFzdF9mb3JfdGVzdGxpc3QoYywgY2gpOwogCWVsc2UKLQkgICAgZXhwcjIgPSBZaWVsZChhc3RfZm9yX2V4cHIoYywgY2gpLCBMSU5FTk8oY2gpLCBjaC0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKKwkgICAgZXhwcjIgPSBhc3RfZm9yX2V4cHIoYywgY2gpOwogICAgICAgICBpZiAoIWV4cHIyKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAKQEAgLTIxNDIsNyArMjE4MSwxNCBAQAogIGxvb3A6CiAgICAgc3dpdGNoIChUWVBFKG4pKSB7CiAgICAgICAgIGNhc2UgaW1wb3J0X2FzX25hbWU6Ci0gICAgICAgICAgICBzdHIgPSAoTkNIKG4pID09IDMpID8gTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMikpIDogTlVMTDsKKyAgICAgICAgICAgIHN0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAoTkNIKG4pID09IDMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKFNUUihDSElMRChuLCAxKSksICJhcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKG4sICJtdXN0IHVzZSAnYXMnIGluIGltcG9ydCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RyID0gTkVXX0lERU5USUZJRVIoQ0hJTEQobiwgMikpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGFsaWFzKE5FV19JREVOVElGSUVSKENISUxEKG4sIDApKSwgc3RyLCBjLT5jX2FyZW5hKTsKICAgICAgICAgY2FzZSBkb3R0ZWRfYXNfbmFtZToKICAgICAgICAgICAgIGlmIChOQ0gobikgPT0gMSkgewpAQCAtMjE1MSw2ICsyMTk3LDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICBhbGlhc190eSBhID0gYWxpYXNfZm9yX2ltcG9ydF9uYW1lKGMsIENISUxEKG4sIDApKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyY21wKFNUUihDSElMRChuLCAxKSksICJhcyIpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYXN0X2Vycm9yKG4sICJtdXN0IHVzZSAnYXMnIGluIGltcG9ydCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYXNzZXJ0KCFhLT5hc25hbWUpOwogICAgICAgICAgICAgICAgIGEtPmFzbmFtZSA9IE5FV19JREVOVElGSUVSKENISUxEKG4sIDIpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gYTsKQEAgLTI2MjEsNiArMjY3MSw3IEBACiAgICAgYXNkbF9zZXEgKl90YXJnZXQsICpzZXEgPSBOVUxMLCAqc3VpdGVfc2VxOwogICAgIGV4cHJfdHkgZXhwcmVzc2lvbjsKICAgICBleHByX3R5IHRhcmdldDsKKyAgICBjb25zdCBub2RlICpub2RlX3RhcmdldDsKICAgICAvKiBmb3Jfc3RtdDogJ2ZvcicgZXhwcmxpc3QgJ2luJyB0ZXN0bGlzdCAnOicgc3VpdGUgWydlbHNlJyAnOicgc3VpdGVdICovCiAgICAgUkVRKG4sIGZvcl9zdG10KTsKIApAQCAtMjYzMCwxMCArMjY4MSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgX3RhcmdldCA9IGFzdF9mb3JfZXhwcmxpc3QoYywgQ0hJTEQobiwgMSksIFN0b3JlKTsKKyAgICBub2RlX3RhcmdldCA9IENISUxEKG4sIDEpOworICAgIF90YXJnZXQgPSBhc3RfZm9yX2V4cHJsaXN0KGMsIG5vZGVfdGFyZ2V0LCBTdG9yZSk7CiAgICAgaWYgKCFfdGFyZ2V0KQogICAgICAgICByZXR1cm4gTlVMTDsKLSAgICBpZiAoYXNkbF9zZXFfTEVOKF90YXJnZXQpID09IDEpCisgICAgLyogQ2hlY2sgdGhlICMgb2YgY2hpbGRyZW4gcmF0aGVyIHRoYW4gdGhlIGxlbmd0aCBvZiBfdGFyZ2V0LCBzaW5jZQorICAgICAgIGZvciB4LCBpbiAuLi4gaGFzIDEgZWxlbWVudCBpbiBfdGFyZ2V0LCBidXQgc3RpbGwgcmVxdWlyZXMgYSBUdXBsZS4gKi8KKyAgICBpZiAoTkNIKG5vZGVfdGFyZ2V0KSA9PSAxKQogCXRhcmdldCA9IChleHByX3R5KWFzZGxfc2VxX0dFVChfdGFyZ2V0LCAwKTsKICAgICBlbHNlCiAJdGFyZ2V0ID0gVHVwbGUoX3RhcmdldCwgU3RvcmUsIExJTkVOTyhuKSwgbi0+bl9jb2xfb2Zmc2V0LCBjLT5jX2FyZW5hKTsKZGlmZiAtLWdpdCBhL1B5dGhvbi9jZXZhbC5jIGIvUHl0aG9uL2NldmFsLmMKaW5kZXggZjE0ZTdkYS4uOWE5Yjk4ZSAxMDA2NDQKLS0tIGEvUHl0aG9uL2NldmFsLmMKKysrIGIvUHl0aG9uL2NldmFsLmMKQEAgLTIwNSw3ICsyMDUsNyBAQAogCiAjaWZkZWYgV0lUSF9USFJFQUQKIAotI2lmbmRlZiBET05UX0hBVkVfRVJSTk9fSAorI2lmZGVmIEhBVkVfRVJSTk9fSAogI2luY2x1ZGUgPGVycm5vLmg+CiAjZW5kaWYKICNpbmNsdWRlICJweXRocmVhZC5oIgpAQCAtMjc0MCw3ICsyNzQwLDcgQEAKIAkvKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBzdG9yYWdlIGZvciBjZWxsIHZhcnMsIGFuZCBjb3B5IGZyZWUKIAkgICB2YXJzIGludG8gZnJhbWUuICBUaGlzIGlzbid0IHRvbyBlZmZpY2llbnQgcmlnaHQgbm93LiAqLwogCWlmIChQeVR1cGxlX0dFVF9TSVpFKGNvLT5jb19jZWxsdmFycykpIHsKLQkJaW50IGkgPSAwLCBqID0gMCwgbmFyZ3MsIGZvdW5kOworCQlpbnQgaSwgaiwgbmFyZ3MsIGZvdW5kOwogCQljaGFyICpjZWxsbmFtZSwgKmFyZ25hbWU7CiAJCVB5T2JqZWN0ICpjOwogCkBAIC0zMzE4LDcgKzMzMTgsNyBAQAogUHlFdmFsX0dldFJlc3RyaWN0ZWQodm9pZCkKIHsKIAlQeUZyYW1lT2JqZWN0ICpjdXJyZW50X2ZyYW1lID0gUHlFdmFsX0dldEZyYW1lKCk7Ci0JcmV0dXJuIGN1cnJlbnRfZnJhbWUgPT0gTlVMTCA/IDAgOiBjdXJyZW50X2ZyYW1lLT5mX3Jlc3RyaWN0ZWQ7CisJcmV0dXJuIGN1cnJlbnRfZnJhbWUgPT0gTlVMTCA/IDAgOiBQeUZyYW1lX0lzUmVzdHJpY3RlZChjdXJyZW50X2ZyYW1lKTsKIH0KIAogaW50CkBAIC00MTg3LDYgKzQxODcsMTQgQEAKIHsKIAkvKiBUaGlzIGZ1bmN0aW9uIGltcGxlbWVudHMgJ3ZhcmlhYmxlICs9IGV4cHInIHdoZW4gYm90aCBhcmd1bWVudHMKIAkgICBhcmUgc3RyaW5ncy4gKi8KKwlQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7CisJUHlfc3NpemVfdCB3X2xlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKHcpOworCVB5X3NzaXplX3QgbmV3X2xlbiA9IHZfbGVuICsgd19sZW47CisJaWYgKG5ld19sZW4gPCAwKSB7CisJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19PdmVyZmxvd0Vycm9yLAorCQkJCSJzdHJpbmdzIGFyZSB0b28gbGFyZ2UgdG8gY29uY2F0Iik7CisJCXJldHVybiBOVUxMOworCX0KIAogCWlmICh2LT5vYl9yZWZjbnQgPT0gMikgewogCQkvKiBJbiB0aGUgY29tbW9uIGNhc2UsIHRoZXJlIGFyZSAyIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlCkBAIC00MjMxLDkgKzQyMzksNyBAQAogCQkvKiBOb3cgd2Ugb3duIHRoZSBsYXN0IHJlZmVyZW5jZSB0byAndicsIHNvIHdlIGNhbiByZXNpemUgaXQKIAkJICogaW4tcGxhY2UuCiAJCSAqLwotCQlQeV9zc2l6ZV90IHZfbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUodik7Ci0JCVB5X3NzaXplX3Qgd19sZW4gPSBQeVN0cmluZ19HRVRfU0laRSh3KTsKLQkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIHZfbGVuICsgd19sZW4pICE9IDApIHsKKwkJaWYgKF9QeVN0cmluZ19SZXNpemUoJnYsIG5ld19sZW4pICE9IDApIHsKIAkJCS8qIFhYWCBpZiBfUHlTdHJpbmdfUmVzaXplKCkgZmFpbHMsICd2JyBoYXMgYmVlbgogCQkJICogZGVhbGxvY2F0ZWQgc28gaXQgY2Fubm90IGJlIHB1dCBiYWNrIGludG8gJ3ZhcmlhYmxlJy4KIAkJCSAqIFRoZSBNZW1vcnlFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZSBpcyBubyB2YWx1ZSBpbgpkaWZmIC0tZ2l0IGEvUHl0aG9uL2NvZGVjcy5jIGIvUHl0aG9uL2NvZGVjcy5jCmluZGV4IDA0NmFiZTMuLjRiMGY0Y2IgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb2RlY3MuYworKysgYi9QeXRob24vY29kZWNzLmMKQEAgLTI0OSwxNCArMjQ5LDE3IEBACiAJCQkgICAgICAgY29uc3QgY2hhciAqZXJyb3JzLAogCQkJICAgICAgIGNvbnN0IGludCBpbmRleCkKIHsKLSAgICBQeU9iamVjdCAqY29kZWNzLCAqc3RyZWFtY29kZWM7CisgICAgUHlPYmplY3QgKmNvZGVjcywgKnN0cmVhbWNvZGVjLCAqY29kZWNjbHM7CiAKICAgICBjb2RlY3MgPSBfUHlDb2RlY19Mb29rdXAoZW5jb2RpbmcpOwogICAgIGlmIChjb2RlY3MgPT0gTlVMTCkKIAlyZXR1cm4gTlVMTDsKIAotICAgIHN0cmVhbWNvZGVjID0gUHlFdmFsX0NhbGxGdW5jdGlvbigKLQlQeVR1cGxlX0dFVF9JVEVNKGNvZGVjcywgaW5kZXgpLCAiT3MiLCBzdHJlYW0sIGVycm9ycyk7CisgICAgY29kZWNjbHMgPSBQeVR1cGxlX0dFVF9JVEVNKGNvZGVjcywgaW5kZXgpOworICAgIGlmIChlcnJvcnMgIT0gTlVMTCkKKwlzdHJlYW1jb2RlYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb2RlY2NscywgIk9zIiwgc3RyZWFtLCBlcnJvcnMpOworICAgIGVsc2UKKwlzdHJlYW1jb2RlYyA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihjb2RlY2NscywgIk8iLCBzdHJlYW0pOwogICAgIFB5X0RFQ1JFRihjb2RlY3MpOwogICAgIHJldHVybiBzdHJlYW1jb2RlYzsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9jb21waWxlLmMgYi9QeXRob24vY29tcGlsZS5jCmluZGV4IDZkOTYwMDYuLjQ0NjQ4ODIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9jb21waWxlLmMKKysrIGIvUHl0aG9uL2NvbXBpbGUuYwpAQCAtMTQzLDcgKzE0Myw3IEBACiAJUHlGdXR1cmVGZWF0dXJlcyAqY19mdXR1cmU7IC8qIHBvaW50ZXIgdG8gbW9kdWxlJ3MgX19mdXR1cmVfXyAqLwogCVB5Q29tcGlsZXJGbGFncyAqY19mbGFnczsKIAotCWludCBjX2ludGVyYWN0aXZlOworCWludCBjX2ludGVyYWN0aXZlOwkgLyogdHJ1ZSBpZiBpbiBpbnRlcmFjdGl2ZSBtb2RlICovCiAJaW50IGNfbmVzdGxldmVsOwogCiAJc3RydWN0IGNvbXBpbGVyX3VuaXQgKnU7IC8qIGNvbXBpbGVyIHN0YXRlIGZvciBjdXJyZW50IGJsb2NrICovCkBAIC0zMDAsOCArMzAwLDExIEBACiBQeU5vZGVfQ29tcGlsZShzdHJ1Y3QgX25vZGUgKm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQogewogCVB5Q29kZU9iamVjdCAqY28gPSBOVUxMOworCW1vZF90eSBtb2Q7CiAJUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCW1vZF90eSBtb2QgPSBQeUFTVF9Gcm9tTm9kZShuLCBOVUxMLCBmaWxlbmFtZSwgYXJlbmEpOworCWlmICghYXJlbmEpCisJCXJldHVybiBOVUxMOworCW1vZCA9IFB5QVNUX0Zyb21Ob2RlKG4sIE5VTEwsIGZpbGVuYW1lLCBhcmVuYSk7CiAJaWYgKG1vZCkKIAkJY28gPSBQeUFTVF9Db21waWxlKG1vZCwgZmlsZW5hbWUsIE5VTEwsIGFyZW5hKTsKIAlQeUFyZW5hX0ZyZWUoYXJlbmEpOwpAQCAtNjEwLDggKzYxMywxMCBAQAogCXVuc2lnbmVkIGludCAqYmxvY2tzID0gKHVuc2lnbmVkIGludCAqKVB5TWVtX01hbGxvYyhsZW4qc2l6ZW9mKGludCkpOwogCWludCBpLGosIG9wY29kZSwgYmxvY2tjbnQgPSAwOwogCi0JaWYgKGJsb2NrcyA9PSBOVUxMKQorCWlmIChibG9ja3MgPT0gTlVMTCkgeworCQlQeUVycl9Ob01lbW9yeSgpOwogCQlyZXR1cm4gTlVMTDsKKwl9CiAJbWVtc2V0KGJsb2NrcywgMCwgbGVuKnNpemVvZihpbnQpKTsKIAogCS8qIE1hcmsgbGFiZWxzIGluIHRoZSBmaXJzdCBwYXNzICovCkBAIC0xMDY2LDE0ICsxMDcxLDE0IEBACiAJCVB5T2JqZWN0X0ZyZWUoKHZvaWQgKiliKTsKIAkJYiA9IG5leHQ7CiAJfQotCVB5X1hERUNSRUYodS0+dV9zdGUpOwotCVB5X1hERUNSRUYodS0+dV9uYW1lKTsKLQlQeV9YREVDUkVGKHUtPnVfY29uc3RzKTsKLQlQeV9YREVDUkVGKHUtPnVfbmFtZXMpOwotCVB5X1hERUNSRUYodS0+dV92YXJuYW1lcyk7Ci0JUHlfWERFQ1JFRih1LT51X2ZyZWV2YXJzKTsKLQlQeV9YREVDUkVGKHUtPnVfY2VsbHZhcnMpOwotCVB5X1hERUNSRUYodS0+dV9wcml2YXRlKTsKKwlQeV9DTEVBUih1LT51X3N0ZSk7CisJUHlfQ0xFQVIodS0+dV9uYW1lKTsKKwlQeV9DTEVBUih1LT51X2NvbnN0cyk7CisJUHlfQ0xFQVIodS0+dV9uYW1lcyk7CisJUHlfQ0xFQVIodS0+dV92YXJuYW1lcyk7CisJUHlfQ0xFQVIodS0+dV9mcmVldmFycyk7CisJUHlfQ0xFQVIodS0+dV9jZWxsdmFycyk7CisJUHlfQ0xFQVIodS0+dV9wcml2YXRlKTsKIAlQeU9iamVjdF9GcmVlKHUpOwogfQogCkBAIC0xMTAwLDggKzExMDUsMTcgQEAKIAl1LT51X25hbWUgPSBuYW1lOwogCXUtPnVfdmFybmFtZXMgPSBsaXN0MmRpY3QodS0+dV9zdGUtPnN0ZV92YXJuYW1lcyk7CiAJdS0+dV9jZWxsdmFycyA9IGRpY3RieXR5cGUodS0+dV9zdGUtPnN0ZV9zeW1ib2xzLCBDRUxMLCAwLCAwKTsKKwlpZiAoIXUtPnVfdmFybmFtZXMgfHwgIXUtPnVfY2VsbHZhcnMpIHsKKwkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOworCQlyZXR1cm4gMDsKKwl9CisKIAl1LT51X2ZyZWV2YXJzID0gZGljdGJ5dHlwZSh1LT51X3N0ZS0+c3RlX3N5bWJvbHMsIEZSRUUsIERFRl9GUkVFX0NMQVNTLAogCQkJCSAgIFB5RGljdF9TaXplKHUtPnVfY2VsbHZhcnMpKTsKKwlpZiAoIXUtPnVfZnJlZXZhcnMpIHsKKwkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOworCQlyZXR1cm4gMDsKKwl9CiAKIAl1LT51X2Jsb2NrcyA9IE5VTEw7CiAJdS0+dV90bXBuYW1lID0gMDsKQEAgLTExMjUsNyArMTEzOSw4IEBACiAJLyogUHVzaCB0aGUgb2xkIGNvbXBpbGVyX3VuaXQgb24gdGhlIHN0YWNrLiAqLwogCWlmIChjLT51KSB7CiAJCVB5T2JqZWN0ICp3cmFwcGVyID0gUHlDT2JqZWN0X0Zyb21Wb2lkUHRyKGMtPnUsIE5VTEwpOwotCQlpZiAoUHlMaXN0X0FwcGVuZChjLT5jX3N0YWNrLCB3cmFwcGVyKSA8IDApIHsKKwkJaWYgKCF3cmFwcGVyIHx8IFB5TGlzdF9BcHBlbmQoYy0+Y19zdGFjaywgd3JhcHBlcikgPCAwKSB7CisJCQlQeV9YREVDUkVGKHdyYXBwZXIpOwogCQkJY29tcGlsZXJfdW5pdF9mcmVlKHUpOwogCQkJcmV0dXJuIDA7CiAJCX0KQEAgLTEyNTEsNiArMTI2Niw3IEBACiAJCSAgICAgICBzaXplb2Yoc3RydWN0IGluc3RyKSAqIERFRkFVTFRfQkxPQ0tfU0laRSk7CiAJfQogCWVsc2UgaWYgKGItPmJfaXVzZWQgPT0gYi0+Yl9pYWxsb2MpIHsKKwkJc3RydWN0IGluc3RyICp0bXA7CiAJCXNpemVfdCBvbGRzaXplLCBuZXdzaXplOwogCQlvbGRzaXplID0gYi0+Yl9pYWxsb2MgKiBzaXplb2Yoc3RydWN0IGluc3RyKTsKIAkJbmV3c2l6ZSA9IG9sZHNpemUgPDwgMTsKQEAgLTEyNTksMTAgKzEyNzUsMTMgQEAKIAkJCXJldHVybiAtMTsKIAkJfQogCQliLT5iX2lhbGxvYyA8PD0gMTsKLQkJYi0+Yl9pbnN0ciA9IChzdHJ1Y3QgaW5zdHIgKilQeU9iamVjdF9SZWFsbG9jKAorCQl0bXAgPSAoc3RydWN0IGluc3RyICopUHlPYmplY3RfUmVhbGxvYygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopYi0+Yl9pbnN0ciwgbmV3c2l6ZSk7Ci0JCWlmIChiLT5iX2luc3RyID09IE5VTEwpCisJCWlmICh0bXAgPT0gTlVMTCkgeworCQkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJCXJldHVybiAtMTsKKwkJfQorCQliLT5iX2luc3RyID0gdG1wOwogCQltZW1zZXQoKGNoYXIgKiliLT5iX2luc3RyICsgb2xkc2l6ZSwgMCwgbmV3c2l6ZSAtIG9sZHNpemUpOwogCX0KIAlyZXR1cm4gYi0+Yl9pdXNlZCsrOwpAQCAtMTc2OSw3ICsxNzg4LDggQEAKIAkJaWYgKCFtb2R1bGUpCiAJCQlyZXR1cm4gTlVMTDsKIAl9Ci0JaWYgKCFjb21waWxlcl9lbnRlcl9zY29wZShjLCBtb2R1bGUsIG1vZCwgMSkpCisJLyogVXNlIDAgZm9yIGZpcnN0bGluZW5vIGluaXRpYWxseSwgd2lsbCBmaXh1cCBpbiBhc3NlbWJsZSgpLiAqLworCWlmICghY29tcGlsZXJfZW50ZXJfc2NvcGUoYywgbW9kdWxlLCBtb2QsIDApKQogCQlyZXR1cm4gTlVMTDsKIAlzd2l0Y2ggKG1vZC0+a2luZCkgewogCWNhc2UgTW9kdWxlX2tpbmQ6IApAQCAtMTk2MywxMSArMTk4Myw4IEBACiAJbiA9IGFzZGxfc2VxX0xFTihzLT52LkZ1bmN0aW9uRGVmLmJvZHkpOwogCS8qIGlmIHRoZXJlIHdhcyBhIGRvY3N0cmluZywgd2UgbmVlZCB0byBza2lwIHRoZSBmaXJzdCBzdGF0ZW1lbnQgKi8KIAlmb3IgKGkgPSBkb2NzdHJpbmc7IGkgPCBuOyBpKyspIHsKLQkJc3RtdF90eSBzMiA9IChzdG10X3R5KWFzZGxfc2VxX0dFVChzLT52LkZ1bmN0aW9uRGVmLmJvZHksIGkpOwotCQlpZiAoaSA9PSAwICYmIHMyLT5raW5kID09IEV4cHJfa2luZCAmJgotCQkgICAgczItPnYuRXhwci52YWx1ZS0+a2luZCA9PSBTdHJfa2luZCkKLQkJCWNvbnRpbnVlOwotCQlWSVNJVF9JTl9TQ09QRShjLCBzdG10LCBzMik7CisJCXN0ID0gKHN0bXRfdHkpYXNkbF9zZXFfR0VUKHMtPnYuRnVuY3Rpb25EZWYuYm9keSwgaSk7CisJCVZJU0lUX0lOX1NDT1BFKGMsIHN0bXQsIHN0KTsKIAl9CiAJY28gPSBhc3NlbWJsZShjLCAxKTsKIAljb21waWxlcl9leGl0X3Njb3BlKGMpOwpAQCAtMjE5MCw2ICsyMjA3LDEwIEBACiAJVklTSVQoYywgZXhwciwgcy0+di5Gb3IuaXRlcik7CiAJQURET1AoYywgR0VUX0lURVIpOwogCWNvbXBpbGVyX3VzZV9uZXh0X2Jsb2NrKGMsIHN0YXJ0KTsKKwkvKiBYWFgobm5vcndpdHopOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXM/CisJICAgZm9yIGxvb3BzIGFyZSBzcGVjaWFsLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdHJhY2UgdGhlbQorCSAgIGVhY2ggdGltZSBhcm91bmQsIHNvIHdlIG5lZWQgdG8gc2V0IGFuIGV4dHJhIGxpbmUgbnVtYmVyLiAqLworCWMtPnUtPnVfbGluZW5vX3NldCA9IGZhbHNlOwogCUFERE9QX0pSRUwoYywgRk9SX0lURVIsIGNsZWFudXApOwogCVZJU0lUKGMsIGV4cHIsIHMtPnYuRm9yLnRhcmdldCk7CiAJVklTSVRfU0VRKGMsIHN0bXQsIHMtPnYuRm9yLmJvZHkpOwpAQCAtMjcwOCwxMSArMjcyOSwxMyBAQAogCWNhc2UgR2xvYmFsX2tpbmQ6CiAJCWJyZWFrOwogCWNhc2UgRXhwcl9raW5kOgotCQlWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwogCQlpZiAoYy0+Y19pbnRlcmFjdGl2ZSAmJiBjLT5jX25lc3RsZXZlbCA8PSAxKSB7CisJCQlWSVNJVChjLCBleHByLCBzLT52LkV4cHIudmFsdWUpOwogCQkJQURET1AoYywgUFJJTlRfRVhQUik7CiAJCX0KLQkJZWxzZSB7CisJCWVsc2UgaWYgKHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBTdHJfa2luZCAmJgorCQkJIHMtPnYuRXhwci52YWx1ZS0+a2luZCAhPSBOdW1fa2luZCkgeworCQkJVklTSVQoYywgZXhwciwgcy0+di5FeHByLnZhbHVlKTsKIAkJCUFERE9QKGMsIFBPUF9UT1ApOwogCQl9CiAJCWJyZWFrOwpAQCAtMjk4OSw2ICszMDEyLDcgQEAKIAkJcmV0dXJuIDA7CiAJcyA9IGUtPnYuQm9vbE9wLnZhbHVlczsKIAluID0gYXNkbF9zZXFfTEVOKHMpIC0gMTsKKwlhc3NlcnQobiA+PSAwKTsKIAlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAJCVZJU0lUKGMsIGV4cHIsIChleHByX3R5KWFzZGxfc2VxX0dFVChzLCBpKSk7CiAJCUFERE9QX0pSRUwoYywganVtcGksIGVuZCk7CkBAIC0zNjQzLDcgKzM2NjcsNyBAQAogCWFzc2VydChzLT5raW5kID09IEF1Z0Fzc2lnbl9raW5kKTsKIAogCXN3aXRjaCAoZS0+a2luZCkgewotCQljYXNlIEF0dHJpYnV0ZV9raW5kOgorCWNhc2UgQXR0cmlidXRlX2tpbmQ6CiAJCWF1Z2UgPSBBdHRyaWJ1dGUoZS0+di5BdHRyaWJ1dGUudmFsdWUsIGUtPnYuQXR0cmlidXRlLmF0dHIsCiAJCQkJIEF1Z0xvYWQsIGUtPmxpbmVubywgZS0+Y29sX29mZnNldCwgYy0+Y19hcmVuYSk7CiAJCWlmIChhdWdlID09IE5VTEwpCkBAIC0zNjY2LDcgKzM2OTAsOCBAQAogCQlWSVNJVChjLCBleHByLCBhdWdlKTsKIAkJYnJlYWs7CiAJY2FzZSBOYW1lX2tpbmQ6Ci0JCVZJU0lUKGMsIGV4cHIsIHMtPnYuQXVnQXNzaWduLnRhcmdldCk7CisJCWlmICghY29tcGlsZXJfbmFtZW9wKGMsIGUtPnYuTmFtZS5pZCwgTG9hZCkpCisJCSAgICByZXR1cm4gMDsKIAkJVklTSVQoYywgZXhwciwgcy0+di5BdWdBc3NpZ24udmFsdWUpOwogCQlBRERPUChjLCBpbnBsYWNlX2Jpbm9wKGMsIHMtPnYuQXVnQXNzaWduLm9wKSk7CiAJCXJldHVybiBjb21waWxlcl9uYW1lb3AoYywgZS0+di5OYW1lLmlkLCBTdG9yZSk7CkBAIC0zOTc5LDYgKzQwMDQsOCBAQAogCQliLT5iX3N0YXJ0ZGVwdGggPSBJTlRfTUlOOwogCQllbnRyeWJsb2NrID0gYjsKIAl9CisJaWYgKCFlbnRyeWJsb2NrKQorCQlyZXR1cm4gMDsKIAlyZXR1cm4gc3RhY2tkZXB0aF93YWxrKGMsIGVudHJ5YmxvY2ssIDAsIDApOwogfQogCkBAIC00MDc0LDkgKzQxMDEsMTAgQEAKIAogSW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yaywgd2hlbiB0aGUgYWRkciBmaWVsZCBpbmNyZW1lbnRzIGJ5IG1vcmUgdGhhbiAyNTUsCiB0aGUgbGluZSAjIGluY3JlbWVudCBpbiBlYWNoIHBhaXIgZ2VuZXJhdGVkIG11c3QgYmUgMCB1bnRpbCB0aGUgcmVtYWluaW5nIGFkZHIKLWluY3JlbWVudCBpcyA8IDI1Ni4gIFNvLCBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgY29tX3NldF9saW5lbm8gc2hvdWxkIG5vdCAoYXMKLXdhcyBhY3R1YWxseSBkb25lIHVudGlsIDIuMikgZXhwYW5kIDMwMCwgMzAwIHRvIDI1NSwgMjU1LCAgNDUsIDQ1LCBidXQgdG8KLTI1NSwgMCwJIDQ1LCAyNTUsICAwLCA0NS4KK2luY3JlbWVudCBpcyA8IDI1Ni4gIFNvLCBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgYXNzZW1ibGVfbG5vdGFiIChpdCB1c2VkCit0byBiZSBjYWxsZWQgY29tX3NldF9saW5lbm8pIHNob3VsZCBub3QgKGFzIHdhcyBhY3R1YWxseSBkb25lIHVudGlsIDIuMikKK2V4cGFuZCAzMDAsIDMwMCB0byAyNTUsIDI1NSwgNDUsIDQ1LCAKKyAgICAgICAgICAgIGJ1dCB0byAyNTUsICAgMCwgNDUsIDI1NSwgMCwgNDUuCiAqLwogCiBzdGF0aWMgaW50CkBAIC00MDkyLDcgKzQxMjAsMTAgQEAKIAlhc3NlcnQoZF9ieXRlY29kZSA+PSAwKTsKIAlhc3NlcnQoZF9saW5lbm8gPj0gMCk7CiAKLQlpZiAoZF9saW5lbm8gPT0gMCkKKwkvKiBYWFgobm5vcndpdHopOiBpcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXM/CisJICAgZm9yIGxvb3BzIGFyZSBzcGVjaWFsLCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gdHJhY2UgdGhlbQorCSAgIGVhY2ggdGltZSBhcm91bmQsIHNvIHdlIG5lZWQgdG8gc2V0IGFuIGV4dHJhIGxpbmUgbnVtYmVyLiAqLworCWlmIChkX2xpbmVubyA9PSAwICYmIGktPmlfb3Bjb2RlICE9IEZPUl9JVEVSKQogCQlyZXR1cm4gMTsKIAogCWlmIChkX2J5dGVjb2RlID4gMjU1KSB7CkBAIC00MTMxLDEyICs0MTYyLDEyIEBACiAJCX0KIAkJbG5vdGFiID0gKHVuc2lnbmVkIGNoYXIgKikKIAkJCSAgIFB5U3RyaW5nX0FTX1NUUklORyhhLT5hX2xub3RhYikgKyBhLT5hX2xub3RhYl9vZmY7Ci0JCSpsbm90YWIrKyA9IDI1NTsKIAkJKmxub3RhYisrID0gZF9ieXRlY29kZTsKKwkJKmxub3RhYisrID0gMjU1OwogCQlkX2J5dGVjb2RlID0gMDsKIAkJZm9yIChqID0gMTsgaiA8IG5jb2RlczsgaisrKSB7Ci0JCQkqbG5vdGFiKysgPSAyNTU7CiAJCQkqbG5vdGFiKysgPSAwOworCQkJKmxub3RhYisrID0gMjU1OwogCQl9CiAJCWRfbGluZW5vIC09IG5jb2RlcyAqIDI1NTsKIAkJYS0+YV9sbm90YWJfb2ZmICs9IG5jb2RlcyAqIDI7CkBAIC00MTczLDcgKzQyMDQsNyBAQAogYXNzZW1ibGVfZW1pdChzdHJ1Y3QgYXNzZW1ibGVyICphLCBzdHJ1Y3QgaW5zdHIgKmkpCiB7CiAJaW50IHNpemUsIGFyZyA9IDAsIGV4dCA9IDA7Ci0JaW50IGxlbiA9IFB5U3RyaW5nX0dFVF9TSVpFKGEtPmFfYnl0ZWNvZGUpOworCVB5X3NzaXplX3QgbGVuID0gUHlTdHJpbmdfR0VUX1NJWkUoYS0+YV9ieXRlY29kZSk7CiAJY2hhciAqY29kZTsKIAogCXNpemUgPSBpbnN0cnNpemUoaSk7CkBAIC00Mzk3LDYgKzQ0MjgsNDEgQEAKIAlyZXR1cm4gY287CiB9CiAKKworLyogRm9yIGRlYnVnZ2luZyBwdXJwb3NlcyBvbmx5ICovCisjaWYgMAorc3RhdGljIHZvaWQKK2R1bXBfaW5zdHIoY29uc3Qgc3RydWN0IGluc3RyICppKQoreworCWNvbnN0IGNoYXIgKmpyZWwgPSBpLT5pX2pyZWwgPyAianJlbCAiIDogIiI7CisJY29uc3QgY2hhciAqamFicyA9IGktPmlfamFicyA/ICJqYWJzICIgOiAiIjsKKwljaGFyIGFyZ1sxMjhdOworCisJKmFyZyA9ICdcMCc7CisJaWYgKGktPmlfaGFzYXJnKQorCQlzcHJpbnRmKGFyZywgImFyZzogJWQgIiwgaS0+aV9vcGFyZyk7CisKKwlmcHJpbnRmKHN0ZGVyciwgImxpbmU6ICVkLCBvcGNvZGU6ICVkICVzJXMlc1xuIiwgCisJCQlpLT5pX2xpbmVubywgaS0+aV9vcGNvZGUsIGFyZywgamFicywganJlbCk7Cit9CisKK3N0YXRpYyB2b2lkCitkdW1wX2Jhc2ljYmxvY2soY29uc3QgYmFzaWNibG9jayAqYikKK3sKKwljb25zdCBjaGFyICpzZWVuID0gYi0+Yl9zZWVuID8gInNlZW4gIiA6ICIiOworCWNvbnN0IGNoYXIgKmJfcmV0dXJuID0gYi0+Yl9yZXR1cm4gPyAicmV0dXJuICIgOiAiIjsKKwlmcHJpbnRmKHN0ZGVyciwgInVzZWQ6ICVkLCBkZXB0aDogJWQsIG9mZnNldDogJWQgJXMlc1xuIiwKKwkJYi0+Yl9pdXNlZCwgYi0+Yl9zdGFydGRlcHRoLCBiLT5iX29mZnNldCwgc2VlbiwgYl9yZXR1cm4pOworCWlmIChiLT5iX2luc3RyKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgYi0+Yl9pdXNlZDsgaSsrKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgWyUwMmRdICIsIGkpOworCQkJZHVtcF9pbnN0cihiLT5iX2luc3RyICsgaSk7CisJCX0KKwl9Cit9CisjZW5kaWYKKwogc3RhdGljIFB5Q29kZU9iamVjdCAqCiBhc3NlbWJsZShzdHJ1Y3QgY29tcGlsZXIgKmMsIGludCBhZGROb25lKQogewpAQCAtNDQyMyw2ICs0NDg5LDEzIEBACiAJCWVudHJ5YmxvY2sgPSBiOyAKIAl9CiAKKwkvKiBTZXQgZmlyc3RsaW5lbm8gaWYgaXQgd2Fzbid0IGV4cGxpY2l0bHkgc2V0LiAqLworCWlmICghYy0+dS0+dV9maXJzdGxpbmVubykgeworCQlpZiAoZW50cnlibG9jayAmJiBlbnRyeWJsb2NrLT5iX2luc3RyKQorCQkJYy0+dS0+dV9maXJzdGxpbmVubyA9IGVudHJ5YmxvY2stPmJfaW5zdHItPmlfbGluZW5vOworCQllbHNlCisJCQljLT51LT51X2ZpcnN0bGluZW5vID0gMTsKKwl9CiAJaWYgKCFhc3NlbWJsZV9pbml0KCZhLCBuYmxvY2tzLCBjLT51LT51X2ZpcnN0bGluZW5vKSkKIAkJZ290byBlcnJvcjsKIAlkZnMoYywgZW50cnlibG9jaywgJmEpOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL2R5bmxvYWRfd2luLmMgYi9QeXRob24vZHlubG9hZF93aW4uYwppbmRleCAzNjc0NmUyLi4zN2Q2ZDJlIDEwMDY0NAotLS0gYS9QeXRob24vZHlubG9hZF93aW4uYworKysgYi9QeXRob24vZHlubG9hZF93aW4uYwpAQCAtMiw3ICsyLDkgQEAKIC8qIFN1cHBvcnQgZm9yIGR5bmFtaWMgbG9hZGluZyBvZiBleHRlbnNpb24gbW9kdWxlcyAqLwogCiAjaW5jbHVkZSA8d2luZG93cy5oPgorI2lmZGVmIEhBVkVfRElSRUNUX0gKICNpbmNsdWRlIDxkaXJlY3QuaD4KKyNlbmRpZgogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlICJQeXRob24uaCIKZGlmZiAtLWdpdCBhL1B5dGhvbi9lcnJvcnMuYyBiL1B5dGhvbi9lcnJvcnMuYwppbmRleCBkOTlmMjYxLi40OGVkMDVjIDEwMDY0NAotLS0gYS9QeXRob24vZXJyb3JzLmMKKysrIGIvUHl0aG9uL2Vycm9ycy5jCkBAIC02NDEsNyArNjQxLDcgQEAKIAogLyogRnVuY3Rpb24gdG8gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2U7IG1heSByYWlzZSBhbiBleGNlcHRpb24uICovCiBpbnQKLVB5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICptZXNzYWdlKQorUHlFcnJfV2FybkV4KFB5T2JqZWN0ICpjYXRlZ29yeSwgY29uc3QgY2hhciAqbWVzc2FnZSwgUHlfc3NpemVfdCBzdGFja19sZXZlbCkKIHsKIAlQeU9iamVjdCAqZGljdCwgKmZ1bmMgPSBOVUxMOwogCVB5T2JqZWN0ICp3YXJuaW5nc19tb2R1bGUgPSBQeU1vZHVsZV9HZXRXYXJuaW5nc01vZHVsZSgpOwpAQCAtNjU5LDcgKzY1OSw4IEBACiAKIAkJaWYgKGNhdGVnb3J5ID09IE5VTEwpCiAJCQljYXRlZ29yeSA9IFB5RXhjX1J1bnRpbWVXYXJuaW5nOwotCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgInNPIiwgbWVzc2FnZSwgY2F0ZWdvcnkpOworCQlyZXMgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oZnVuYywgInNPbiIsCisJCQkJCSAgICBtZXNzYWdlLCBjYXRlZ29yeSwgc3RhY2tfbGV2ZWwpOwogCQlpZiAocmVzID09IE5VTEwpCiAJCQlyZXR1cm4gLTE7CiAJCVB5X0RFQ1JFRihyZXMpOwpAQCAtNjY3LDYgKzY2OCwxNiBAQAogCX0KIH0KIAorLyogUHlFcnJfV2FybiBpcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSBhbmQgd2lsbCBiZSByZW1vdmVkLgorICAgVXNlIFB5RXJyX1dhcm5FeCBpbnN0ZWFkLiAqLworCisjdW5kZWYgUHlFcnJfV2FybgorCitQeUFQSV9GVU5DKGludCkKK1B5RXJyX1dhcm4oUHlPYmplY3QgKmNhdGVnb3J5LCBjaGFyICptZXNzYWdlKQoreworCXJldHVybiBQeUVycl9XYXJuRXgoY2F0ZWdvcnksIG1lc3NhZ2UsIDEpOworfQogCiAvKiBXYXJuaW5nIHdpdGggZXhwbGljaXQgb3JpZ2luICovCiBpbnQKZGlmZiAtLWdpdCBhL1B5dGhvbi9mdXR1cmUuYyBiL1B5dGhvbi9mdXR1cmUuYwppbmRleCBkMjNmYWQ2Li5kNmYxMWE0IDEwMDY0NAotLS0gYS9QeXRob24vZnV0dXJlLmMKKysrIGIvUHl0aG9uL2Z1dHVyZS5jCkBAIC0xMjEsOCArMTIxLDEwIEBACiAJUHlGdXR1cmVGZWF0dXJlcyAqZmY7CiAKIAlmZiA9IChQeUZ1dHVyZUZlYXR1cmVzICopUHlPYmplY3RfTWFsbG9jKHNpemVvZihQeUZ1dHVyZUZlYXR1cmVzKSk7Ci0JaWYgKGZmID09IE5VTEwpCisJaWYgKGZmID09IE5VTEwpIHsKKwkJUHlFcnJfTm9NZW1vcnkoKTsKIAkJcmV0dXJuIE5VTEw7CisJfQogCWZmLT5mZl9mZWF0dXJlcyA9IDA7CiAJZmYtPmZmX2xpbmVubyA9IC0xOwogCmRpZmYgLS1naXQgYS9QeXRob24vZ2V0YXJncy5jIGIvUHl0aG9uL2dldGFyZ3MuYwppbmRleCA5NjM3NjE4Li44ZGM1ZTc4IDEwMDY0NAotLS0gYS9QeXRob24vZ2V0YXJncy5jCisrKyBiL1B5dGhvbi9nZXRhcmdzLmMKQEAgLTIwNiw2ICsyMDYsOSBAQAogCQkJaWYgKGxldmVsID09IDApCiAJCQkJbWF4Kys7CiAJCQlsZXZlbCsrOworCQkJaWYgKGxldmVsID49IDMwKQorCQkJCVB5X0ZhdGFsRXJyb3IoInRvbyBtYW55IHR1cGxlIG5lc3RpbmcgbGV2ZWxzICIKKwkJCQkJICAgICAgImluIGFyZ3VtZW50IGZvcm1hdCBzdHJpbmciKTsKIAkJCWJyZWFrOwogCQljYXNlICcpJzoKIAkJCWlmIChsZXZlbCA9PSAwKQpAQCAtMzUxLDggKzM1NCw4IEBACiAJCQkJICAgICAgImFyZ3VtZW50ICVkIiwgaWFyZyk7CiAJCQlpID0gMDsKIAkJCXAgKz0gc3RybGVuKHApOwotCQkJd2hpbGUgKGxldmVsc1tpXSA+IDAgJiYgKGludCkocC1idWYpIDwgMjIwKSB7Ci0JCQkJUHlPU19zbnByaW50ZihwLCBzaXplb2YoYnVmKSAtIChidWYgLSBwKSwKKwkJCXdoaWxlIChsZXZlbHNbaV0gPiAwICYmIGkgPCAzMiAmJiAoaW50KShwLWJ1ZikgPCAyMjApIHsKKwkJCQlQeU9TX3NucHJpbnRmKHAsIHNpemVvZihidWYpIC0gKHAgLSBidWYpLAogCQkJCQkgICAgICAiLCBpdGVtICVkIiwgbGV2ZWxzW2ldLTEpOwogCQkJCXAgKz0gc3RybGVuKHApOwogCQkJCWkrKzsKQEAgLTQzOSw2ICs0NDIsMTMgQEAKIAkJY2hhciAqbXNnOwogCQlQeU9iamVjdCAqaXRlbTsKIAkJaXRlbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShhcmcsIGkpOworCQlpZiAoaXRlbSA9PSBOVUxMKSB7CisJCQlQeUVycl9DbGVhcigpOworCQkJbGV2ZWxzWzBdID0gaSsxOworCQkJbGV2ZWxzWzFdID0gMDsKKwkJCXN0cm5jcHkobXNnYnVmLCAiaXMgbm90IHJldHJpZXZhYmxlIiwgYnVmc2l6ZSk7CisJCQlyZXR1cm4gbXNnYnVmOworCQl9CiAJCW1zZyA9IGNvbnZlcnRpdGVtKGl0ZW0sICZmb3JtYXQsIHBfdmEsIGZsYWdzLCBsZXZlbHMrMSwgCiAJCQkJICBtc2didWYsIGJ1ZnNpemUsIGZyZWVsaXN0KTsKIAkJLyogUHlTZXF1ZW5jZV9HZXRJdGVtIGNhbGxzIHRwLT5zcV9pdGVtLCB3aGljaCBJTkNSRUZzICovCkBAIC0xNTA4LDYgKzE1MTgsNyBAQAogCQllbHNlIHsKIAkJCW1zZyA9IHNraXBpdGVtKCZmb3JtYXQsIHBfdmEsIGZsYWdzKTsKIAkJCWlmIChtc2cpIHsKKwkJCQlsZXZlbHNbMF0gPSAwOwogCQkJCXNldGVycm9yKGkrMSwgbXNnLCBsZXZlbHMsIGZuYW1lLCBtZXNzYWdlKTsKIAkJCQlyZXR1cm4gY2xlYW5yZXR1cm4oMCwgZnJlZWxpc3QpOwogCQkJfQpkaWZmIC0tZ2l0IGEvUHl0aG9uL2dldG9wdC5jIGIvUHl0aG9uL2dldG9wdC5jCmluZGV4IDU0MjlmYWMuLjY1OWVmY2YgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9nZXRvcHQuYworKysgYi9QeXRob24vZ2V0b3B0LmMKQEAgLTI0LDYgKzI0LDkgQEAKICAqIGRhdmVnb3R0bmVyQGRlbHBoaS5jb20uCiAgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAKKy8qIE1vZGlmaWVkIHRvIHN1cHBvcnQgLS1oZWxwIGFuZCAtLXZlcnNpb24sIGFzIHdlbGwgYXMgLz8gb24gV2luZG93cworICogYnkgR2VvcmcgQnJhbmRsLiAqLworCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KIApAQCAtNDMsOCArNDYsMTcgQEAKIAogCWlmICgqb3B0X3B0ciA9PSAnXDAnKSB7CiAKLQkJaWYgKF9QeU9TX29wdGluZCA+PSBhcmdjIHx8IGFyZ3ZbX1B5T1Nfb3B0aW5kXVswXSAhPSAnLScgfHwKLQkJICAgIGFyZ3ZbX1B5T1Nfb3B0aW5kXVsxXSA9PSAnXDAnIC8qIGxvbmUgZGFzaCAqLyApCisJCWlmIChfUHlPU19vcHRpbmQgPj0gYXJnYykKKwkJCXJldHVybiAtMTsKKyNpZmRlZiBNU19XSU5ET1dTCisJCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICIvPyIpID09IDApIHsKKwkJCSsrX1B5T1Nfb3B0aW5kOworCQkJcmV0dXJuICdoJzsKKwkJfQorI2VuZGlmCisKKwkJZWxzZSBpZiAoYXJndltfUHlPU19vcHRpbmRdWzBdICE9ICctJyB8fAorCQkgICAgICAgICBhcmd2W19QeU9TX29wdGluZF1bMV0gPT0gJ1wwJyAvKiBsb25lIGRhc2ggKi8gKQogCQkJcmV0dXJuIC0xOwogCiAJCWVsc2UgaWYgKHN0cmNtcChhcmd2W19QeU9TX29wdGluZF0sICItLSIpID09IDApIHsKQEAgLTUyLDYgKzY0LDE3IEBACiAJCQlyZXR1cm4gLTE7CiAJCX0KIAorCQllbHNlIGlmIChzdHJjbXAoYXJndltfUHlPU19vcHRpbmRdLCAiLS1oZWxwIikgPT0gMCkgeworCQkJKytfUHlPU19vcHRpbmQ7CisJCQlyZXR1cm4gJ2gnOworCQl9CisKKwkJZWxzZSBpZiAoc3RyY21wKGFyZ3ZbX1B5T1Nfb3B0aW5kXSwgIi0tdmVyc2lvbiIpID09IDApIHsKKwkJCSsrX1B5T1Nfb3B0aW5kOworCQkJcmV0dXJuICdWJzsKKwkJfQorCisKIAkJb3B0X3B0ciA9ICZhcmd2W19QeU9TX29wdGluZCsrXVsxXTsgCiAJfQogCkBAIC02Miw3ICs4NSw3IEBACiAJCWlmIChfUHlPU19vcHRlcnIpCiAJCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uOiAtJWNcbiIsIG9wdGlvbik7CiAKLQkJcmV0dXJuICc/JzsKKwkJcmV0dXJuICdfJzsKIAl9CiAKIAlpZiAoKihwdHIgKyAxKSA9PSAnOicpIHsKQEAgLTc2LDcgKzk5LDcgQEAKIAkJCQlpZiAoX1B5T1Nfb3B0ZXJyKQogCQkJCQlmcHJpbnRmKHN0ZGVyciwKIAkJCSAgICAiQXJndW1lbnQgZXhwZWN0ZWQgZm9yIHRoZSAtJWMgb3B0aW9uXG4iLCBvcHRpb24pOwotCQkJCXJldHVybiAnPyc7CisJCQkJcmV0dXJuICdfJzsKIAkJCX0KIAogCQkJX1B5T1Nfb3B0YXJnID0gYXJndltfUHlPU19vcHRpbmQrK107CmRpZmYgLS1naXQgYS9QeXRob24vaW1wb3J0LmMgYi9QeXRob24vaW1wb3J0LmMKaW5kZXggYzE0ZThjZC4uZWYzN2U4YiAxMDA2NDQKLS0tIGEvUHl0aG9uL2ltcG9ydC5jCisrKyBiL1B5dGhvbi9pbXBvcnQuYwpAQCAtNjAsNiArNjAsMTAgQEAKICAgICAgICBQeXRob24gMi41YTA6IDYyMDgxIChhc3QtYnJhbmNoKQogICAgICAgIFB5dGhvbiAyLjVhMDogNjIwOTEgKHdpdGgpCiAgICAgICAgUHl0aG9uIDIuNWEwOiA2MjA5MiAoY2hhbmdlZCBXSVRIX0NMRUFOVVAgb3Bjb2RlKQorICAgICAgIFB5dGhvbiAyLjViMzogNjIxMDEgKGZpeCB3cm9uZyBjb2RlOiBmb3IgeCwgaW4gLi4uKQorICAgICAgIFB5dGhvbiAyLjViMzogNjIxMTEgKGZpeCB3cm9uZyBjb2RlOiB4ICs9IHlpZWxkKQorICAgICAgIFB5dGhvbiAyLjVjMTogNjIxMjEgKGZpeCB3cm9uZyBsbm90YWIgd2l0aCBmb3IgbG9vcHMgYW5kCisgICAgICAgCQkJICAgIHN0b3JpbmcgY29uc3RhbnRzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiByZW1vdmVkKQogICAgICAgIFB5dGhvbiAzMDAwOiAgIDMwMDAKIC4KICovCkBAIC05OCw2ICsxMDIsOCBAQAogfTsKICNlbmRpZgogCitzdGF0aWMgUHlUeXBlT2JqZWN0IE51bGxJbXBvcnRlclR5cGU7CS8qIEZvcndhcmQgcmVmZXJlbmNlICovCisKIC8qIEluaXRpYWxpemUgdGhpbmdzICovCiAKIHZvaWQKQEAgLTExNiw2ICsxMjIsOCBAQAogCWZvciAoc2NhbiA9IF9QeUltcG9ydF9TdGFuZGFyZEZpbGV0YWI7IHNjYW4tPnN1ZmZpeCAhPSBOVUxMOyArK3NjYW4pCiAJCSsrY291bnRTOwogCWZpbGV0YWIgPSBQeU1lbV9ORVcoc3RydWN0IGZpbGVkZXNjciwgY291bnREICsgY291bnRTICsgMSk7CisJaWYgKGZpbGV0YWIgPT0gTlVMTCkKKwkJUHlfRmF0YWxFcnJvcigiQ2FuJ3QgaW5pdGlhbGl6ZSBpbXBvcnQgZmlsZSB0YWJsZS4iKTsKIAltZW1jcHkoZmlsZXRhYiwgX1B5SW1wb3J0X0R5bkxvYWRGaWxldGFiLAogCSAgICAgICBjb3VudEQgKiBzaXplb2Yoc3RydWN0IGZpbGVkZXNjcikpOwogCW1lbWNweShmaWxldGFiICsgY291bnRELCBfUHlJbXBvcnRfU3RhbmRhcmRGaWxldGFiLApAQCAtMTUzLDYgKzE2MSw4IEBACiAKIAkvKiBhZGRpbmcgc3lzLnBhdGhfaG9va3MgYW5kIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLCBzZXR0aW5nIHVwCiAJICAgemlwaW1wb3J0ICovCisJaWYgKFB5VHlwZV9SZWFkeSgmTnVsbEltcG9ydGVyVHlwZSkgPCAwKQorCQlnb3RvIGVycm9yOwogCiAJaWYgKFB5X1ZlcmJvc2VGbGFnKQogCQlQeVN5c19Xcml0ZVN0ZGVycigiIyBpbnN0YWxsaW5nIHppcGltcG9ydCBob29rXG4iKTsKQEAgLTE3OCw5ICsxODgsMTEgQEAKIAlpZiAoZXJyKSB7CiAgIGVycm9yOgogCQlQeUVycl9QcmludCgpOwotCQlQeV9GYXRhbEVycm9yKCJpbml0aWFsaXppbmcgc3lzLm1ldGFfcGF0aCwgc3lzLnBhdGhfaG9va3Mgb3IgIgotCQkJICAgICAgInBhdGhfaW1wb3J0ZXJfY2FjaGUgZmFpbGVkIik7CisJCVB5X0ZhdGFsRXJyb3IoImluaXRpYWxpemluZyBzeXMubWV0YV9wYXRoLCBzeXMucGF0aF9ob29rcywgIgorCQkJICAgICAgInBhdGhfaW1wb3J0ZXJfY2FjaGUsIG9yIE51bGxJbXBvcnRlciBmYWlsZWQiCisJCQkgICAgICApOwogCX0KKwogCXppbXBpbXBvcnQgPSBQeUltcG9ydF9JbXBvcnRNb2R1bGUoInppcGltcG9ydCIpOwogCWlmICh6aW1waW1wb3J0ID09IE5VTEwpIHsKIAkJUHlFcnJfQ2xlYXIoKTsgLyogTm8gemlwIGltcG9ydCBtb2R1bGUgLS0gb2theSAqLwpAQCAtMjM5LDggKzI1MSwxMSBAQAogCWxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7CiAJaWYgKG1lID09IC0xKQogCQlyZXR1cm47IC8qIFRvbyBiYWQgKi8KLQlpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkKKwlpZiAoaW1wb3J0X2xvY2sgPT0gTlVMTCkgewogCQlpbXBvcnRfbG9jayA9IFB5VGhyZWFkX2FsbG9jYXRlX2xvY2soKTsKKwkJaWYgKGltcG9ydF9sb2NrID09IE5VTEwpCisJCQlyZXR1cm47ICAvKiBOb3RoaW5nIG11Y2ggd2UgY2FuIGRvLiAqLworCX0KIAlpZiAoaW1wb3J0X2xvY2tfdGhyZWFkID09IG1lKSB7CiAJCWltcG9ydF9sb2NrX2xldmVsKys7CiAJCXJldHVybjsKQEAgLTI1OSw3ICsyNzQsNyBAQAogdW5sb2NrX2ltcG9ydCh2b2lkKQogewogCWxvbmcgbWUgPSBQeVRocmVhZF9nZXRfdGhyZWFkX2lkZW50KCk7Ci0JaWYgKG1lID09IC0xKQorCWlmIChtZSA9PSAtMSB8fCBpbXBvcnRfbG9jayA9PSBOVUxMKQogCQlyZXR1cm4gMDsgLyogVG9vIGJhZCAqLwogCWlmIChpbXBvcnRfbG9ja190aHJlYWQgIT0gbWUpCiAJCXJldHVybiAtMTsKQEAgLTEwNTMsOSArMTA2OCwxOCBAQAogCQl9CiAJCVB5RXJyX0NsZWFyKCk7CiAJfQotCWlmIChpbXBvcnRlciA9PSBOVUxMKQotCQlpbXBvcnRlciA9IFB5X05vbmU7Ci0JZWxzZSBpZiAoaW1wb3J0ZXIgIT0gUHlfTm9uZSkgeworCWlmIChpbXBvcnRlciA9PSBOVUxMKSB7CisJCWltcG9ydGVyID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uT2JqQXJncygKKwkJCShQeU9iamVjdCAqKSZOdWxsSW1wb3J0ZXJUeXBlLCBwLCBOVUxMCisJCSk7CisJCWlmIChpbXBvcnRlciA9PSBOVUxMKSB7CisJCQlpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19JbXBvcnRFcnJvcikpIHsKKwkJCQlQeUVycl9DbGVhcigpOworCQkJCXJldHVybiBQeV9Ob25lOworCQkJfQorCQl9CisJfQorCWlmIChpbXBvcnRlciAhPSBOVUxMKSB7CiAJCWludCBlcnIgPSBQeURpY3RfU2V0SXRlbShwYXRoX2ltcG9ydGVyX2NhY2hlLCBwLCBpbXBvcnRlcik7CiAJCVB5X0RFQ1JFRihpbXBvcnRlcik7CiAJCWlmIChlcnIgIT0gMCkKQEAgLTEyMzgsNDIgKzEyNjIsMTcgQEAKIAogCQkJaW1wb3J0ZXIgPSBnZXRfcGF0aF9pbXBvcnRlcihwYXRoX2ltcG9ydGVyX2NhY2hlLAogCQkJCQkJICAgICBwYXRoX2hvb2tzLCB2KTsKLQkJCWlmIChpbXBvcnRlciA9PSBOVUxMKQotCQkJCXJldHVybiBOVUxMOwotCQkJLyogTm90ZTogaW1wb3J0ZXIgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KLQkJCWlmIChpbXBvcnRlciA9PSBQeV9GYWxzZSkgewotCQkJCS8qIENhY2hlZCBhcyBub3QgYmVpbmcgYSB2YWxpZCBkaXIuICovCisJCQlpZiAoaW1wb3J0ZXIgPT0gTlVMTCkgewogCQkJCVB5X1hERUNSRUYoY29weSk7Ci0JCQkJY29udGludWU7CisJCQkJcmV0dXJuIE5VTEw7CiAJCQl9Ci0JCQllbHNlIGlmIChpbXBvcnRlciA9PSBQeV9UcnVlKSB7Ci0JCQkJLyogQ2FjaGVkIGFzIGJlaW5nIGEgdmFsaWQgZGlyLCBzbyBqdXN0Ci0JCQkJICogY29udGludWUgYmVsb3cuICovCi0JCQl9Ci0JCQllbHNlIGlmIChpbXBvcnRlciA9PSBQeV9Ob25lKSB7Ci0JCQkJLyogTm8gaW1wb3J0ZXIgd2FzIGZvdW5kLCBzbyBpdCBoYXMgdG8gYmUgYSBmaWxlLgotCQkJCSAqIENoZWNrIGlmIHRoZSBkaXJlY3RvcnkgaXMgdmFsaWQuCi0JCQkJICogTm90ZSB0aGF0IHRoZSBlbXB0eSBzdHJpbmcgaXMgYSB2YWxpZCBwYXRoLCBidXQKLQkJCQkgKiBub3Qgc3RhdCdhYmxlLCBoZW5jZSB0aGUgY2hlY2sgZm9yIGxlbi4gKi8KLSNpZmRlZiBIQVZFX1NUQVQKLQkJCQlpZiAobGVuICYmIHN0YXQoYnVmLCAmc3RhdGJ1ZikgIT0gMCkgewotCQkJCQkvKiBEaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QuICovCi0JCQkJCVB5RGljdF9TZXRJdGVtKHBhdGhfaW1wb3J0ZXJfY2FjaGUsCi0JCQkJCSAgICAgICAgICAgICAgIHYsIFB5X0ZhbHNlKTsKLQkJCQkJUHlfWERFQ1JFRihjb3B5KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJUHlEaWN0X1NldEl0ZW0ocGF0aF9pbXBvcnRlcl9jYWNoZSwKLQkJCQkJICAgICAgICAgICAgICAgdiwgUHlfVHJ1ZSk7Ci0JCQkJfQotI2VuZGlmCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBBIHJlYWwgaW1wb3J0IGhvb2sgaW1wb3J0ZXIgd2FzIGZvdW5kLiAqLworCQkJLyogTm90ZTogaW1wb3J0ZXIgaXMgYSBib3Jyb3dlZCByZWZlcmVuY2UgKi8KKwkJCWlmIChpbXBvcnRlciAhPSBQeV9Ob25lKSB7CiAJCQkJUHlPYmplY3QgKmxvYWRlcjsKIAkJCQlsb2FkZXIgPSBQeU9iamVjdF9DYWxsTWV0aG9kKGltcG9ydGVyLAogCQkJCQkJCSAgICAgImZpbmRfbW9kdWxlIiwKIAkJCQkJCQkgICAgICJzIiwgZnVsbG5hbWUpOworCQkJCVB5X1hERUNSRUYoY29weSk7CiAJCQkJaWYgKGxvYWRlciA9PSBOVUxMKQogCQkJCQlyZXR1cm4gTlVMTDsgIC8qIGVycm9yICovCiAJCQkJaWYgKGxvYWRlciAhPSBQeV9Ob25lKSB7CkBAIC0xMjgyLDcgKzEyODEsNiBAQAogCQkJCQlyZXR1cm4gJmltcG9ydGhvb2tkZXNjcjsKIAkJCQl9CiAJCQkJUHlfREVDUkVGKGxvYWRlcik7Ci0JCQkJUHlfWERFQ1JFRihjb3B5KTsKIAkJCQljb250aW51ZTsKIAkJCX0KIAkJfQpAQCAtMTkwNCwxMSArMTkwMiwxMCBAQAogCWlmIChjbyA9PSBOVUxMKQogCQlyZXR1cm4gLTE7CiAJaWYgKCFQeUNvZGVfQ2hlY2soY28pKSB7Ci0JCVB5X0RFQ1JFRihjbyk7CiAJCVB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCiAJCQkgICAgICJmcm96ZW4gb2JqZWN0ICUuMjAwcyBpcyBub3QgYSBjb2RlIG9iamVjdCIsCiAJCQkgICAgIG5hbWUpOwotCQlyZXR1cm4gLTE7CisJCWdvdG8gZXJyX3JldHVybjsKIAl9CiAJaWYgKGlzcGFja2FnZSkgewogCQkvKiBTZXQgX19wYXRoX18gdG8gdGhlIHBhY2thZ2UgbmFtZSAqLwpAQCAtMTkxNiwyMiArMTkxMywyNSBAQAogCQlpbnQgZXJyOwogCQltID0gUHlJbXBvcnRfQWRkTW9kdWxlKG5hbWUpOwogCQlpZiAobSA9PSBOVUxMKQotCQkJcmV0dXJuIC0xOworCQkJZ290byBlcnJfcmV0dXJuOwogCQlkID0gUHlNb2R1bGVfR2V0RGljdChtKTsKIAkJcyA9IFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcobmFtZSk7CiAJCWlmIChzID09IE5VTEwpCi0JCQlyZXR1cm4gLTE7CisJCQlnb3RvIGVycl9yZXR1cm47CiAJCWVyciA9IFB5RGljdF9TZXRJdGVtU3RyaW5nKGQsICJfX3BhdGhfXyIsIHMpOwogCQlQeV9ERUNSRUYocyk7CiAJCWlmIChlcnIgIT0gMCkKLQkJCXJldHVybiBlcnI7CisJCQlnb3RvIGVycl9yZXR1cm47CiAJfQogCW0gPSBQeUltcG9ydF9FeGVjQ29kZU1vZHVsZUV4KG5hbWUsIGNvLCAiPGZyb3plbj4iKTsKLQlQeV9ERUNSRUYoY28pOwogCWlmIChtID09IE5VTEwpCi0JCXJldHVybiAtMTsKKwkJZ290byBlcnJfcmV0dXJuOworCVB5X0RFQ1JFRihjbyk7CiAJUHlfREVDUkVGKG0pOwogCXJldHVybiAxOworZXJyX3JldHVybjoKKwlQeV9ERUNSRUYoY28pOworCXJldHVybiAtMTsKIH0KIAogCkBAIC0yOTI2LDExICsyOTI2LDEyMCBAQAogCXJldHVybiBlcnI7CiB9CiAKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBQeU9iamVjdF9IRUFECit9IE51bGxJbXBvcnRlcjsKKworc3RhdGljIGludAorTnVsbEltcG9ydGVyX2luaXQoTnVsbEltcG9ydGVyICpzZWxmLCBQeU9iamVjdCAqYXJncywgUHlPYmplY3QgKmt3ZHMpCit7CisJY2hhciAqcGF0aDsKKworCWlmICghX1B5QXJnX05vS2V5d29yZHMoIk51bGxJbXBvcnRlcigpIiwga3dkcykpCisJCXJldHVybiAtMTsKKworCWlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiczpOdWxsSW1wb3J0ZXIiLAorCQkJICAgICAgJnBhdGgpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc3RybGVuKHBhdGgpID09IDApIHsKKwkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLCAiZW1wdHkgcGF0aG5hbWUiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisjaWZuZGVmIFJJU0NPUworCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQlpbnQgcnY7CisKKwkJcnYgPSBzdGF0KHBhdGgsICZzdGF0YnVmKTsKKwkJaWYgKHJ2ID09IDApIHsKKwkJCS8qIGl0IGV4aXN0cyAqLworCQkJaWYgKFNfSVNESVIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJCS8qIGl0J3MgYSBkaXJlY3RvcnkgKi8KKwkJCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW1wb3J0RXJyb3IsCisJCQkJCQkiZXhpc3RpbmcgZGlyZWN0b3J5Iik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisjZWxzZQorCQlpZiAob2JqZWN0X2V4aXN0cyhwYXRoKSkgeworCQkJLyogaXQgZXhpc3RzICovCisJCQlpZiAoaXNkaXIocGF0aCkpIHsKKwkJCQkvKiBpdCdzIGEgZGlyZWN0b3J5ICovCisJCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0ltcG9ydEVycm9yLAorCQkJCQkJImV4aXN0aW5nIGRpcmVjdG9yeSIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgUHlPYmplY3QgKgorTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlKE51bGxJbXBvcnRlciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpCit7CisJUHlfUkVUVVJOX05PTkU7Cit9CisKK3N0YXRpYyBQeU1ldGhvZERlZiBOdWxsSW1wb3J0ZXJfbWV0aG9kc1tdID0geworCXsiZmluZF9tb2R1bGUiLCAoUHlDRnVuY3Rpb24pTnVsbEltcG9ydGVyX2ZpbmRfbW9kdWxlLCBNRVRIX1ZBUkFSR1MsCisJICJBbHdheXMgcmV0dXJuIE5vbmUiCisJfSwKKwl7TlVMTH0gIC8qIFNlbnRpbmVsICovCit9OworCisKK3N0YXRpYyBQeVR5cGVPYmplY3QgTnVsbEltcG9ydGVyVHlwZSA9IHsKKwlQeU9iamVjdF9IRUFEX0lOSVQoTlVMTCkKKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKm9iX3NpemUqLworCSJpbXAuTnVsbEltcG9ydGVyIiwgICAgICAgIC8qdHBfbmFtZSovCisJc2l6ZW9mKE51bGxJbXBvcnRlciksICAgICAgLyp0cF9iYXNpY3NpemUqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfaXRlbXNpemUqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfZGVhbGxvYyovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9wcmludCovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9nZXRhdHRyKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHIqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfY29tcGFyZSovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9yZXByKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX251bWJlciovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19zZXF1ZW5jZSovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyp0cF9hc19tYXBwaW5nKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2hhc2ggKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2NhbGwqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qdHBfc3RyKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2dldGF0dHJvKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX3NldGF0dHJvKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKnRwX2FzX2J1ZmZlciovCisJUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgLyp0cF9mbGFncyovCisJIk51bGwgaW1wb3J0ZXIgb2JqZWN0IiwgICAgLyogdHBfZG9jICovCisJMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3RyYXZlcnNlICovCisJMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCisJMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3JpY2hjb21wYXJlICovCisJMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX3dlYWtsaXN0b2Zmc2V0ICovCisJMCwJICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KKwkwLAkgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlcm5leHQgKi8KKwlOdWxsSW1wb3J0ZXJfbWV0aG9kcywgICAgICAvKiB0cF9tZXRob2RzICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbWVtYmVycyAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2dldHNldCAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2Jhc2UgKi8KKwkwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0ICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3JfZ2V0ICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGVzY3Jfc2V0ICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZGljdG9mZnNldCAqLworCShpbml0cHJvYylOdWxsSW1wb3J0ZXJfaW5pdCwgICAgICAvKiB0cF9pbml0ICovCisJMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYWxsb2MgKi8KKwlQeVR5cGVfR2VuZXJpY05ldyAgICAgICAgICAvKiB0cF9uZXcgKi8KK307CisKKwogUHlNT0RJTklUX0ZVTkMKIGluaXRpbXAodm9pZCkKIHsKIAlQeU9iamVjdCAqbSwgKmQ7CiAKKwlpZiAoUHlUeXBlX1JlYWR5KCZOdWxsSW1wb3J0ZXJUeXBlKSA8IDApCisJCWdvdG8gZmFpbHVyZTsKKwogCW0gPSBQeV9Jbml0TW9kdWxlNCgiaW1wIiwgaW1wX21ldGhvZHMsIGRvY19pbXAsCiAJCQkgICBOVUxMLCBQWVRIT05fQVBJX1ZFUlNJT04pOwogCWlmIChtID09IE5VTEwpCkBAIC0yOTQ4LDYgKzMwNTcsOCBAQAogCWlmIChzZXRpbnQoZCwgIlBZX0NPREVSRVNPVVJDRSIsIFBZX0NPREVSRVNPVVJDRSkgPCAwKSBnb3RvIGZhaWx1cmU7CiAJaWYgKHNldGludChkLCAiSU1QX0hPT0siLCBJTVBfSE9PSykgPCAwKSBnb3RvIGZhaWx1cmU7CiAKKwlQeV9JTkNSRUYoJk51bGxJbXBvcnRlclR5cGUpOworCVB5TW9kdWxlX0FkZE9iamVjdChtLCAiTnVsbEltcG9ydGVyIiwgKFB5T2JqZWN0ICopJk51bGxJbXBvcnRlclR5cGUpOwogICBmYWlsdXJlOgogCTsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9tYWN0b29sYm94Z2x1ZS5jIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKaW5kZXggMGFhMmNmZC4uMjZhMTMwOCAxMDA2NDQKLS0tIGEvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKKysrIGIvUHl0aG9uL21hY3Rvb2xib3hnbHVlLmMKQEAgLTYwLDggKzYwLDkgQEAKIAkJCXN0cm5jcHkoYnVmLCBpbnB1dCwgc2l6ZW9mKGJ1ZikgLSAxKTsKIAkJCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsKIAkJfQorCQlQeV9ERUNSRUYocnYpOwogCX0KLQkKKwlQeV9YREVDUkVGKG0pOwogCXJldHVybiBidWY7CiB9CiAKZGlmZiAtLWdpdCBhL1B5dGhvbi9teXN0cnRvdWwuYyBiL1B5dGhvbi9teXN0cnRvdWwuYwppbmRleCAzODBiMzdkLi4wZGRhNGJlIDEwMDY0NAotLS0gYS9QeXRob24vbXlzdHJ0b3VsLmMKKysrIGIvUHl0aG9uL215c3RydG91bC5jCkBAIC0xNyw3ICsxNyw3IEBACiAKIAogI2luY2x1ZGUgPGN0eXBlLmg+Ci0jaWZuZGVmIERPTlRfSEFWRV9FUlJOT19ICisjaWZkZWYgSEFWRV9FUlJOT19ICiAjaW5jbHVkZSA8ZXJybm8uaD4KICNlbmRpZgogCkBAIC02OSwxMSArNjksMjIgQEAKICAqIGNhbGN1bGF0ZWQgYnkgW2ludChtYXRoLmZsb29yKG1hdGgubG9nKDIqKjMyLCBpKSkpIGZvciBpIGluIHJhbmdlKDIsIDM3KV0uCiAgKiBOb3RlIHRoYXQgdGhpcyBpcyBwZXNzaW1pc3RpYyBpZiBzaXplb2YobG9uZykgPiA0LgogICovCisjaWYgU0laRU9GX0xPTkcgPT0gNAogc3RhdGljIGludCBkaWdpdGxpbWl0W10gPSB7CiAJMCwgIDAsIDMyLCAyMCwgMTYsIDEzLCAxMiwgMTEsIDEwLCAxMCwgIC8qICAwIC0gIDkgKi8KIAk5LCAgOSwgIDgsICA4LCAgOCwgIDgsICA4LCAgNywgIDcsICA3LCAgLyogMTAgLSAxOSAqLwogCTcsICA3LCAgNywgIDcsICA2LCAgNiwgIDYsICA2LCAgNiwgIDYsICAvKiAyMCAtIDI5ICovCiAJNiwgIDYsICA2LCAgNiwgIDYsICA2LCAgNn07ICAgICAgICAgICAgIC8qIDMwIC0gMzYgKi8KKyNlbGlmIFNJWkVPRl9MT05HID09IDgKKy8qIFtpbnQobWF0aC5mbG9vcihtYXRoLmxvZygyKio2NCwgaSkpKSBmb3IgaSBpbiByYW5nZSgyLCAzNyldICovCitzdGF0aWMgaW50IGRpZ2l0bGltaXRbXSA9IHsKKwkgMCwgICAwLCA2NCwgNDAsIDMyLCAyNywgMjQsIDIyLCAyMSwgMjAsICAvKiAgMCAtICA5ICovCisJMTksICAxOCwgMTcsIDE3LCAxNiwgMTYsIDE2LCAxNSwgMTUsIDE1LCAgLyogMTAgLSAxOSAqLworCTE0LCAgMTQsIDE0LCAxNCwgMTMsIDEzLCAxMywgMTMsIDEzLCAxMywgIC8qIDIwIC0gMjkgKi8KKwkxMywgIDEyLCAxMiwgMTIsIDEyLCAxMiwgMTJ9OyAgICAgICAgICAgICAvKiAzMCAtIDM2ICovCisjZWxzZQorI2Vycm9yICJOZWVkIHRhYmxlIGZvciBTSVpFT0ZfTE9ORyIKKyNlbmRpZgogCiAvKgogKioJc3RydG91bApAQCAtMTg0LDEwICsxOTUsMTkgQEAKIAlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpLTE7CiB9CiAKKy8qIENoZWNraW5nIGZvciBvdmVyZmxvdyBpbiBQeU9TX3N0cnRvbCBpcyBhIFBJVEEgc2luY2UgQyBkb2Vzbid0IGRlZmluZQorICogYW55dGhpbmcgYWJvdXQgd2hhdCBoYXBwZW5zIHdoZW4gYSBzaWduZWQgaW50ZWdlciBvcGVyYXRpb24gb3ZlcmZsb3dzLAorICogYW5kIHNvbWUgY29tcGlsZXJzIHRoaW5rIHRoZXkncmUgZG9pbmcgeW91IGEgZmF2b3IgYnkgYmVpbmcgImNsZXZlciIKKyAqIHRoZW4uICBQeXRob24gYXNzdW1lcyBhIDIncy1jb21wbGVtZW50IHJlcHJlc2VudGF0aW9uLCBzbyB0aGF0IHRoZSBiaXQKKyAqIHBhdHRlcm4gZm9yIHRoZSBsYXJnZXN0IHBvc3RpdmUgc2lnbmVkIGxvbmcgaXMgTE9OR19NQVgsIGFuZCBmb3IKKyAqIHRoZSBzbWFsbGVzdCBuZWdhdGl2ZSBzaWduZWQgbG9uZyBpcyBMT05HX01BWCArIDEuCisgKi8KKwogbG9uZwogUHlPU19zdHJ0b2woY2hhciAqc3RyLCBjaGFyICoqcHRyLCBpbnQgYmFzZSkKIHsKIAlsb25nIHJlc3VsdDsKKwl1bnNpZ25lZCBsb25nIHVyZXN1bHQ7CiAJY2hhciBzaWduOwogCiAJd2hpbGUgKCpzdHIgJiYgaXNzcGFjZShQeV9DSEFSTUFTSygqc3RyKSkpCkBAIC0xOTcsMTcgKzIxNywyMCBAQAogCWlmIChzaWduID09ICcrJyB8fCBzaWduID09ICctJykKIAkJc3RyKys7CiAKLQlyZXN1bHQgPSAobG9uZykgUHlPU19zdHJ0b3VsKHN0ciwgcHRyLCBiYXNlKTsKKwl1cmVzdWx0ID0gUHlPU19zdHJ0b3VsKHN0ciwgcHRyLCBiYXNlKTsKIAotCS8qIFNpZ25hbCBvdmVyZmxvdyBpZiB0aGUgcmVzdWx0IGFwcGVhcnMgbmVnYXRpdmUsCi0JICAgZXhjZXB0IGZvciB0aGUgbGFyZ2VzdCBuZWdhdGl2ZSBpbnRlZ2VyICovCi0JaWYgKHJlc3VsdCA8IDAgJiYgIShzaWduID09ICctJyAmJiByZXN1bHQgPT0gLXJlc3VsdCkpIHsKLQkJZXJybm8gPSBFUkFOR0U7Ci0JCXJlc3VsdCA9IDB4N2ZmZmZmZmY7CisJaWYgKHVyZXN1bHQgPD0gKHVuc2lnbmVkIGxvbmcpTE9OR19NQVgpIHsKKwkJcmVzdWx0ID0gKGxvbmcpdXJlc3VsdDsKKwkJaWYgKHNpZ24gPT0gJy0nKQorCQkJcmVzdWx0ID0gLXJlc3VsdDsKIAl9Ci0KLQlpZiAoc2lnbiA9PSAnLScpCi0JCXJlc3VsdCA9IC1yZXN1bHQ7Ci0KKwllbHNlIGlmIChzaWduID09ICctJyAmJiB1cmVzdWx0ID09ICh1bnNpZ25lZCBsb25nKUxPTkdfTUFYICsgMSkgeworCQlhc3NlcnQoTE9OR19NSU4gPT0gLUxPTkdfTUFYLTEpOworCQlyZXN1bHQgPSBMT05HX01JTjsKKwl9CisJZWxzZSB7CisJCWVycm5vID0gRVJBTkdFOworCQlyZXN1bHQgPSBMT05HX01BWDsKKwl9CiAJcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL1B5dGhvbi9weWFyZW5hLmMgYi9QeXRob24vcHlhcmVuYS5jCmluZGV4IGYxMWE5MDUuLmY0Y2M0NzQgMTAwNjQ0Ci0tLSBhL1B5dGhvbi9weWFyZW5hLmMKKysrIGIvUHl0aG9uL3B5YXJlbmEuYwpAQCAtMTMyLDE5ICsxMzIsMTkgQEAKIHsKIAlQeUFyZW5hKiBhcmVuYSA9IChQeUFyZW5hICopbWFsbG9jKHNpemVvZihQeUFyZW5hKSk7CiAJaWYgKCFhcmVuYSkKLQkJcmV0dXJuIE5VTEw7CisJCXJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKIAogCWFyZW5hLT5hX2hlYWQgPSBibG9ja19uZXcoREVGQVVMVF9CTE9DS19TSVpFKTsKIAlhcmVuYS0+YV9jdXIgPSBhcmVuYS0+YV9oZWFkOwogICAgICAgICBpZiAoIWFyZW5hLT5hX2hlYWQpIHsKICAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgfQogICAgICAgICBhcmVuYS0+YV9vYmplY3RzID0gUHlMaXN0X05ldygwKTsKICAgICAgICAgaWYgKCFhcmVuYS0+YV9vYmplY3RzKSB7CiAgICAgICAgICAgICAgICAgYmxvY2tfZnJlZShhcmVuYS0+YV9oZWFkKTsKICAgICAgICAgICAgICAgICBmcmVlKCh2b2lkICopYXJlbmEpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAoUHlBcmVuYSopUHlFcnJfTm9NZW1vcnkoKTsKICAgICAgICAgfQogI2lmIGRlZmluZWQoUHlfREVCVUcpCiAgICAgICAgIGFyZW5hLT50b3RhbF9hbGxvY3MgPSAwOwpAQCAtMTkxLDcgKzE5MSw3IEBACiB7CiAJdm9pZCAqcCA9IGJsb2NrX2FsbG9jKGFyZW5hLT5hX2N1ciwgc2l6ZSk7CiAJaWYgKCFwKQotCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiAjaWYgZGVmaW5lZChQeV9ERUJVRykKICAgICAgICAgYXJlbmEtPnRvdGFsX2FsbG9jcysrOwogICAgICAgICBhcmVuYS0+dG90YWxfc2l6ZSArPSBzaXplOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RhdGUuYyBiL1B5dGhvbi9weXN0YXRlLmMKaW5kZXggYjhmNDYwZi4uM2ZhZTg1YiAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5c3RhdGUuYworKysgYi9QeXRob24vcHlzdGF0ZS5jCkBAIC02Myw2ICs2MywxMCBAQAogCiAJaWYgKGludGVycCAhPSBOVUxMKSB7CiAJCUhFQURfSU5JVCgpOworI2lmZGVmIFdJVEhfVEhSRUFECisJCWlmIChoZWFkX211dGV4ID09IE5VTEwpCisJCQlQeV9GYXRhbEVycm9yKCJDYW4ndCBpbml0aWFsaXplIHRocmVhZHMgZm9yIGludGVycHJldGVyIik7CisjZW5kaWYKIAkJaW50ZXJwLT5tb2R1bGVzID0gTlVMTDsKIAkJaW50ZXJwLT5zeXNkaWN0ID0gTlVMTDsKIAkJaW50ZXJwLT5idWlsdGlucyA9IE5VTEw7CkBAIC0zODcsNiArMzkxLDUzIEBACiAJcmV0dXJuIHRzdGF0ZS0+bmV4dDsKIH0KIAorLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHN5cy5fY3VycmVudF9mcmFtZXMoKS4gIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUKKyAgIGNhbGxlZCB3aXRoIHRoZSBHSUwgaGVsZCwgYXMgaXQgd2lsbCBiZSB3aGVuIGNhbGxlZCB2aWEKKyAgIHN5cy5fY3VycmVudF9mcmFtZXMoKS4gIEl0J3MgcG9zc2libGUgaXQgd291bGQgd29yayBmaW5lIGV2ZW4gd2l0aG91dAorICAgdGhlIEdJTCBoZWxkLCBidXQgaGF2ZW4ndCB0aG91Z2h0IGVub3VnaCBhYm91dCB0aGF0LgorKi8KK1B5T2JqZWN0ICoKK19QeVRocmVhZF9DdXJyZW50RnJhbWVzKHZvaWQpCit7CisJUHlPYmplY3QgKnJlc3VsdDsKKwlQeUludGVycHJldGVyU3RhdGUgKmk7CisKKwlyZXN1bHQgPSBQeURpY3RfTmV3KCk7CisJaWYgKHJlc3VsdCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGZvciBpIGluIGFsbCBpbnRlcnByZXRlcnM6CisJICogICAgIGZvciB0IGluIGFsbCBvZiBpJ3MgdGhyZWFkIHN0YXRlczoKKwkgKiAgICAgICAgICBpZiB0J3MgZnJhbWUgaXNuJ3QgTlVMTCwgbWFwIHQncyBpZCB0byBpdHMgZnJhbWUKKwkgKiBCZWNhdXNlIHRoZXNlIGxpc3RzIGNhbiBtdXR1dGUgZXZlbiB3aGVuIHRoZSBHSUwgaXMgaGVsZCwgd2UKKwkgKiBuZWVkIHRvIGdyYWIgaGVhZF9tdXRleCBmb3IgdGhlIGR1cmF0aW9uLgorCSAqLworCUhFQURfTE9DSygpOworCWZvciAoaSA9IGludGVycF9oZWFkOyBpICE9IE5VTEw7IGkgPSBpLT5uZXh0KSB7CisJCVB5VGhyZWFkU3RhdGUgKnQ7CisJCWZvciAodCA9IGktPnRzdGF0ZV9oZWFkOyB0ICE9IE5VTEw7IHQgPSB0LT5uZXh0KSB7CisJCQlQeU9iamVjdCAqaWQ7CisJCQlpbnQgc3RhdDsKKwkJCXN0cnVjdCBfZnJhbWUgKmZyYW1lID0gdC0+ZnJhbWU7CisJCQlpZiAoZnJhbWUgPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlkID0gUHlJbnRfRnJvbUxvbmcodC0+dGhyZWFkX2lkKTsKKwkJCWlmIChpZCA9PSBOVUxMKQorCQkJCWdvdG8gRmFpbDsKKwkJCXN0YXQgPSBQeURpY3RfU2V0SXRlbShyZXN1bHQsIGlkLCAoUHlPYmplY3QgKilmcmFtZSk7CisJCQlQeV9ERUNSRUYoaWQpOworCQkJaWYgKHN0YXQgPCAwKQorCQkJCWdvdG8gRmFpbDsKKwkJfQorCX0KKwlIRUFEX1VOTE9DSygpOworCXJldHVybiByZXN1bHQ7CisKKyBGYWlsOgorIAlIRUFEX1VOTE9DSygpOworIAlQeV9ERUNSRUYocmVzdWx0KTsKKyAJcmV0dXJuIE5VTEw7Cit9CiAKIC8qIFB5dGhvbiAiYXV0byB0aHJlYWQgc3RhdGUiIEFQSS4gKi8KICNpZmRlZiBXSVRIX1RIUkVBRApAQCAtNDQ0LDE1ICs0OTUsMTUgQEAKIAkvKiBJZiBhdXRvVExTa2V5IGlzIDAsIHRoaXMgbXVzdCBiZSB0aGUgdmVyeSBmaXJzdCB0aHJlYWRzdGF0ZSBjcmVhdGVkCiAJICAgaW4gUHlfSW5pdGlhbGl6ZSgpLiAgRG9uJ3QgZG8gYW55dGhpbmcgZm9yIG5vdyAod2UnbGwgYmUgYmFjayBoZXJlCiAJICAgd2hlbiBfUHlHSUxTdGF0ZV9Jbml0IGlzIGNhbGxlZCkuICovCi0JaWYgKCFhdXRvVExTa2V5KSAKKwlpZiAoIWF1dG9UTFNrZXkpCiAJCXJldHVybjsKLQkKKwogCS8qIFN0aWNrIHRoZSB0aHJlYWQgc3RhdGUgZm9yIHRoaXMgdGhyZWFkIGluIHRocmVhZCBsb2NhbCBzdG9yYWdlLgogCiAJICAgVGhlIG9ubHkgc2l0dWF0aW9uIHdoZXJlIHlvdSBjYW4gbGVnaXRpbWF0ZWx5IGhhdmUgbW9yZSB0aGFuIG9uZQogCSAgIHRocmVhZCBzdGF0ZSBmb3IgYW4gT1MgbGV2ZWwgdGhyZWFkIGlzIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCiAJICAgaW50ZXJwcmV0ZXJzLCB3aGVuOgotCSAgICAgICAKKwogCSAgICAgICBhKSBZb3Ugc2hvdWxkbid0IHJlYWxseSBiZSB1c2luZyB0aGUgUHlHSUxTdGF0ZV8gQVBJcyBhbnl3YXksCiAJICAgICAgICAgIGFuZDoKIApkaWZmIC0tZ2l0IGEvUHl0aG9uL3B5c3RydG9kLmMgYi9QeXRob24vcHlzdHJ0b2QuYwppbmRleCBlMWM4NGVhLi42YzE5YjQ1IDEwMDY0NAotLS0gYS9QeXRob24vcHlzdHJ0b2QuYworKysgYi9QeXRob24vcHlzdHJ0b2QuYwpAQCAtOTAsNiArOTAsMTMgQEAKIAkJCQlwKys7CiAJCQllbmQgPSBwOwogCQl9CisJCWVsc2UgaWYgKHN0cm5jbXAocCwgZGVjaW1hbF9wb2ludCwgZGVjaW1hbF9wb2ludF9sZW4pID09IDApCisJCXsKKwkJCS8qIFB5dGhvbiBidWcgIzE0MTc2OTkgKi8KKwkJCSplbmRwdHIgPSAoY2hhciopbnB0cjsKKwkJCWVycm5vID0gRUlOVkFMOworCQkJcmV0dXJuIHZhbDsKKwkJfQogCQkvKiBGb3IgdGhlIG90aGVyIGNhc2VzLCB3ZSBuZWVkIG5vdCBjb252ZXJ0IHRoZSBkZWNpbWFsIHBvaW50ICovCiAJfQogCmRpZmYgLS1naXQgYS9QeXRob24vcHl0aG9ucnVuLmMgYi9QeXRob24vcHl0aG9ucnVuLmMKaW5kZXggMmRiY2Y3NS4uNTU1YzM5ZCAxMDA2NDQKLS0tIGEvUHl0aG9uL3B5dGhvbnJ1bi5jCisrKyBiL1B5dGhvbi9weXRob25ydW4uYwpAQCAtMTcsNyArMTcsOSBAQAogI2luY2x1ZGUgImV2YWwuaCIKICNpbmNsdWRlICJtYXJzaGFsLmgiCiAKKyNpZmRlZiBIQVZFX1NJR05BTF9ICiAjaW5jbHVkZSA8c2lnbmFsLmg+CisjZW5kaWYKIAogI2lmZGVmIEhBVkVfTEFOR0lORk9fSAogI2luY2x1ZGUgPGxvY2FsZS5oPgpAQCAtNzM4LDYgKzc0MCwxMSBAQAogCQkJcHMyID0gUHlTdHJpbmdfQXNTdHJpbmcodyk7CiAJfQogCWFyZW5hID0gUHlBcmVuYV9OZXcoKTsKKwlpZiAoYXJlbmEgPT0gTlVMTCkgeworCQlQeV9YREVDUkVGKHYpOworCQlQeV9YREVDUkVGKHcpOworCQlyZXR1cm4gLTE7CisJfQogCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBmaWxlbmFtZSwKIAkJCQkgICBQeV9zaW5nbGVfaW5wdXQsIHBzMSwgcHMyLAogCQkJCSAgIGZsYWdzLCAmZXJyY29kZSwgYXJlbmEpOwpAQCAtMTA1Niw2ICsxMDYzLDE3IEBACiAJCQl9CiAJCQlQeUVycl9GZXRjaCgmZXhjZXB0aW9uMiwgJnYyLCAmdGIyKTsKIAkJCVB5RXJyX05vcm1hbGl6ZUV4Y2VwdGlvbigmZXhjZXB0aW9uMiwgJnYyLCAmdGIyKTsKKwkJCS8qIEl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgZm9yIGV4Y2VwdGlvbjIgb3IgdjIKKwkJCSAgIHRvIGJlIE5VTEwuIEhvd2V2ZXIgUHlFcnJfRGlzcGxheSgpIGNhbid0CisJCQkgICB0b2xlcmF0ZSBOVUxMcywgc28ganVzdCBiZSBzYWZlLiAqLworCQkJaWYgKGV4Y2VwdGlvbjIgPT0gTlVMTCkgeworCQkJCWV4Y2VwdGlvbjIgPSBQeV9Ob25lOworCQkJCVB5X0lOQ1JFRihleGNlcHRpb24yKTsKKwkJCX0KKwkJCWlmICh2MiA9PSBOVUxMKSB7CisJCQkJdjIgPSBQeV9Ob25lOworCQkJCVB5X0lOQ1JFRih2Mik7CisJCQl9CiAJCQlpZiAoUHlfRmx1c2hMaW5lKCkpCiAJCQkJUHlFcnJfQ2xlYXIoKTsKIAkJCWZmbHVzaChzdGRvdXQpOwpAQCAtMTA2Myw4ICsxMDgxLDggQEAKIAkJCVB5RXJyX0Rpc3BsYXkoZXhjZXB0aW9uMiwgdjIsIHRiMik7CiAJCQlQeVN5c19Xcml0ZVN0ZGVycigiXG5PcmlnaW5hbCBleGNlcHRpb24gd2FzOlxuIik7CiAJCQlQeUVycl9EaXNwbGF5KGV4Y2VwdGlvbiwgdiwgdGIpOwotCQkJUHlfWERFQ1JFRihleGNlcHRpb24yKTsKLQkJCVB5X1hERUNSRUYodjIpOworCQkJUHlfREVDUkVGKGV4Y2VwdGlvbjIpOworCQkJUHlfREVDUkVGKHYyKTsKIAkJCVB5X1hERUNSRUYodGIyKTsKIAkJfQogCQlQeV9YREVDUkVGKHJlc3VsdCk7CkBAIC0xMTg0LDkgKzEyMDIsMTIgQEAKIAkJICBQeU9iamVjdCAqbG9jYWxzLCBQeUNvbXBpbGVyRmxhZ3MgKmZsYWdzKQogewogCVB5T2JqZWN0ICpyZXQgPSBOVUxMOworCW1vZF90eSBtb2Q7CiAJUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCW1vZF90eSBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLAotCQkJCQkgICAgYXJlbmEpOworCWlmIChhcmVuYSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwkKKwltb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgIjxzdHJpbmc+Iiwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CiAJaWYgKG1vZCAhPSBOVUxMKQogCQlyZXQgPSBydW5fbW9kKG1vZCwgIjxzdHJpbmc+IiwgZ2xvYmFscywgbG9jYWxzLCBmbGFncywgYXJlbmEpOwogCVB5QXJlbmFfRnJlZShhcmVuYSk7CkBAIC0xMTk4LDkgKzEyMTksMTMgQEAKIAkJICBQeU9iamVjdCAqbG9jYWxzLCBpbnQgY2xvc2VpdCwgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKIAlQeU9iamVjdCAqcmV0OworCW1vZF90eSBtb2Q7CiAJUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCW1vZF90eSBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tRmlsZShmcCwgZmlsZW5hbWUsIHN0YXJ0LCAwLCAwLAotCQkJCQkgIGZsYWdzLCBOVUxMLCBhcmVuYSk7CisJaWYgKGFyZW5hID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCQorCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21GaWxlKGZwLCBmaWxlbmFtZSwgc3RhcnQsIDAsIDAsCisJCQkJICAgZmxhZ3MsIE5VTEwsIGFyZW5hKTsKIAlpZiAobW9kID09IE5VTEwpIHsKIAkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC0xMjYzLDggKzEyODgsMTIgQEAKIAkJICAgICAgUHlDb21waWxlckZsYWdzICpmbGFncykKIHsKIAlQeUNvZGVPYmplY3QgKmNvOworCW1vZF90eSBtb2Q7CiAJUHlBcmVuYSAqYXJlbmEgPSBQeUFyZW5hX05ldygpOwotCW1vZF90eSBtb2QgPSBQeVBhcnNlcl9BU1RGcm9tU3RyaW5nKHN0ciwgZmlsZW5hbWUsIHN0YXJ0LCBmbGFncywgYXJlbmEpOworCWlmIChhcmVuYSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIGZsYWdzLCBhcmVuYSk7CiAJaWYgKG1vZCA9PSBOVUxMKSB7CiAJCVB5QXJlbmFfRnJlZShhcmVuYSk7CiAJCXJldHVybiBOVUxMOwpAQCAtMTI4Myw4ICsxMzEyLDEyIEBACiBQeV9TeW10YWJsZVN0cmluZyhjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgc3RhcnQpCiB7CiAJc3RydWN0IHN5bXRhYmxlICpzdDsKKwltb2RfdHkgbW9kOwogCVB5QXJlbmEgKmFyZW5hID0gUHlBcmVuYV9OZXcoKTsKLQltb2RfdHkgbW9kID0gUHlQYXJzZXJfQVNURnJvbVN0cmluZyhzdHIsIGZpbGVuYW1lLCBzdGFydCwgTlVMTCwgYXJlbmEpOworCWlmIChhcmVuYSA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW1vZCA9IFB5UGFyc2VyX0FTVEZyb21TdHJpbmcoc3RyLCBmaWxlbmFtZSwgc3RhcnQsIE5VTEwsIGFyZW5hKTsKIAlpZiAobW9kID09IE5VTEwpIHsKIAkJUHlBcmVuYV9GcmVlKGFyZW5hKTsKIAkJcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9QeXRob24vc3RydG9kLmMgYi9QeXRob24vc3RydG9kLmMKaW5kZXggNzkxMWE5NC4uNWMwODRhNCAxMDA2NDQKLS0tIGEvUHl0aG9uL3N0cnRvZC5jCisrKyBiL1B5dGhvbi9zdHJ0b2QuYwpAQCAtNTQsNyArNTQsNyBAQAogCiBleHRlcm4JZG91YmxlCWF0b2YoY29uc3QgY2hhciAqKTsJCS8qIE9ubHkgY2FsbGVkIHdoZW4gcmVzdWx0IGtub3duIHRvIGJlIG9rICovCiAKLSNpZm5kZWYgRE9OVF9IQVZFX0VSUk5PX0gKKyNpZmRlZiBIQVZFX0VSUk5PX0gKICNpbmNsdWRlIDxlcnJuby5oPgogI2VuZGlmCiBleHRlcm4JaW50CWVycm5vOwpkaWZmIC0tZ2l0IGEvUHl0aG9uL3N5bXRhYmxlLmMgYi9QeXRob24vc3ltdGFibGUuYwppbmRleCAxZGMyYTJlLi40MzlhMjQzIDEwMDY0NAotLS0gYS9QeXRob24vc3ltdGFibGUuYworKysgYi9QeXRob24vc3ltdGFibGUuYwpAQCAtMjIxLDggKzIyMSwxMiBAQAogCQlyZXR1cm4gc3Q7CiAJc3QtPnN0X2ZpbGVuYW1lID0gZmlsZW5hbWU7CiAJc3QtPnN0X2Z1dHVyZSA9IGZ1dHVyZTsKLQlzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgR0VUX0lERU5USUZJRVIodG9wKSwgTW9kdWxlQmxvY2ssIAotCQkJICAgICAodm9pZCAqKW1vZCwgMCk7CisJaWYgKCFzeW10YWJsZV9lbnRlcl9ibG9jayhzdCwgR0VUX0lERU5USUZJRVIodG9wKSwgTW9kdWxlQmxvY2ssIAorCQkJICAgICAodm9pZCAqKW1vZCwgMCkpIHsKKwkJUHlTeW10YWJsZV9GcmVlKHN0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCiAJc3QtPnN0X3RvcCA9IHN0LT5zdF9jdXI7CiAJc3QtPnN0X2N1ci0+c3RlX3Vub3B0aW1pemVkID0gT1BUX1RPUExFVkVMOwogCS8qIEFueSBvdGhlciB0b3AtbGV2ZWwgaW5pdGlhbGl6YXRpb24/ICovCkBAIC01MjUsNiArNTI5LDggQEAKIAkJaSA9IFB5SW50X0FTX0xPTkcodyk7CiAJCWZsYWdzIHw9IChpIDw8IFNDT1BFX09GRik7CiAJCXUgPSBQeUludF9Gcm9tTG9uZyhmbGFncyk7CisJCWlmICghdSkKKwkJCXJldHVybiAwOwogCQlpZiAoUHlEaWN0X1NldEl0ZW0oc3ltYm9scywgbmFtZSwgdSkgPCAwKSB7CiAJCQlQeV9ERUNSRUYodSk7CiAJCQlyZXR1cm4gMDsKQEAgLTcyMywxMSArNzI5LDEzIEBACiB7CiAJUHlfc3NpemVfdCBlbmQ7CiAKLQlQeV9ERUNSRUYoc3QtPnN0X2N1cik7CisJUHlfQ0xFQVIoc3QtPnN0X2N1cik7CiAJZW5kID0gUHlMaXN0X0dFVF9TSVpFKHN0LT5zdF9zdGFjaykgLSAxOwogCWlmIChlbmQgPj0gMCkgewogCQlzdC0+c3RfY3VyID0gKFB5U1RFbnRyeU9iamVjdCAqKVB5TGlzdF9HRVRfSVRFTShzdC0+c3Rfc3RhY2ssIAogCQkJCQkJCQllbmQpOworCQlpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQorCQkJcmV0dXJuIDA7CiAJCVB5X0lOQ1JFRihzdC0+c3RfY3VyKTsKIAkJaWYgKFB5U2VxdWVuY2VfRGVsSXRlbShzdC0+c3Rfc3RhY2ssIGVuZCkgPCAwKQogCQkJcmV0dXJuIDA7CkBAIC03NDksNiArNzU3LDggQEAKIAkJUHlfREVDUkVGKHN0LT5zdF9jdXIpOwogCX0KIAlzdC0+c3RfY3VyID0gUHlTVEVudHJ5X05ldyhzdCwgbmFtZSwgYmxvY2ssIGFzdCwgbGluZW5vKTsKKwlpZiAoc3QtPnN0X2N1ciA9PSBOVUxMKQorCQlyZXR1cm4gMDsKIAlpZiAobmFtZSA9PSBHRVRfSURFTlRJRklFUih0b3ApKQogCQlzdC0+c3RfZ2xvYmFsID0gc3QtPnN0X2N1ci0+c3RlX3N5bWJvbHM7CiAJaWYgKHByZXYpIHsKZGlmZiAtLWdpdCBhL1B5dGhvbi9zeXNtb2R1bGUuYyBiL1B5dGhvbi9zeXNtb2R1bGUuYwppbmRleCBmZTQ3ZmQxLi5hMmRmNjY5IDEwMDY0NAotLS0gYS9QeXRob24vc3lzbW9kdWxlLmMKKysrIGIvUHl0aG9uL3N5c21vZHVsZS5jCkBAIC02NTYsNiArNjU2LDIxIEBACiAJcmV0dXJuIChQeU9iamVjdCopZjsKIH0KIAorUHlEb2NfU1RSVkFSKGN1cnJlbnRfZnJhbWVzX2RvYywKKyJfY3VycmVudF9mcmFtZXMoKSAtPiBkaWN0aW9uYXJ5XG5cCitcblwKK1JldHVybiBhIGRpY3Rpb25hcnkgbWFwcGluZyBlYWNoIGN1cnJlbnQgdGhyZWFkIFQncyB0aHJlYWQgaWQgdG8gVCdzXG5cCitjdXJyZW50IHN0YWNrIGZyYW1lLlxuXAorXG5cCitUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIGZvciBzcGVjaWFsaXplZCBwdXJwb3NlcyBvbmx5LiIKKyk7CisKK3N0YXRpYyBQeU9iamVjdCAqCitzeXNfY3VycmVudF9mcmFtZXMoUHlPYmplY3QgKnNlbGYsIFB5T2JqZWN0ICpub2FyZ3MpCit7CisJcmV0dXJuIF9QeVRocmVhZF9DdXJyZW50RnJhbWVzKCk7Cit9CisKIFB5RG9jX1NUUlZBUihjYWxsX3RyYWNpbmdfZG9jLAogImNhbGxfdHJhY2luZyhmdW5jLCBhcmdzKSAtPiBvYmplY3RcblwKIFxuXApAQCAtNzE4LDYgKzczMyw4IEBACiAJLyogTWlnaHQgYXMgd2VsbCBrZWVwIHRoaXMgaW4gYWxwaGFiZXRpYyBvcmRlciAqLwogCXsiY2FsbHN0YXRzIiwgKFB5Q0Z1bmN0aW9uKVB5RXZhbF9HZXRDYWxsU3RhdHMsIE1FVEhfTk9BUkdTLAogCSBjYWxsc3RhdHNfZG9jfSwKKwl7Il9jdXJyZW50X2ZyYW1lcyIsIHN5c19jdXJyZW50X2ZyYW1lcywgTUVUSF9OT0FSR1MsCisJIGN1cnJlbnRfZnJhbWVzX2RvY30sCiAJeyJkaXNwbGF5aG9vayIsCXN5c19kaXNwbGF5aG9vaywgTUVUSF9PLCBkaXNwbGF5aG9va19kb2N9LAogCXsiZXhjX2luZm8iLAlzeXNfZXhjX2luZm8sIE1FVEhfTk9BUkdTLCBleGNfaW5mb19kb2N9LAogCXsiZXhjX2NsZWFyIiwJc3lzX2V4Y19jbGVhciwgTUVUSF9OT0FSR1MsIGV4Y19jbGVhcl9kb2N9LApAQCAtMTExNiw0MSArMTEzMywzOCBAQAogI2VsaWYgUFlfUkVMRUFTRV9MRVZFTCA9PSBQWV9SRUxFQVNFX0xFVkVMX0ZJTkFMCiAJcyA9ICJmaW5hbCI7CiAjZW5kaWYKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAidmVyc2lvbl9pbmZvIiwKLQkJCSAgICAgdiA9IFB5X0J1aWxkVmFsdWUoImlpaXNpIiwgUFlfTUFKT1JfVkVSU0lPTiwKKworI2RlZmluZSBTRVRfU1lTX0ZST01fU1RSSU5HKGtleSwgdmFsdWUpCQkJXAorCXYgPSB2YWx1ZTsJCQkJCVwKKwlpZiAodiAhPSBOVUxMKQkJCQkJXAorCQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCBrZXksIHYpOwlcCisJUHlfWERFQ1JFRih2KQorCisJU0VUX1NZU19GUk9NX1NUUklORygidmVyc2lvbl9pbmZvIiwKKwkJCSAgICBQeV9CdWlsZFZhbHVlKCJpaWlzaSIsIFBZX01BSk9SX1ZFUlNJT04sCiAJCQkJCSAgICAgICBQWV9NSU5PUl9WRVJTSU9OLAogCQkJCQkgICAgICAgUFlfTUlDUk9fVkVSU0lPTiwgcywKIAkJCQkJICAgICAgIFBZX1JFTEVBU0VfU0VSSUFMKSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiYXBpX3ZlcnNpb24iLAotCQkJICAgICB2ID0gUHlJbnRfRnJvbUxvbmcoUFlUSE9OX0FQSV9WRVJTSU9OKSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiY29weXJpZ2h0IiwKLQkJCSAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0Q29weXJpZ2h0KCkpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJwbGF0Zm9ybSIsCi0JCQkgICAgIHYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldFBsYXRmb3JtKCkpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJleGVjdXRhYmxlIiwKLQkJCSAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkpKTsKLQlQeV9YREVDUkVGKHYpOwotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJwcmVmaXgiLAotCQkJICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRQcmVmaXgoKSkpOwotCVB5X1hERUNSRUYodik7Ci0JUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgImV4ZWNfcHJlZml4IiwKLQkJICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0RXhlY1ByZWZpeCgpKSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAibWF4aW50IiwKLQkJCSAgICAgdiA9IFB5SW50X0Zyb21Mb25nKFB5SW50X0dldE1heCgpKSk7Ci0JUHlfWERFQ1JFRih2KTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJhcGlfdmVyc2lvbiIsCisJCQkgICAgUHlJbnRfRnJvbUxvbmcoUFlUSE9OX0FQSV9WRVJTSU9OKSk7CisJU0VUX1NZU19GUk9NX1NUUklORygiY29weXJpZ2h0IiwKKwkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKFB5X0dldENvcHlyaWdodCgpKSk7CisJU0VUX1NZU19GUk9NX1NUUklORygicGxhdGZvcm0iLAorCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UGxhdGZvcm0oKSkpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoImV4ZWN1dGFibGUiLAorCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJvZ3JhbUZ1bGxQYXRoKCkpKTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJwcmVmaXgiLAorCQkJICAgIFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlfR2V0UHJlZml4KCkpKTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJleGVjX3ByZWZpeCIsCisJCSAgIAkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeV9HZXRFeGVjUHJlZml4KCkpKTsKKwlTRVRfU1lTX0ZST01fU1RSSU5HKCJtYXhpbnQiLAorCQkJICAgIFB5SW50X0Zyb21Mb25nKFB5SW50X0dldE1heCgpKSk7CiAjaWZkZWYgUHlfVVNJTkdfVU5JQ09ERQotCVB5RGljdF9TZXRJdGVtU3RyaW5nKHN5c2RpY3QsICJtYXh1bmljb2RlIiwKLQkJCSAgICAgdiA9IFB5SW50X0Zyb21Mb25nKFB5VW5pY29kZV9HZXRNYXgoKSkpOwotCVB5X1hERUNSRUYodik7CisJU0VUX1NZU19GUk9NX1NUUklORygibWF4dW5pY29kZSIsCisJCQkgICAgUHlJbnRfRnJvbUxvbmcoUHlVbmljb2RlX0dldE1heCgpKSk7CiAjZW5kaWYKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiYnVpbHRpbl9tb2R1bGVfbmFtZXMiLAotCQkgICB2ID0gbGlzdF9idWlsdGluX21vZHVsZV9uYW1lcygpKTsKLQlQeV9YREVDUkVGKHYpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoImJ1aWx0aW5fbW9kdWxlX25hbWVzIiwKKwkJCSAgICBsaXN0X2J1aWx0aW5fbW9kdWxlX25hbWVzKCkpOwogCXsKIAkJLyogQXNzdW1lcyB0aGF0IGxvbmdzIGFyZSBhdCBsZWFzdCAyIGJ5dGVzIGxvbmcuCiAJCSAgIFNob3VsZCBiZSBzYWZlISAqLwpAQCAtMTE2MiwxOCArMTE3NiwxNiBAQAogCQkJdmFsdWUgPSAiYmlnIjsKIAkJZWxzZQogCQkJdmFsdWUgPSAibGl0dGxlIjsKLQkJUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3lzZGljdCwgImJ5dGVvcmRlciIsCi0JCQkJICAgICB2ID0gUHlTdHJpbmdfRnJvbVN0cmluZyh2YWx1ZSkpOwotCQlQeV9YREVDUkVGKHYpOworCQlTRVRfU1lTX0ZST01fU1RSSU5HKCJieXRlb3JkZXIiLAorCQkJCSAgICBQeVN0cmluZ19Gcm9tU3RyaW5nKHZhbHVlKSk7CiAJfQogI2lmZGVmIE1TX0NPUkVETEwKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAiZGxsaGFuZGxlIiwKLQkJCSAgICAgdiA9IFB5TG9uZ19Gcm9tVm9pZFB0cihQeVdpbl9ETExoTW9kdWxlKSk7Ci0JUHlfWERFQ1JFRih2KTsKLQlQeURpY3RfU2V0SXRlbVN0cmluZyhzeXNkaWN0LCAid2ludmVyIiwKLQkJCSAgICAgdiA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoUHlXaW5fRExMVmVyc2lvblN0cmluZykpOwotCVB5X1hERUNSRUYodik7CisJU0VUX1NZU19GUk9NX1NUUklORygiZGxsaGFuZGxlIiwKKwkJCSAgICBQeUxvbmdfRnJvbVZvaWRQdHIoUHlXaW5fRExMaE1vZHVsZSkpOworCVNFVF9TWVNfRlJPTV9TVFJJTkcoIndpbnZlciIsCisJCQkgICAgUHlTdHJpbmdfRnJvbVN0cmluZyhQeVdpbl9ETExWZXJzaW9uU3RyaW5nKSk7CiAjZW5kaWYKKyN1bmRlZiBTRVRfU1lTX0ZST01fU1RSSU5HCiAJaWYgKHdhcm5vcHRpb25zID09IE5VTEwpIHsKIAkJd2Fybm9wdGlvbnMgPSBQeUxpc3RfTmV3KDApOwogCX0KZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWQuYyBiL1B5dGhvbi90aHJlYWQuYwppbmRleCBjOTM1NmRjLi4zYTJjN2FmIDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkLmMKKysrIGIvUHl0aG9uL3RocmVhZC5jCkBAIC05NSw2ICs5NSwxMSBAQAogCVB5VGhyZWFkX19pbml0X3RocmVhZCgpOwogfQogCisvKiBTdXBwb3J0IGZvciBydW50aW1lIHRocmVhZCBzdGFjayBzaXplIHR1bmluZy4KKyAgIEEgdmFsdWUgb2YgMCBtZWFucyB1c2luZyB0aGUgcGxhdGZvcm0ncyBkZWZhdWx0IHN0YWNrIHNpemUKKyAgIG9yIHRoZSBzaXplIHNwZWNpZmllZCBieSB0aGUgVEhSRUFEX1NUQUNLX1NJWkUgbWFjcm8uICovCitzdGF0aWMgc2l6ZV90IF9weXRocmVhZF9zdGFja3NpemUgPSAwOworCiAjaWZkZWYgU0dJX1RIUkVBRFMKICNpbmNsdWRlICJ0aHJlYWRfc2dpLmgiCiAjZW5kaWYKQEAgLTE1MCw2ICsxNTUsMjggQEAKICNlbmRpZgogKi8KIAorLyogcmV0dXJuIHRoZSBjdXJyZW50IHRocmVhZCBzdGFjayBzaXplICovCitzaXplX3QKK1B5VGhyZWFkX2dldF9zdGFja3NpemUodm9pZCkKK3sKKwlyZXR1cm4gX3B5dGhyZWFkX3N0YWNrc2l6ZTsKK30KKworLyogT25seSBwbGF0Zm9ybXMgZGVmaW5pbmcgYSBUSFJFQURfU0VUX1NUQUNLU0laRSgpIG1hY3JvCisgICBpbiB0aHJlYWRfPHBsYXRmb3JtPi5oIHN1cHBvcnQgY2hhbmdpbmcgdGhlIHN0YWNrIHNpemUuCisgICBSZXR1cm4gMCBpZiBzdGFjayBzaXplIGlzIHZhbGlkLAorICAgICAgICAgIC0xIGlmIHN0YWNrIHNpemUgdmFsdWUgaXMgaW52YWxpZCwKKyAgICAgICAgICAtMiBpZiBzZXR0aW5nIHN0YWNrIHNpemUgaXMgbm90IHN1cHBvcnRlZC4gKi8KK2ludAorUHlUaHJlYWRfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyNpZiBkZWZpbmVkKFRIUkVBRF9TRVRfU1RBQ0tTSVpFKQorCXJldHVybiBUSFJFQURfU0VUX1NUQUNLU0laRShzaXplKTsKKyNlbHNlCisJcmV0dXJuIC0yOworI2VuZGlmCit9CisKICNpZm5kZWYgUHlfSEFWRV9OQVRJVkVfVExTCiAvKiBJZiB0aGUgcGxhdGZvcm0gaGFzIG5vdCBzdXBwbGllZCBhIHBsYXRmb3JtIHNwZWNpZmljCiAgICBUTFMgaW1wbGVtZW50YXRpb24sIHByb3ZpZGUgb3VyIG93bi4KQEAgLTI0MCw2ICsyNjcsOCBAQAogCXN0cnVjdCBrZXkgKnA7CiAJbG9uZyBpZCA9IFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKTsKIAorCWlmICgha2V5bXV0ZXgpCisJCXJldHVybiBOVUxMOwogCVB5VGhyZWFkX2FjcXVpcmVfbG9jayhrZXltdXRleCwgMSk7CiAJZm9yIChwID0ga2V5aGVhZDsgcCAhPSBOVUxMOyBwID0gcC0+bmV4dCkgewogCQlpZiAocC0+aWQgPT0gaWQgJiYgcC0+a2V5ID09IGtleSkKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfbnQuaCBiL1B5dGhvbi90aHJlYWRfbnQuaAppbmRleCAwYjdlODRlLi42N2Y1ZWQ1IDEwMDY0NAotLS0gYS9QeXRob24vdGhyZWFkX250LmgKKysrIGIvUHl0aG9uL3RocmVhZF9udC5oCkBAIC01LDcgKzUsOSBAQAogCiAjaW5jbHVkZSA8d2luZG93cy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmZGVmIEhBVkVfUFJPQ0VTU19ICiAjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0IE5STVVURVggewogCUxPTkcgICBvd25lZCA7CkBAIC0xOTQsNyArMTk2LDcgQEAKIAlpZiAob2JqLmRvbmUgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwogCi0JcnYgPSBfYmVnaW50aHJlYWQoYm9vdHN0cmFwLCAwLCAmb2JqKTsgLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLworCXJ2ID0gX2JlZ2ludGhyZWFkKGJvb3RzdHJhcCwgX3B5dGhyZWFkX3N0YWNrc2l6ZSwgJm9iaik7CiAJaWYgKHJ2ID09IChQeV91aW50cHRyX3QpLTEpIHsKIAkJLyogSSd2ZSBzZWVuIGVycm5vID09IEVBR0FJTiBoZXJlLCB3aGljaCBtZWFucyAidGhlcmUgYXJlCiAJCSAqIHRvbyBtYW55IHRocmVhZHMiLgpAQCAtMzMzLDMgKzMzNSwzMCBAQAogCWlmICghKGFMb2NrICYmIExlYXZlTm9uUmVjdXJzaXZlTXV0ZXgoKFBOUk1VVEVYKSBhTG9jaykpKQogCQlkcHJpbnRmKCgiJWxkOiBDb3VsZCBub3QgUHlUaHJlYWRfcmVsZWFzZV9sb2NrKCVwKSBlcnJvcjogJWxcbiIsIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQoKSwgYUxvY2ssIEdldExhc3RFcnJvcigpKSk7CiB9CisKKy8qIG1pbmltdW0vbWF4aW11bSB0aHJlYWQgc3RhY2sgc2l6ZXMgc3VwcG9ydGVkICovCisjZGVmaW5lIFRIUkVBRF9NSU5fU1RBQ0tTSVpFCTB4ODAwMAkJLyogMzJrQiAqLworI2RlZmluZSBUSFJFQURfTUFYX1NUQUNLU0laRQkweDEwMDAwMDAwCS8qIDI1Nk1CICovCisKKy8qIHNldCB0aGUgdGhyZWFkIHN0YWNrIHNpemUuCisgKiBSZXR1cm4gMCBpZiBzaXplIGlzIHZhbGlkLCAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBpbnQKK19weXRocmVhZF9udF9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQoreworCS8qIHNldCB0byBkZWZhdWx0ICovCisJaWYgKHNpemUgPT0gMCkgeworCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdmFsaWQgcmFuZ2U/ICovCisJaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7CisJCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX250X3NldF9zdGFja3NpemUoeCkKZGlmZiAtLWdpdCBhL1B5dGhvbi90aHJlYWRfb3MyLmggYi9QeXRob24vdGhyZWFkX29zMi5oCmluZGV4IDg2ZTkxYzEuLjEyZWVlZDUgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfb3MyLmgKKysrIGIvUHl0aG9uL3RocmVhZF9vczIuaApAQCAtMTQsMTAgKzE0LDEzIEBACiBsb25nIFB5VGhyZWFkX2dldF90aHJlYWRfaWRlbnQodm9pZCk7CiAjZW5kaWYKIAorLyogZGVmYXVsdCB0aHJlYWQgc3RhY2sgc2l6ZSBvZiA2NGtCICovCiAjaWYgIWRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpCiAjZGVmaW5lCVRIUkVBRF9TVEFDS19TSVpFCTB4MTAwMDAKICNlbmRpZgogCisjZGVmaW5lIE9TMl9TVEFDS1NJWkUoeCkJKHggPyB4IDogVEhSRUFEX1NUQUNLX1NJWkUpCisKIC8qCiAgKiBJbml0aWFsaXphdGlvbiBvZiB0aGUgQyBwYWNrYWdlLCBzaG91bGQgbm90IGJlIG5lZWRlZC4KICAqLwpAQCAtMzIsMTggKzM1LDE4IEBACiBsb25nCiBQeVRocmVhZF9zdGFydF9uZXdfdGhyZWFkKHZvaWQgKCpmdW5jKSh2b2lkICopLCB2b2lkICphcmcpCiB7Ci0JaW50IGFUaHJlYWQ7Ci0JaW50IHN1Y2Nlc3MgPSAwOworCWludCB0aHJlYWRfaWQ7CiAKLQlhVGhyZWFkID0gX2JlZ2ludGhyZWFkKGZ1bmMsIE5VTEwsIFRIUkVBRF9TVEFDS19TSVpFLCBhcmcpOworCXRocmVhZF9pZCA9IF9iZWdpbnRocmVhZChmdW5jLAorCQkJCU5VTEwsCisJCQkJT1MyX1NUQUNLU0laRShfcHl0aHJlYWRfc3RhY2tzaXplKSwKKwkJCQlhcmcpOwogCi0JaWYgKGFUaHJlYWQgPT0gLTEpIHsKLQkJc3VjY2VzcyA9IC0xOwotCQlmcHJpbnRmKHN0ZGVyciwgImFUaHJlYWQgZmFpbGVkID09ICVkIiwgYVRocmVhZCk7CisJaWYgKHRocmVhZF9pZCA9PSAtMSkgewogCQlkcHJpbnRmKCgiX2JlZ2ludGhyZWFkIGZhaWxlZC4gcmV0dXJuICVsZFxuIiwgZXJybm8pKTsKIAl9CiAKLQlyZXR1cm4gc3VjY2VzczsKKwlyZXR1cm4gdGhyZWFkX2lkOwogfQogCiBsb25nCkBAIC0yNzUsMyArMjc4LDMwIEBACiAJRG9zRXhpdENyaXRTZWMoKTsKICNlbmRpZgogfQorCisvKiBtaW5pbXVtL21heGltdW0gdGhyZWFkIHN0YWNrIHNpemVzIHN1cHBvcnRlZCAqLworI2RlZmluZSBUSFJFQURfTUlOX1NUQUNLU0laRQkweDgwMDAJCS8qIDMya0IgKi8KKyNkZWZpbmUgVEhSRUFEX01BWF9TVEFDS1NJWkUJMHgyMDAwMDAwCS8qIDMyTUIgKi8KKworLyogc2V0IHRoZSB0aHJlYWQgc3RhY2sgc2l6ZS4KKyAqIFJldHVybiAwIGlmIHNpemUgaXMgdmFsaWQsIC0xIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGludAorX3B5dGhyZWFkX29zMl9zZXRfc3RhY2tzaXplKHNpemVfdCBzaXplKQoreworCS8qIHNldCB0byBkZWZhdWx0ICovCisJaWYgKHNpemUgPT0gMCkgeworCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogdmFsaWQgcmFuZ2U/ICovCisJaWYgKHNpemUgPj0gVEhSRUFEX01JTl9TVEFDS1NJWkUgJiYgc2l6ZSA8IFRIUkVBRF9NQVhfU1RBQ0tTSVpFKSB7CisJCV9weXRocmVhZF9zdGFja3NpemUgPSBzaXplOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKyNkZWZpbmUgVEhSRUFEX1NFVF9TVEFDS1NJWkUoeCkJX3B5dGhyZWFkX29zMl9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9QeXRob24vdGhyZWFkX3B0aHJlYWQuaCBiL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oCmluZGV4IGMyOWE2MWMuLjYwZDJmYjIgMTAwNjQ0Ci0tLSBhL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oCisrKyBiL1B5dGhvbi90aHJlYWRfcHRocmVhZC5oCkBAIC0xMiw2ICsxMiwyMCBAQAogI2VuZGlmCiAjaW5jbHVkZSA8c2lnbmFsLmg+CiAKKy8qIFRoZSBQT1NJWCBzcGVjIHJlcXVpcmVzIHRoYXQgdXNlIG9mIHB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUKKyAgIGJlIGNvbmRpdGlvbmFsIG9uIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgYmVpbmcgZGVmaW5lZC4gKi8KKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisjaWZuZGVmIFRIUkVBRF9TVEFDS19TSVpFCisjZGVmaW5lCVRIUkVBRF9TVEFDS19TSVpFCTAJLyogdXNlIGRlZmF1bHQgc3RhY2sgc2l6ZSAqLworI2VuZGlmCisvKiBmb3Igc2FmZXR5LCBlbnN1cmUgYSB2aWFibGUgbWluaW11bSBzdGFja3NpemUgKi8KKyNkZWZpbmUJVEhSRUFEX1NUQUNLX01JTgkweDgwMDAJLyogMzJrQiAqLworI2Vsc2UgIC8qICFfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisjaWZkZWYgVEhSRUFEX1NUQUNLX1NJWkUKKyNlcnJvciAiVEhSRUFEX1NUQUNLX1NJWkUgZGVmaW5lZCBidXQgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRSB1bmRlZmluZWQiCisjZW5kaWYKKyNlbmRpZgorCiAvKiBUaGUgUE9TSVggc3BlYyBzYXlzIHRoYXQgaW1wbGVtZW50YXRpb25zIHN1cHBvcnRpbmcgdGhlIHNlbV8qCiAgICBmYW1pbHkgb2YgZnVuY3Rpb25zIG11c3QgaW5kaWNhdGUgdGhpcyBieSBkZWZpbmluZwogICAgX1BPU0lYX1NFTUFQSE9SRVMuICovICAgCkBAIC0xMzgsMTUgKzE1MiwyNyBAQAogI2lmIGRlZmluZWQoVEhSRUFEX1NUQUNLX1NJWkUpIHx8IGRlZmluZWQoUFRIUkVBRF9TWVNURU1fU0NIRURfU1VQUE9SVEVEKQogCXB0aHJlYWRfYXR0cl90IGF0dHJzOwogI2VuZGlmCisjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKKwlzaXplX3QJdHNzOworI2VuZGlmCisKIAlkcHJpbnRmKCgiUHlUaHJlYWRfc3RhcnRfbmV3X3RocmVhZCBjYWxsZWRcbiIpKTsKIAlpZiAoIWluaXRpYWxpemVkKQogCQlQeVRocmVhZF9pbml0X3RocmVhZCgpOwogCiAjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkgfHwgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCi0JcHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKTsKKwlpZiAocHRocmVhZF9hdHRyX2luaXQoJmF0dHJzKSAhPSAwKQorCQlyZXR1cm4gLTE7CiAjZW5kaWYKLSNpZmRlZiBUSFJFQURfU1RBQ0tfU0laRQotCXB0aHJlYWRfYXR0cl9zZXRzdGFja3NpemUoJmF0dHJzLCBUSFJFQURfU1RBQ0tfU0laRSk7CisjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKKwl0c3MgPSAoX3B5dGhyZWFkX3N0YWNrc2l6ZSAhPSAwKSA/IF9weXRocmVhZF9zdGFja3NpemUKKwkJCQkJIDogVEhSRUFEX1NUQUNLX1NJWkU7CisJaWYgKHRzcyAhPSAwKSB7CisJCWlmIChwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZhdHRycywgdHNzKSAhPSAwKSB7CisJCQlwdGhyZWFkX2F0dHJfZGVzdHJveSgmYXR0cnMpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQogI2VuZGlmCiAjaWYgZGVmaW5lZChQVEhSRUFEX1NZU1RFTV9TQ0hFRF9TVVBQT1JURUQpCiAgICAgICAgIHB0aHJlYWRfYXR0cl9zZXRzY29wZSgmYXR0cnMsIFBUSFJFQURfU0NPUEVfU1lTVEVNKTsKQEAgLTQ2MCwzICs0ODYsNDggQEAKIH0KIAogI2VuZGlmIC8qIFVTRV9TRU1BUEhPUkVTICovCisKKy8qIHNldCB0aGUgdGhyZWFkIHN0YWNrIHNpemUuCisgKiBSZXR1cm4gMCBpZiBzaXplIGlzIHZhbGlkLCAtMSBpZiBzaXplIGlzIGludmFsaWQsCisgKiAtMiBpZiBzZXR0aW5nIHN0YWNrIHNpemUgaXMgbm90IHN1cHBvcnRlZC4KKyAqLworc3RhdGljIGludAorX3B5dGhyZWFkX3B0aHJlYWRfc2V0X3N0YWNrc2l6ZShzaXplX3Qgc2l6ZSkKK3sKKyNpZiBkZWZpbmVkKFRIUkVBRF9TVEFDS19TSVpFKQorCXB0aHJlYWRfYXR0cl90IGF0dHJzOworCXNpemVfdCB0c3NfbWluOworCWludCByYyA9IDA7CisjZW5kaWYKKworCS8qIHNldCB0byBkZWZhdWx0ICovCisJaWYgKHNpemUgPT0gMCkgeworCQlfcHl0aHJlYWRfc3RhY2tzaXplID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCisjaWYgZGVmaW5lZChUSFJFQURfU1RBQ0tfU0laRSkKKyNpZiBkZWZpbmVkKFBUSFJFQURfU1RBQ0tfTUlOKQorCXRzc19taW4gPSBQVEhSRUFEX1NUQUNLX01JTiA+IFRIUkVBRF9TVEFDS19NSU4gPyBQVEhSRUFEX1NUQUNLX01JTgorCQkJCQkJICAgICAgIDogVEhSRUFEX1NUQUNLX01JTjsKKyNlbHNlCisJdHNzX21pbiA9IFRIUkVBRF9TVEFDS19NSU47CisjZW5kaWYKKwlpZiAoc2l6ZSA+PSB0c3NfbWluKSB7CisJCS8qIHZhbGlkYXRlIHN0YWNrIHNpemUgYnkgc2V0dGluZyB0aHJlYWQgYXR0cmlidXRlICovCisJCWlmIChwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cnMpID09IDApIHsKKwkJCXJjID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSgmYXR0cnMsIHNpemUpOworCQkJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHJzKTsKKwkJCWlmIChyYyA9PSAwKSB7CisJCQkJX3B5dGhyZWFkX3N0YWNrc2l6ZSA9IHNpemU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIC0xOworI2Vsc2UKKwlyZXR1cm4gLTI7CisjZW5kaWYKK30KKworI2RlZmluZSBUSFJFQURfU0VUX1NUQUNLU0laRSh4KQlfcHl0aHJlYWRfcHRocmVhZF9zZXRfc3RhY2tzaXplKHgpCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKaW5kZXggYjNmNzJlNy4uNzJhMTBjZCAxMDA2NDQKLS0tIGEvUkVBRE1FCisrKyBiL1JFQURNRQpAQCAtMjI2LDEzICsyMjYsMTMgQEAKIFVuc3VwcG9ydGVkIHN5c3RlbXMKIC0tLS0tLS0tLS0tLS0tLS0tLS0KIAotWFhYIFRoaXMgc2VjdGlvbiBpcyBvdXQgb2YgZGF0ZSEKLQotQSBudW1iZXIgb2YgZmVhdHVyZXMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIuMyBhbnltb3JlLiBTb21lCi1zdXBwb3J0IGNvZGUgaXMgc3RpbGwgcHJlc2VudCwgYnV0IHdpbGwgYmUgcmVtb3ZlZCBpbiBQeXRob24gMi40LiAKK0EgbnVtYmVyIG9mIGZlYXR1cmVzIGFyZSBub3Qgc3VwcG9ydGVkIGluIFB5dGhvbiAyLjUgYW55bW9yZS4gU29tZQorc3VwcG9ydCBjb2RlIGlzIHN0aWxsIHByZXNlbnQsIGJ1dCB3aWxsIGJlIHJlbW92ZWQgaW4gUHl0aG9uIDIuNi4gCiBJZiB5b3Ugc3RpbGwgbmVlZCB0byB1c2UgY3VycmVudCBQeXRob24gdmVyc2lvbnMgb24gdGhlc2Ugc3lzdGVtcywKIHBsZWFzZSBzZW5kIGEgbWVzc2FnZSB0byBweXRob24tZGV2QHB5dGhvbi5vcmcgaW5kaWNhdGluZyB0aGF0IHlvdQotdm9sdW50ZWVyIHRvIHN1cHBvcnQgdGhpcyBzeXN0ZW0uCit2b2x1bnRlZXIgdG8gc3VwcG9ydCB0aGlzIHN5c3RlbS4gRm9yIGEgbW9yZSBkZXRhaWxlZCBkaXNjdXNzaW9uIAorcmVnYXJkaW5nIG5vLWxvbmdlci1zdXBwb3J0ZWQgYW5kIHJlc3VwcG9ydGluZyBwbGF0Zm9ybXMsIGFzIHdlbGwKK2FzIGEgbGlzdCBvZiBwbGF0Zm9ybXMgdGhhdCBiZWNhbWUgb3Igd2lsbCBiZSB1bnN1cHBvcnRlZCwgc2VlIFBFUCAxMS4KIAogTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBmb2xsb3dpbmcgc3lzdGVtcyBhcmUgbm90IHN1cHBvcnRlZCBhbnkKIGxvbmdlcjoKQEAgLTI0MCw2ICsyNDAsNyBAQAogLSBEWU5JWAogLSBkZ3V4CiAtIE1pbml4CistIE5lWFQKIC0gSXJpeCA0IGFuZCAtLXdpdGgtc2dpLWRsCiAtIExpbnV4IDEKIC0gU3lzdGVtcyBkZWZpbmluZyBfX2Q2X3B0aHJlYWRfY3JlYXRlIChjb25maWd1cmUuaW4pCkBAIC0yNDcsNiArMjQ4LDI1IEBACiAgIG9yIFBZX1BUSFJFQURfRDcgaW4gdGhyZWFkX3B0aHJlYWQuaAogLSBTeXN0ZW1zIHVzaW5nIC0td2l0aC1kbC1kbGQKIC0gU3lzdGVtcyB1c2luZyAtLXdpdGhvdXQtdW5pdmVyc2FsLW5ld2xpbmVzCistIE1hY09TIDkKKworVGhlIGZvbGxvd2luZyBzeXN0ZW1zIGFyZSBzdGlsbCBzdXBwb3J0ZWQgaW4gUHl0aG9uIDIuNSwgYnV0CitzdXBwb3J0IHdpbGwgYmUgZHJvcHBlZCBpbiAyLjY6CistIFN5c3RlbXMgdXNpbmcgLS13aXRoLXdjdHlwZS1mdW5jdGlvbnMKKy0gV2luOXgsIFdpbk1FCisKK1dhcm5pbmcgb24gaW5zdGFsbCBpbiBXaW5kb3dzIDk4IGFuZCBXaW5kb3dzIE1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitGb2xsb3dpbmcgTWljcm9zb2Z0J3MgY2xvc2luZyBvZiBFeHRlbmRlZCBTdXBwb3J0IGZvcgorV2luZG93cyA5OC9NRSAoSnVseSAxMSwgMjAwNiksIFB5dGhvbiAyLjYgd2lsbCBzdG9wCitzdXBwb3J0aW5nIHRoZXNlIHBsYXRmb3Jtcy4gUHl0aG9uIGRldmVsb3BtZW50IGFuZAorbWFpbnRhaW5hYmlsaXR5IGJlY29tZXMgZWFzaWVyIChhbmQgbW9yZSByZWxpYWJsZSkgd2hlbgorcGxhdGZvcm0gc3BlY2lmaWMgY29kZSB0YXJnZXRpbmcgT1NlcyB3aXRoIGZldyB1c2VycworYW5kIG5vIGRlZGljYXRlZCBleHBlcnQgZGV2ZWxvcGVycyBpcyB0YWtlbiBvdXQuIFRoZQordmVuZG9yIGFsc28gd2FybnMgdGhhdCB0aGUgT1MgdmVyc2lvbnMgbGlzdGVkIGFib3ZlCisiY2FuIGV4cG9zZSBjdXN0b21lcnMgdG8gc2VjdXJpdHkgcmlza3MiIGFuZCByZWNvbW1lbmRzCit1cGdyYWRlLgogCiBQbGF0Zm9ybSBzcGVjaWZpYyBub3RlcwogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQyNiwxNCArNDQ2LDYgQEAKICAgICAgICAgdGhyZWFkIG1heSBpbnRlcnJ1cHQgc3lzdGVtIGNhbGxzIGluIG90aGVycykuIFRoZXJlZm9yZSwgdGVzdF9tYXRoIGFuZAogICAgICAgICB0ZXN0cyBpbnZvbHZpbmcgdGhyZWFkcyB3aWxsIGZhaWwgdW50aWwgdGhvc2UgcHJvYmxlbXMgYXJlIGZpeGVkLgogCi1TdW5PUyA0Lng6IFdoZW4gdXNpbmcgdGhlIFN1blBybyBDIGNvbXBpbGVyLCB5b3UgbWF5IHdhbnQgdG8gdXNlIHRoZQotICAgICAgICAnLVhhJyBvcHRpb24gaW5zdGVhZCBvZiAnLVhjJywgdG8gZW5hYmxlIHNvbWUgbmVlZGVkIG5vbi1BTlNJCi0gICAgICAgIFN1bmlzbXMuCi0gICAgICAgIFRISVMgU1lTVEVNIElTIE5PIExPTkdFUiBTVVBQT1JURUQuCi0KLU5lWFQ6ICAgTm90IHN1cHBvcnRlZCBhbnltb3JlLiBTdGFydCB3aXRoIHRoZSBNYWNPU1gvRGFyd2luIGNvZGUgaWYgeW91Ci0gICAgICAgIHdhbnQgdG8gcmV2aXZlIGl0LgotCiBRTlg6ICAgIENocmlzIEhlcmJvcnRoIChjaHJpc2hAcW54LmNvbSkgd3JpdGVzOgogICAgICAgICBjb25maWd1cmUgd29ya3MgYmVzdCBpZiB5b3UgdXNlIEdOVSBiYXNoOyBhIHBvcnQgaXMgYXZhaWxhYmxlIG9uCiAgICAgICAgIGZ0cC5xbnguY29tIGluIC91c3IvZnJlZS4gIEkgdXNlZCB0aGUgZm9sbG93aW5nIHByb2Nlc3MgdG8gYnVpbGQsCmRpZmYgLS1naXQgYS9SSVNDT1MvcHljb25maWcuaCBiL1JJU0NPUy9weWNvbmZpZy5oCmluZGV4IDQ1Zjg3YmUuLjlhMzRkNDEgMTAwNjQ0Ci0tLSBhL1JJU0NPUy9weWNvbmZpZy5oCisrKyBiL1JJU0NPUy9weWNvbmZpZy5oCkBAIC01NTMsNiArNTUzLDkgQEAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgd2FpdHBpZCBmdW5jdGlvbi4gICovCiAjdW5kZWYgSEFWRV9XQUlUUElECiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ09OSU9fSAorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkYi5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9EQl9ICiAKQEAgLTU2MiwxOCArNTY1LDI3IEBACiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxkYl8xODUuaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfREJfMTg1X0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRElSRUNUX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZW50Lmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX0RJUkVOVF9ICiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGRsZmNuLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX0RMRkNOX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjZGVmaW5lIEhBVkVfRVJSTk9fSCAxCisKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGZjbnRsLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX0ZDTlRMX0gKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8Z2RibS9uZGJtLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX0dEQk1fTkRCTV9ICiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPGlvLmg+IGhlYWRlciBmaWxlLiAgKi8KKyN1bmRlZiBIQVZFX0lPX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8bGFuZ2luZm8uaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfTEFOR0lORk9fSAogCkBAIC01OTUsMTIgKzYwNywxOCBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9QT0xMX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cHJvY2Vzcy5oPiBoZWFkZXIgZmlsZS4gICovCisjdW5kZWYgSEFWRV9QUk9DRVNTX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cHRocmVhZC5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9QVEhSRUFEX0gKIAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8cHR5Lmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1BUWV9ICiAKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHNpZ25hbC5oPiBoZWFkZXIgZmlsZS4gICovCisjZGVmaW5lIEhBVkVfU0lHTkFMX0gKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL2F1ZGlvaW8uaD4gaGVhZGVyIGZpbGUuICAqLwogI3VuZGVmIEhBVkVfU1lTX0FVRElPSU9fSAogCkBAIC02MzQsMTIgKzY1MiwxOCBAQAogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3NvY2tldC5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfU09DS0VUX0gKIAorLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3N0YXQuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NZU19TVEFUX0ggMQorCiAvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdGltZS5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfVElNRV9ICiAKIC8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgPHN5cy90aW1lcy5oPiBoZWFkZXIgZmlsZS4gICovCiAjdW5kZWYgSEFWRV9TWVNfVElNRVNfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICAqLworI2RlZmluZSBIQVZFX1NZU19UWVBFU19IIDEKKwogLyogRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSA8c3lzL3VuLmg+IGhlYWRlciBmaWxlLiAgKi8KICN1bmRlZiBIQVZFX1NZU19VTl9ICiAKQEAgLTY4OCw3ICs3MTIsNiBAQAogCiAjZGVmaW5lIERPTlRfSEFWRV9GU1RBVCAxCiAjZGVmaW5lIERPTlRfSEFWRV9TVEFUICAxCi0jdW5kZWYgRE9OVF9IQVZFX1NZU19TVEFUX0gKIAogI2RlZmluZSBQTEFURk9STSAicmlzY29zIgogCmRpZmYgLS1naXQgYS9Ub29scy9idWlsZGJvdC9NYWtlZmlsZSBiL1Rvb2xzL2J1aWxkYm90L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NjAyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9idWlsZGJvdC9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKK2FsbDoJa2lsbF9weXRob24uZXhlCisJLi9raWxsX3B5dGhvbi5leGUKKwora2lsbF9weXRob24uZXhlOglraWxsX3B5dGhvbi5jCisJZ2NjIC1vIGtpbGxfcHl0aG9uLmV4ZSBraWxsX3B5dGhvbi5jIC1scHNhcGkKKwpkaWZmIC0tZ2l0IGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYyBiL1Rvb2xzL2J1aWxkYm90L2tpbGxfcHl0aG9uLmMKaW5kZXggZWJjOWFhNC4uMDIzZmYyZCAxMDA2NDQKLS0tIGEvVG9vbHMvYnVpbGRib3Qva2lsbF9weXRob24uYworKysgYi9Ub29scy9idWlsZGJvdC9raWxsX3B5dGhvbi5jCkBAIC00Miw3ICs0MiwxOSBAQAogCiAJCV9zdHJsd3IocGF0aCk7CiAJCS8qIHByaW50ZigiJXNcbiIsIHBhdGgpOyAqLwotCQlpZiAoc3Ryc3RyKHBhdGgsICJidWlsZFxccGNidWlsZFxccHl0aG9uX2QuZXhlIikgIT0gTlVMTCkgeworCisJCS8qIENoZWNrIGlmIHdlIGFyZSBydW5uaW5nIGEgYnVpbGRib3QgdmVyc2lvbiBvZiBQeXRob24uCisKKwkJICAgT24gV2luZG93cywgdGhpcyB3aWxsIGFsd2F5cyBiZSBhIGRlYnVnIGJ1aWxkIGZyb20gdGhlCisJCSAgIFBDYnVpbGQgZGlyZWN0b3J5LiAgYnVpbGRcXFBDYnVpbGRcXHB5dGhvbl9kLmV4ZQorCQkgICAKKwkJICAgT24gQ3lnd2luLCB0aGUgcGF0aG5hbWUgaXMgc2ltaWxhciB0byBvdGhlciBVbml4ZXMuCisJCSAgIFVzZSBcXGJ1aWxkXFxweXRob24uZXhlIHRvIGVuc3VyZSB3ZSBkb24ndCBtYXRjaAorCQkgICBQQ2J1aWxkXFxweXRob24uZXhlIHdoaWNoIGNvdWxkIGJlIGEgbm9ybWFsIGluc3RhbmNlCisJCSAgIG9mIFB5dGhvbiBydW5uaW5nIG9uIHZhbmlsbGEgV2luZG93cy4KKwkJKi8KKwkJaWYgKChzdHJzdHIocGF0aCwgImJ1aWxkXFxwY2J1aWxkXFxweXRob25fZC5leGUiKSAhPSBOVUxMKSB8fAorCQkgICAgKHN0cnN0cihwYXRoLCAiXFxidWlsZFxccHl0aG9uLmV4ZSIpICE9IE5VTEwpKSB7CiAJCQlwcmludGYoIlRlcm1pbmF0aW5nICVzIChwaWQgJWQpXG4iLCBwYXRoLCBwaWRzW2ldKTsKIAkJCWlmICghVGVybWluYXRlUHJvY2VzcyhoUHJvY2VzcywgMSkpIHsKIAkJCQlwcmludGYoIlRlcm1pbmF0aW9uIGZhaWxlZDogJWRcbiIsIEdldExhc3RFcnJvcigpKTsKZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS9tc2kucHkgYi9Ub29scy9tc2kvbXNpLnB5CmluZGV4IDI1NzYzODAuLmFlYmFiOTggMTAwNjQ0Ci0tLSBhL1Rvb2xzL21zaS9tc2kucHkKKysrIGIvVG9vbHMvbXNpL21zaS5weQpAQCAtMzY3LDcgKzM2Nyw3IEBACiAgICAgICAgICAgICAgICgiVmVyZGFuYVJlZDkiLCAiVmVyZGFuYSIsIDksIDI1NSwgMCksCiAgICAgICAgICAgICAgXSkKIAotICAgIGNvbXBpbGVhcmdzID0gciItV2kgW1RBUkdFVERJUl1MaWJcY29tcGlsZWFsbC5weSAtZiAteCBiYWRfY29kaW5nfGJhZHN5bnRheHxzaXRlLXBhY2thZ2VzIFtUQVJHRVRESVJdTGliIgorICAgIGNvbXBpbGVhcmdzID0gcictV2kgIltUQVJHRVRESVJdTGliXGNvbXBpbGVhbGwucHkiIC1mIC14IGJhZF9jb2Rpbmd8YmFkc3ludGF4fHNpdGUtcGFja2FnZXMgIltUQVJHRVRESVJdTGliIicKICAgICAjIFNlZSAiQ3VzdG9tQWN0aW9uIFRhYmxlIgogICAgIGFkZF9kYXRhKGRiLCAiQ3VzdG9tQWN0aW9uIiwgWwogICAgICAgICAjIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZUZpcnN0U2VxdWVuY2UgKyBtc2lkYkN1c3RvbUFjdGlvblR5cGVUZXh0RGF0YSArIG1zaWRiQ3VzdG9tQWN0aW9uVHlwZVByb3BlcnR5CkBAIC05NjIsNiArOTYyLDE0IEBACiAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICBkbGxzLmFwcGVuZChmKQogICAgICAgICBsaWIuYWRkX2ZpbGUoZikKKyAgICAjIEFkZCBzcWxpdGUKKyAgICBpZiBtc2lsaWIubXNpX3R5cGU9PSJJbnRlbDY0OzEwMzMiOgorICAgICAgICBzcWxpdGVfYXJjaCA9ICIvaWE2NCIKKyAgICBlbGlmIG1zaWxpYi5tc2lfdHlwZT09Ing2NDsxMDMzIjoKKyAgICAgICAgc3FsaXRlX2FyY2ggPSAiL2FtZDY0IgorICAgIGVsc2U6CisgICAgICAgIHNxbGl0ZV9hcmNoID0gIiIKKyAgICBsaWIuYWRkX2ZpbGUoc3JjZGlyKyIvIitzcWxpdGVfZGlyK3NxbGl0ZV9hcmNoKyIvc3FsaXRlMy5kbGwiKQogICAgIGlmIGhhdmVfdGNsOgogICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc3JjZGlyKyIvUENCdWlsZC9fdGtpbnRlci5weWQiKToKICAgICAgICAgICAgIHByaW50ICJXQVJOSU5HOiBNaXNzaW5nIF90a2ludGVyLnB5ZCIKQEAgLTk3MiwxNCArOTgwLDYgQEAKICAgICAgICAgICAgIHRjbGRpciA9IG9zLnBhdGgubm9ybXBhdGgoc3JjZGlyKyIvLi4vdGNsdGsvYmluIikKICAgICAgICAgICAgIGZvciBmIGluIGdsb2IuZ2xvYjEodGNsZGlyLCAiKi5kbGwiKToKICAgICAgICAgICAgICAgICBsaWIuYWRkX2ZpbGUoZiwgc3JjPW9zLnBhdGguam9pbih0Y2xkaXIsIGYpKQotICAgICMgQWRkIHNxbGl0ZQotICAgIGlmIG1zaWxpYi5tc2lfdHlwZT09IkludGVsNjQ7MTAzMyI6Ci0gICAgICAgIHNxbGl0ZV9hcmNoID0gIi9pYTY0IgotICAgIGVsaWYgbXNpbGliLm1zaV90eXBlPT0ieDY0OzEwMzMiOgotICAgICAgICBzcWxpdGVfYXJjaCA9ICIvYW1kNjQiCi0gICAgZWxzZToKLSAgICAgICAgc3FsaXRlX2FyY2ggPSAiIgotICAgIGxpYi5hZGRfZmlsZShzcmNkaXIrIi8iK3NxbGl0ZV9kaXIrc3FsaXRlX2FyY2grIi9zcWxpdGUzLmRsbCIpCiAgICAgIyBjaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgdW5rbm93biBleHRlbnNpb25zCiAgICAgZm9yIGYgaW4gZ2xvYi5nbG9iMShzcmNkaXIrIi9QQ0J1aWxkIiwgIioucHlkIik6CiAgICAgICAgIGlmIGYuZW5kc3dpdGgoIl9kLnB5ZCIpOiBjb250aW51ZSAjIGRlYnVnIHZlcnNpb24KZGlmZiAtLWdpdCBhL1Rvb2xzL21zaS91dWlkcy5weSBiL1Rvb2xzL21zaS91dWlkcy5weQppbmRleCBjZTdlNjA0Li4zMDY0OTc1IDEwMDY0NAotLS0gYS9Ub29scy9tc2kvdXVpZHMucHkKKysrIGIvVG9vbHMvbXNpL3V1aWRzLnB5CkBAIC0yNyw2ICsyNyw3IEBACiAgICAgJzIuNS4xMDMnOiAnezczZGNkOTY2LWZmZWMtNDE1Zi1iYjM5LTgzNDJjMWY0NzAxN30nLCAjIDIuNWEzCiAgICAgJzIuNS4xMTEnOiAne2M3OTdlY2Y4LWE4ZTYtNGZlYy1iYjk5LTUyNmI2NWYyODYyNn0nLCAjIDIuNWIxCiAgICAgJzIuNS4xMTInOiAnezMyYmViNzc0LWY2MjUtNDM5ZC1iNTg3LTcxODc0ODdiYWYxNX0nLCAjIDIuNWIyCisgICAgJzIuNS4xMTMnOiAnezg5ZjIzOTE4LTExY2YtNGYwOC1iZTEzLWI5YjJlNjQ2M2ZkOX0nLCAjIDIuNWIzCiAgICAgJzIuNS4xMjEnOiAnezhlOTMyMWJjLTZiMjQtNDhhMy04ZmQ0LWM5NWY4ZTUzMWU1Zn0nLCAjIDIuNWMxCiAgICAgJzIuNS4xMjInOiAne2E2Y2Q1MDhkLTk1OTktNDVkYS1hNDQxLWNiZmZhOWY3ZTA3MH0nLCAjIDIuNWMyCiAgICAgJzIuNS4xNTAnOiAnezBhMmM1ODU0LTU1N2UtNDhjOC04MzVhLTNiOWYwNzRiZGNhYX0nLCAjIDIuNS4wCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0FyaXRobWV0aWMucHkgYi9Ub29scy9weWJlbmNoL0FyaXRobWV0aWMucHkKaW5kZXggNGVkNjIxOS4uNjkyM2I0YiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Bcml0aG1ldGljLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvQXJpdGhtZXRpYy5weQpAQCAtMiw3ICsyLDcgQEAKIAogY2xhc3MgU2ltcGxlSW50ZWdlckFyaXRobWV0aWMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1ICogKDMgKyA1ICsgNSArIDMgKyAzICsgMykKICAgICByb3VuZHMgPSAxMjAwMDAKIApAQCAtMTU3LDkgKzE1Nyw5IEBACiAKIGNsYXNzIFNpbXBsZUZsb2F0QXJpdGhtZXRpYyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQotICAgIHJvdW5kcyA9IDEwMDAwMAorICAgIHJvdW5kcyA9IDEyMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTMxMiw3ICszMTIsNyBAQAogCiBjbGFzcyBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1ICogKDMgKyA1ICsgNSArIDMgKyAzICsgMykKICAgICByb3VuZHMgPSAxMjAwMDAKIApAQCAtNDY4LDkgKzQ2OCw5IEBACiAKIGNsYXNzIFNpbXBsZUxvbmdBcml0aG1ldGljKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqICgzICsgNSArIDUgKyAzICsgMyArIDMpCi0gICAgcm91bmRzID0gMzAwMDAKKyAgICByb3VuZHMgPSA2MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTYyMyw5ICs2MjMsOSBAQAogCiBjbGFzcyBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiAoMyArIDUgKyA1ICsgMyArIDMgKyAzKQotICAgIHJvdW5kcyA9IDQwMDAwCisgICAgcm91bmRzID0gODAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0NhbGxzLnB5IGIvVG9vbHMvcHliZW5jaC9DYWxscy5weQppbmRleCBlMjk1MjQzLi43MmNjZDBlIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0NhbGxzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvQ2FsbHMucHkKQEAgLTIsNyArMiw3IEBACiAKIGNsYXNzIFB5dGhvbkZ1bmN0aW9uQ2FsbHMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigxKzQrNCsyKQogICAgIHJvdW5kcyA9IDYwMDAwCiAKQEAgLTExMSw5ICsxMTEsOSBAQAogCiBjbGFzcyBCdWlsdGluRnVuY3Rpb25DYWxscyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjQKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDIrNSs1KzUpCi0gICAgcm91bmRzID0gMzAwMDAKKyAgICByb3VuZHMgPSA2MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTIzMiw5ICsyMzIsOSBAQAogCiBjbGFzcyBQeXRob25NZXRob2RDYWxscyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA1ICsgNCkKLSAgICByb3VuZHMgPSAyMDAwMAorICAgIHJvdW5kcyA9IDMwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMzc0LDkgKzM3NCw5IEBACiAKIGNsYXNzIFJlY3Vyc2lvbihUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUKLSAgICByb3VuZHMgPSA1MDAwMAorICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTQwNywzICs0MDcsOTYgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcworCisKKyMjIyBUZXN0IHRvIG1ha2UgRnJlZHJpayBoYXBweS4uLgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIGltcG9ydCB0aW1laXQKKyAgICBpZiAwOgorICAgICAgICB0aW1laXQuVGVzdENsYXNzID0gUHl0aG9uRnVuY3Rpb25DYWxscworICAgICAgICB0aW1laXQubWFpbihbJy1zJywgJ3Rlc3QgPSBUZXN0Q2xhc3MoKTsgdGVzdC5yb3VuZHMgPSAxMDAwJywKKyAgICAgICAgICAgICAgICAgICAgICd0ZXN0LnRlc3QoKSddKQorICAgIGVsc2U6CisgICAgICAgIHNldHVwID0gIiIiXAorZ2xvYmFsIGYsZjEsZyxoCisKKyMgZGVmaW5lIGZ1bmN0aW9ucworZGVmIGYoKToKKyAgICBwYXNzCisKK2RlZiBmMSh4KToKKyAgICBwYXNzCisKK2RlZiBnKGEsYixjKToKKyAgICByZXR1cm4gYSxiLGMKKworZGVmIGgoYSxiLGMsZD0xLGU9MixmPTMpOgorICAgIHJldHVybiBkLGUsZgorCitpID0gMQorIiIiCisgICAgICAgIHRlc3QgPSAiIiJcCitmKCkKK2YxKGkpCitmMShpKQorZjEoaSkKK2YxKGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitnKGksaSxpKQoraChpLGksMyxpLGkpCitoKGksaSxpLDIsaSwzKQorCitmKCkKK2YxKGkpCitmMShpKQorZjEoaSkKK2YxKGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitnKGksaSxpKQoraChpLGksMyxpLGkpCitoKGksaSxpLDIsaSwzKQorCitmKCkKK2YxKGkpCitmMShpKQorZjEoaSkKK2YxKGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitnKGksaSxpKQoraChpLGksMyxpLGkpCitoKGksaSxpLDIsaSwzKQorCitmKCkKK2YxKGkpCitmMShpKQorZjEoaSkKK2YxKGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitnKGksaSxpKQoraChpLGksMyxpLGkpCitoKGksaSxpLDIsaSwzKQorCitmKCkKK2YxKGkpCitmMShpKQorZjEoaSkKK2YxKGkpCitnKGksaSxpKQorZyhpLGksaSkKK2coaSxpLGkpCitnKGksaSxpKQoraChpLGksMyxpLGkpCitoKGksaSxpLDIsaSwzKQorIiIiCisKKyAgICAgICAgdGltZWl0Lm1haW4oWyctcycsIHNldHVwLAorICAgICAgICAgICAgICAgICAgICAgdGVzdF0pCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5IGIvVG9vbHMvcHliZW5jaC9Db21tYW5kTGluZS5weQppbmRleCAxM2U0ZjliLi42NjAxYmU1IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0NvbW1hbmRMaW5lLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvQ29tbWFuZExpbmUucHkKQEAgLTM1OCw3ICszNTgsNyBAQAogCiAgICAgICAgIGV4Y2VwdCBzZWxmLkludGVybmFsRXJyb3I6CiAgICAgICAgICAgICBwcmludAotICAgICAgICAgICAgcHJpbnQgJyogSW50ZXJuYWwgRXJyb3InCisgICAgICAgICAgICBwcmludCAnKiBJbnRlcm5hbCBFcnJvciAodXNlIC0tZGVidWcgdG8gZGlzcGxheSB0aGUgdHJhY2ViYWNrKScKICAgICAgICAgICAgIGlmIHNlbGYuZGVidWc6CiAgICAgICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgICAgICB0cmFjZWJhY2sucHJpbnRfZXhjKDIwLCBzeXMuc3Rkb3V0KQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9Db25zdHJ1Y3RzLnB5IGIvVG9vbHMvcHliZW5jaC9Db25zdHJ1Y3RzLnB5CmluZGV4IDAwMDQ1YmQuLjUxMDU0NjEgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvQ29uc3RydWN0cy5weQorKysgYi9Ub29scy9weWJlbmNoL0NvbnN0cnVjdHMucHkKQEAgLTIsNyArMiw3IEBACiAKIGNsYXNzIElmVGhlbkVsc2UoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMzAqMyAjIGhhcmQgdG8gc2F5Li4uCiAgICAgcm91bmRzID0gMTUwMDAwCiAKQEAgLTQ2OSw5ICs0NjksOSBAQAogCiBjbGFzcyBOZXN0ZWRGb3JMb29wcyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDEwMDAqMTAqNQotICAgIHJvdW5kcyA9IDE1MAorICAgIHJvdW5kcyA9IDMwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTQ5NCw5ICs0OTQsOSBAQAogCiBjbGFzcyBGb3JMb29wcyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiA1Ci0gICAgcm91bmRzID0gODAwMAorICAgIHJvdW5kcyA9IDEwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9EaWN0LnB5IGIvVG9vbHMvcHliZW5jaC9EaWN0LnB5CmluZGV4IDU0YWVhZTcuLjljZGQ2ODIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvRGljdC5weQorKysgYi9Ub29scy9weWJlbmNoL0RpY3QucHkKQEAgLTIsOSArMiw5IEBACiAKIGNsYXNzIERpY3RDcmVhdGlvbihUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDUgKyA1KQotICAgIHJvdW5kcyA9IDYwMDAwCisgICAgcm91bmRzID0gODAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC03Nyw3ICs3Nyw3IEBACiAKIGNsYXNzIERpY3RXaXRoU3RyaW5nS2V5cyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQogICAgIHJvdW5kcyA9IDIwMDAwMAogCkBAIC0xNjYsOSArMTY2LDkgQEAKIAogY2xhc3MgRGljdFdpdGhGbG9hdEtleXMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1Kig2ICsgNikKLSAgICByb3VuZHMgPSAyMDAwMDAKKyAgICByb3VuZHMgPSAxNTAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0yNTUsNyArMjU1LDcgQEAKIAogY2xhc3MgRGljdFdpdGhJbnRlZ2VyS2V5cyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDYgKyA2KQogICAgIHJvdW5kcyA9IDIwMDAwMAogCkBAIC0zNDQsMTMgKzM0NCwxNCBAQAogCiBjbGFzcyBTaW1wbGVEaWN0TWFuaXB1bGF0aW9uKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooNiArIDYgKyA2ICsgNikKLSAgICByb3VuZHMgPSA1MDAwMAorICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKICAgICAgICAgZCA9IHt9CisgICAgICAgIGhhc19rZXkgPSBkLmhhc19rZXkKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogCkBAIC0zNjgsMTIgKzM2OSwxMiBAQAogICAgICAgICAgICAgeCA9IGRbNF0KICAgICAgICAgICAgIHggPSBkWzVdCiAKLSAgICAgICAgICAgIGQuaGFzX2tleSgwKQotICAgICAgICAgICAgZC5oYXNfa2V5KDIpCi0gICAgICAgICAgICBkLmhhc19rZXkoNCkKLSAgICAgICAgICAgIGQuaGFzX2tleSg2KQotICAgICAgICAgICAgZC5oYXNfa2V5KDgpCi0gICAgICAgICAgICBkLmhhc19rZXkoMTApCisgICAgICAgICAgICBoYXNfa2V5KDApCisgICAgICAgICAgICBoYXNfa2V5KDIpCisgICAgICAgICAgICBoYXNfa2V5KDQpCisgICAgICAgICAgICBoYXNfa2V5KDYpCisgICAgICAgICAgICBoYXNfa2V5KDgpCisgICAgICAgICAgICBoYXNfa2V5KDEwKQogCiAgICAgICAgICAgICBkZWwgZFswXQogICAgICAgICAgICAgZGVsIGRbMV0KQEAgLTM5NiwxMiArMzk3LDEyIEBACiAgICAgICAgICAgICB4ID0gZFs0XQogICAgICAgICAgICAgeCA9IGRbNV0KIAotICAgICAgICAgICAgZC5oYXNfa2V5KDApCi0gICAgICAgICAgICBkLmhhc19rZXkoMikKLSAgICAgICAgICAgIGQuaGFzX2tleSg0KQotICAgICAgICAgICAgZC5oYXNfa2V5KDYpCi0gICAgICAgICAgICBkLmhhc19rZXkoOCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgxMCkKKyAgICAgICAgICAgIGhhc19rZXkoMCkKKyAgICAgICAgICAgIGhhc19rZXkoMikKKyAgICAgICAgICAgIGhhc19rZXkoNCkKKyAgICAgICAgICAgIGhhc19rZXkoNikKKyAgICAgICAgICAgIGhhc19rZXkoOCkKKyAgICAgICAgICAgIGhhc19rZXkoMTApCiAKICAgICAgICAgICAgIGRlbCBkWzBdCiAgICAgICAgICAgICBkZWwgZFsxXQpAQCAtNDI0LDEyICs0MjUsMTIgQEAKICAgICAgICAgICAgIHggPSBkWzRdCiAgICAgICAgICAgICB4ID0gZFs1XQogCi0gICAgICAgICAgICBkLmhhc19rZXkoMCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgyKQotICAgICAgICAgICAgZC5oYXNfa2V5KDQpCi0gICAgICAgICAgICBkLmhhc19rZXkoNikKLSAgICAgICAgICAgIGQuaGFzX2tleSg4KQotICAgICAgICAgICAgZC5oYXNfa2V5KDEwKQorICAgICAgICAgICAgaGFzX2tleSgwKQorICAgICAgICAgICAgaGFzX2tleSgyKQorICAgICAgICAgICAgaGFzX2tleSg0KQorICAgICAgICAgICAgaGFzX2tleSg2KQorICAgICAgICAgICAgaGFzX2tleSg4KQorICAgICAgICAgICAgaGFzX2tleSgxMCkKIAogICAgICAgICAgICAgZGVsIGRbMF0KICAgICAgICAgICAgIGRlbCBkWzFdCkBAIC00NTIsMTIgKzQ1MywxMiBAQAogICAgICAgICAgICAgeCA9IGRbNF0KICAgICAgICAgICAgIHggPSBkWzVdCiAKLSAgICAgICAgICAgIGQuaGFzX2tleSgwKQotICAgICAgICAgICAgZC5oYXNfa2V5KDIpCi0gICAgICAgICAgICBkLmhhc19rZXkoNCkKLSAgICAgICAgICAgIGQuaGFzX2tleSg2KQotICAgICAgICAgICAgZC5oYXNfa2V5KDgpCi0gICAgICAgICAgICBkLmhhc19rZXkoMTApCisgICAgICAgICAgICBoYXNfa2V5KDApCisgICAgICAgICAgICBoYXNfa2V5KDIpCisgICAgICAgICAgICBoYXNfa2V5KDQpCisgICAgICAgICAgICBoYXNfa2V5KDYpCisgICAgICAgICAgICBoYXNfa2V5KDgpCisgICAgICAgICAgICBoYXNfa2V5KDEwKQogCiAgICAgICAgICAgICBkZWwgZFswXQogICAgICAgICAgICAgZGVsIGRbMV0KQEAgLTQ4MCwxMiArNDgxLDEyIEBACiAgICAgICAgICAgICB4ID0gZFs0XQogICAgICAgICAgICAgeCA9IGRbNV0KIAotICAgICAgICAgICAgZC5oYXNfa2V5KDApCi0gICAgICAgICAgICBkLmhhc19rZXkoMikKLSAgICAgICAgICAgIGQuaGFzX2tleSg0KQotICAgICAgICAgICAgZC5oYXNfa2V5KDYpCi0gICAgICAgICAgICBkLmhhc19rZXkoOCkKLSAgICAgICAgICAgIGQuaGFzX2tleSgxMCkKKyAgICAgICAgICAgIGhhc19rZXkoMCkKKyAgICAgICAgICAgIGhhc19rZXkoMikKKyAgICAgICAgICAgIGhhc19rZXkoNCkKKyAgICAgICAgICAgIGhhc19rZXkoNikKKyAgICAgICAgICAgIGhhc19rZXkoOCkKKyAgICAgICAgICAgIGhhc19rZXkoMTApCiAKICAgICAgICAgICAgIGRlbCBkWzBdCiAgICAgICAgICAgICBkZWwgZFsxXQpAQCAtNDk3LDYgKzQ5OCw3IEBACiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBkID0ge30KKyAgICAgICAgaGFzX2tleSA9IGQuaGFzX2tleQogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6CiAgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0V4Y2VwdGlvbnMucHkgYi9Ub29scy9weWJlbmNoL0V4Y2VwdGlvbnMucHkKaW5kZXggN2U1NTcwOC4uZWZmNjljNyAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9FeGNlcHRpb25zLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvRXhjZXB0aW9ucy5weQpAQCAtMiw5ICsyLDkgQEAKIAogY2xhc3MgVHJ5UmFpc2VFeGNlcHQoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCi0gICAgb3BlcmF0aW9ucyA9IDIgKyAzCi0gICAgcm91bmRzID0gNjAwMDAKKyAgICB2ZXJzaW9uID0gMi4wCisgICAgb3BlcmF0aW9ucyA9IDIgKyAzICsgMworICAgIHJvdW5kcyA9IDgwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMzEsNiArMzEsMTggQEAKICAgICAgICAgICAgICAgICByYWlzZSBlcnJvciwic29tZXRoaW5nIgogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByYWlzZSBlcnJvcigic29tZXRoaW5nIikKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmFpc2UgZXJyb3IoInNvbWV0aGluZyIpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJhaXNlIGVycm9yKCJzb21ldGhpbmciKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CiAKQEAgLTQyLDkgKzU0LDkgQEAKIAogY2xhc3MgVHJ5RXhjZXB0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTUgKiAxMAotICAgIHJvdW5kcyA9IDIwMDAwMAorICAgIHJvdW5kcyA9IDE1MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTY3NywzICs2ODksMTEgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogICAgICAgICAgICAgcGFzcworCisjIyMgVGVzdCB0byBtYWtlIEZyZWRyaWsgaGFwcHkuLi4KKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICBpbXBvcnQgdGltZWl0CisgICAgdGltZWl0LlRlc3RDbGFzcyA9IFRyeVJhaXNlRXhjZXB0CisgICAgdGltZWl0Lm1haW4oWyctcycsICd0ZXN0ID0gVGVzdENsYXNzKCk7IHRlc3Qucm91bmRzID0gMTAwMCcsCisgICAgICAgICAgICAgICAgICd0ZXN0LnRlc3QoKSddKQpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9JbXBvcnRzLnB5IGIvVG9vbHMvcHliZW5jaC9JbXBvcnRzLnB5CmluZGV4IDg1ZWI2MDQuLmFmYzcyOGIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvSW1wb3J0cy5weQorKysgYi9Ub29scy9weWJlbmNoL0ltcG9ydHMucHkKQEAgLTYsOSArNiw5IEBACiAKIGNsYXNzIFNlY29uZEltcG9ydChUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiA1Ci0gICAgcm91bmRzID0gMjAwMDAKKyAgICByb3VuZHMgPSA0MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTUxLDkgKzUxLDkgQEAKIAogY2xhc3MgU2Vjb25kUGFja2FnZUltcG9ydChUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiA1Ci0gICAgcm91bmRzID0gMjAwMDAKKyAgICByb3VuZHMgPSA0MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKQEAgLTk1LDkgKzk1LDkgQEAKIAogY2xhc3MgU2Vjb25kU3VibW9kdWxlSW1wb3J0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDUKLSAgICByb3VuZHMgPSAyMDAwMAorICAgIHJvdW5kcyA9IDQwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9JbnN0YW5jZXMucHkgYi9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weQppbmRleCA5YjE5MjlkLi4xZGZjODJmIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weQorKysgYi9Ub29scy9weWJlbmNoL0luc3RhbmNlcy5weQpAQCAtMiw5ICsyLDkgQEAKIAogY2xhc3MgQ3JlYXRlSW5zdGFuY2VzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMgorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMyArIDcgKyA0Ci0gICAgcm91bmRzID0gNjAwMDAKKyAgICByb3VuZHMgPSA4MDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkgYi9Ub29scy9weWJlbmNoL0xpc3RzLnB5CmluZGV4IDRjMThlOTkuLjY3NzYwZGIgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvTGlzdHMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9MaXN0cy5weQpAQCAtMiwyMiArMiwyMyBAQAogCiBjbGFzcyBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSogKDYgKyA2ICsgNikKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDEzMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CiAKICAgICAgICAgbCA9IFtdCisgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQogCiAgICAgICAgICAgICBsWzBdID0gMwogICAgICAgICAgICAgbFsxXSA9IDQKQEAgLTMzLDEyICszNCwxMiBAQAogICAgICAgICAgICAgeCA9IGxbNF0KICAgICAgICAgICAgIHggPSBsWzVdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC01NCwxMiArNTUsMTIgQEAKICAgICAgICAgICAgIHggPSBsWzRdCiAgICAgICAgICAgICB4ID0gbFs1XQogCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCi0gICAgICAgICAgICBsLmFwcGVuZCgyKQotICAgICAgICAgICAgbC5hcHBlbmQoMykKLSAgICAgICAgICAgIGwuYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtNzUsMTIgKzc2LDEyIEBACiAgICAgICAgICAgICB4ID0gbFs0XQogICAgICAgICAgICAgeCA9IGxbNV0KIAotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQotICAgICAgICAgICAgbC5hcHBlbmQoMikKLSAgICAgICAgICAgIGwuYXBwZW5kKDMpCi0gICAgICAgICAgICBsLmFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQorICAgICAgICAgICAgYXBwZW5kKDIpCisgICAgICAgICAgICBhcHBlbmQoMykKKyAgICAgICAgICAgIGFwcGVuZCg0KQogCiAgICAgICAgICAgICBsWzBdID0gMwogICAgICAgICAgICAgbFsxXSA9IDQKQEAgLTk2LDEyICs5NywxMiBAQAogICAgICAgICAgICAgeCA9IGxbNF0KICAgICAgICAgICAgIHggPSBsWzVdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCgyKQorICAgICAgICAgICAgYXBwZW5kKDMpCisgICAgICAgICAgICBhcHBlbmQoNCkKIAogICAgICAgICAgICAgbFswXSA9IDMKICAgICAgICAgICAgIGxbMV0gPSA0CkBAIC0xMjQsMTUgKzEyNSwxNiBAQAogICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CiAKICAgICAgICAgbCA9IFtdCisgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKICAgICAgICAgICAgIHBhc3MKIAogY2xhc3MgTGlzdFNsaWNpbmcoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC40CisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAyNSooMysxKzIrMSkKLSAgICByb3VuZHMgPSA0MDAKKyAgICByb3VuZHMgPSA4MDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0xNDEsNyArMTQzLDcgQEAKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgogCi0gICAgICAgICAgICBsID0gcmFuZ2UoMTAwKQorICAgICAgICAgICAgbCA9IG5bOl0KIAogICAgICAgICAgICAgZm9yIGogaW4gcjoKIApAQCAtMTU5LDE3ICsxNjEsMTQgQEAKICAgICAgICAgciA9IHJhbmdlKDI1KQogCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShzZWxmLnJvdW5kcyk6Ci0KLSAgICAgICAgICAgIGwgPSByYW5nZSgxMDApCi0KICAgICAgICAgICAgIGZvciBqIGluIHI6CiAgICAgICAgICAgICAgICAgcGFzcwogCiBjbGFzcyBTbWFsbExpc3RzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMSsgNiArIDYgKyAzICsgMSkKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDgwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMTc3LDEyICsxNzYsMTMgQEAKIAogICAgICAgICAgICAgbCA9IFtdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMTk5LDEyICsxOTksMTMgQEAKIAogICAgICAgICAgICAgbCA9IFtdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMjIxLDEyICsyMjIsMTMgQEAKIAogICAgICAgICAgICAgbCA9IFtdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMjQzLDEyICsyNDUsMTMgQEAKIAogICAgICAgICAgICAgbCA9IFtdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMjY1LDEyICsyNjgsMTMgQEAKIAogICAgICAgICAgICAgbCA9IFtdCiAKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKLSAgICAgICAgICAgIGwuYXBwZW5kKDIpCi0gICAgICAgICAgICBsLmFwcGVuZCgzKQotICAgICAgICAgICAgbC5hcHBlbmQoNCkKKyAgICAgICAgICAgIGFwcGVuZCA9IGwuYXBwZW5kCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCisgICAgICAgICAgICBhcHBlbmQoMikKKyAgICAgICAgICAgIGFwcGVuZCgzKQorICAgICAgICAgICAgYXBwZW5kKDQpCiAKICAgICAgICAgICAgIGxbMF0gPSAzCiAgICAgICAgICAgICBsWzFdID0gNApAQCAtMjg4LDQgKzI5Miw0IEBACiAgICAgZGVmIGNhbGlicmF0ZShzZWxmKToKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgotICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICBwYXNzCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL0xvb2t1cHMucHkgYi9Ub29scy9weWJlbmNoL0xvb2t1cHMucHkKaW5kZXggZTU1MjljZC4uZjIwZTdkYSAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Mb29rdXBzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvTG9va3Vwcy5weQpAQCAtMiw3ICsyLDcgQEAKIAogY2xhc3MgU3BlY2lhbENsYXNzQXR0cmlidXRlKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKICAgICByb3VuZHMgPSAxMDAwMDAKIApAQCAtMTgzLDcgKzE4Myw3IEBACiAKIGNsYXNzIE5vcm1hbENsYXNzQXR0cmlidXRlKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMTIgKyAxMikKICAgICByb3VuZHMgPSAxMDAwMDAKIApAQCAtMzY5LDcgKzM2OSw3IEBACiAKIGNsYXNzIFNwZWNpYWxJbnN0YW5jZUF0dHJpYnV0ZShUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDEyICsgMTIpCiAgICAgcm91bmRzID0gMTAwMDAwCiAKQEAgLTU1Nyw3ICs1NTcsNyBAQAogCiBjbGFzcyBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZShUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUqKDEyICsgMTIpCiAgICAgcm91bmRzID0gMTAwMDAwCiAKQEAgLTc0NSw3ICs3NDUsNyBAQAogCiBjbGFzcyBCdWlsdGluTWV0aG9kTG9va3VwKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMworICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSooMyo1ICsgMyo1KQogICAgIHJvdW5kcyA9IDcwMDAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTmV3SW5zdGFuY2VzLnB5IGIvVG9vbHMvcHliZW5jaC9OZXdJbnN0YW5jZXMucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCBhMzUyNjM4Li4yNThiZWJhCi0tLSBhL1Rvb2xzL3B5YmVuY2gvTmV3SW5zdGFuY2VzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvTmV3SW5zdGFuY2VzLnB5CkBAIC0xLDggKzEsMTcgQEAKIGZyb20gcHliZW5jaCBpbXBvcnQgVGVzdAogCisjIENoZWNrIGZvciBuZXctc3R5bGUgY2xhc3Mgc3VwcG9ydDoKK3RyeToKKyAgICBjbGFzcyBjKG9iamVjdCk6CisgICAgICAgIHBhc3MKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICAgcmFpc2UgSW1wb3J0RXJyb3IKKworIyMjCisKIGNsYXNzIENyZWF0ZU5ld0luc3RhbmNlcyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMgKyA3ICsgNAogICAgIHJvdW5kcyA9IDYwMDAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weSBiL1Rvb2xzL3B5YmVuY2gvTnVtYmVycy5weQppbmRleCBhNmFlYTMzLi4xMGM4OTQwIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL051bWJlcnMucHkKKysrIGIvVG9vbHMvcHliZW5jaC9OdW1iZXJzLnB5CkBAIC0yLDcgKzIsNyBAQAogCiBjbGFzcyBDb21wYXJlSW50ZWdlcnMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzMCAqIDUKICAgICByb3VuZHMgPSAxMjAwMDAKIApAQCAtMTk4LDkgKzE5OCw5IEBACiAKIGNsYXNzIENvbXBhcmVGbG9hdHMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzMCAqIDUKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDgwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMzk0LDcgKzM5NCw3IEBACiAKIGNsYXNzIENvbXBhcmVGbG9hdHNJbnRlZ2VycyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDMwICogNQogICAgIHJvdW5kcyA9IDYwMDAwCiAKQEAgLTU5MCw5ICs1OTAsOSBAQAogCiBjbGFzcyBDb21wYXJlTG9uZ3MoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzMCAqIDUKLSAgICByb3VuZHMgPSA2MDAwMAorICAgIHJvdW5kcyA9IDcwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9SRUFETUUgYi9Ub29scy9weWJlbmNoL1JFQURNRQppbmRleCA5NWFlMzkyLi4wMjJjOGRlIDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL1JFQURNRQorKysgYi9Ub29scy9weWJlbmNoL1JFQURNRQpAQCAtMjgsMTIgKzI4LDM3IEBACiBNaWNyby1NYW51YWwKIC0tLS0tLS0tLS0tLQogCi1SdW4gJ3B5YmVuY2gucHkgLWgnIHRvIHNlZSB0aGUgaGVscCBzY3JlZW4uCi1SdW4gJ3B5YmVuY2gucHknIHRvIGp1c3QgbGV0IHRoZSBiZW5jaG1hcmsgc3VpdGUgZG8gaXQncyB0aGluZyBhbmQKLSdweWJlbmNoLnB5IC1mIDxmaWxlPicgdG8gaGF2ZSBpdCBzdG9yZSB0aGUgcmVzdWx0cyBpbiBhIGZpbGUgdG9vLgorUnVuICdweWJlbmNoLnB5IC1oJyB0byBzZWUgdGhlIGhlbHAgc2NyZWVuLiAgUnVuICdweWJlbmNoLnB5JyB0byBydW4KK3RoZSBiZW5jaG1hcmsgc3VpdGUgdXNpbmcgZGVmYXVsdCBzZXR0aW5ncyBhbmQgJ3B5YmVuY2gucHkgLWYgPGZpbGU+JwordG8gaGF2ZSBpdCBzdG9yZSB0aGUgcmVzdWx0cyBpbiBhIGZpbGUgdG9vLgorCitJdCBpcyB1c3VhbGx5IGEgZ29vZCBpZGVhIHRvIHJ1biBweWJlbmNoLnB5IG11bHRpcGxlIHRpbWVzIHRvIHNlZQord2hldGhlciB0aGUgZW52aXJvbm1lbnQsIHRpbWVycyBhbmQgYmVuY2htYXJrIHJ1bi10aW1lcyBhcmUgc3VpdGFibGUKK2ZvciBkb2luZyBiZW5jaG1hcmsgdGVzdHMuIAorCitZb3UgY2FuIHVzZSB0aGUgY29tcGFyaXNvbiBmZWF0dXJlIG9mIHB5YmVuY2gucHkgKCdweWJlbmNoLnB5IC1jCis8ZmlsZT4nKSB0byBjaGVjayBob3cgd2VsbCB0aGUgc3lzdGVtIGJlaGF2ZXMgaW4gY29tcGFyaXNvbiB0byBhCityZWZlcmVuY2UgcnVuLiAKKworSWYgdGhlIGRpZmZlcmVuY2VzIGFyZSB3ZWxsIGJlbG93IDEwJSBmb3IgZWFjaCB0ZXN0LCB0aGVuIHlvdSBoYXZlIGEKK3N5c3RlbSB0aGF0IGlzIGdvb2QgZm9yIGRvaW5nIGJlbmNobWFyayB0ZXN0aW5ncy4gIE9mIHlvdSBnZXQgcmFuZG9tCitkaWZmZXJlbmNlcyBvZiBtb3JlIHRoYW4gMTAlIG9yIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlCit2YWx1ZXMgZm9yIG1pbmltdW0gYW5kIGF2ZXJhZ2UgdGltZSwgdGhlbiB5b3UgbGlrZWx5IGhhdmUgc29tZQorYmFja2dyb3VuZCBwcm9jZXNzZXMgcnVubmluZyB3aGljaCBjYXVzZSB0aGUgcmVhZGluZ3MgdG8gYmVjb21lCitpbmNvbnNpc3RlbnQuIEV4YW1wbGVzIGluY2x1ZGU6IHdlYi1icm93c2VycywgZW1haWwgY2xpZW50cywgUlNTCityZWFkZXJzLCBtdXNpYyBwbGF5ZXJzLCBiYWNrdXAgcHJvZ3JhbXMsIGV0Yy4KKworSWYgeW91IGFyZSBvbmx5IGludGVyZXN0ZWQgaW4gYSBmZXcgdGVzdHMgb2YgdGhlIHdob2xlIHN1aXRlLCB5b3UgY2FuCit1c2UgdGhlIGZpbHRlcmluZyBvcHRpb24sIGUuZy4gJ3B5YmVuY2gucHkgLXQgc3RyaW5nJyB3aWxsIG9ubHkKK3J1bi9zaG93IHRoZSB0ZXN0cyB0aGF0IGhhdmUgJ3N0cmluZycgaW4gdGhlaXIgbmFtZS4KIAogVGhpcyBpcyB0aGUgY3VycmVudCBvdXRwdXQgb2YgcHliZW5jaC5weSAtLWhlbHA6CiAKKyIiIgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQWUJFTkNIIC0gYSBiZW5jaG1hcmsgdGVzdCBzdWl0ZSBmb3IgUHl0aG9uIGludGVycHJldGVycy9jb21waWxlcnMuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogU3lub3BzaXM6CiAgcHliZW5jaC5weSBbb3B0aW9uXSBmaWxlcy4uLgogCkBAIC00MiwxNCArNjcsMTQgQEAKICAgLWYgYXJnICAgICAgICAgICBzYXZlIGJlbmNobWFyayB0byBmaWxlIGFyZyAoKQogICAtYyBhcmcgICAgICAgICAgIGNvbXBhcmUgYmVuY2htYXJrIHdpdGggdGhlIG9uZSBpbiBmaWxlIGFyZyAoKQogICAtcyBhcmcgICAgICAgICAgIHNob3cgYmVuY2htYXJrIGluIGZpbGUgYXJnLCB0aGVuIGV4aXQgKCkKLSAgLVMgICAgICAgICAgICAgICBzaG93IHN0YXRpc3RpY3Mgb2YgYmVuY2htYXJrcyAoMCkKLSAgLXcgYXJnICAgICAgICAgICBzZXQgd2FycCBmYWN0b3IgdG8gYXJnICgyMCkKLSAgLWQgICAgICAgICAgICAgICBoaWRlIG5vaXNlIGluIGNvbXBhcmVzICgwKQotICAtLW5vLWdjICAgICAgICAgIGRpc2FibGUgZ2FyYmFnZSBjb2xsZWN0aW9uICgwKQotICAtLW5vLXN5c2NoZWNrICAgICJkaXNhYmxlIiBzeXMgY2hlY2sgaW50ZXJ2YWwgKHNldCB0byBzeXMubWF4aW50KSAoMCkKLSAgLXQgYXJnICAgICAgICAgICB0ZXN0cyBjb250YWluaW5nIHN1YnN0cmluZyAoKQotICAtQyBhcmcgICAgICAgICAgIG51bWJlciBvZiBjYWxpYnJhdGlvbiBydW5zICgyMCkKLSAgLXYgICAgICAgICAgICAgICBnZW5lcmF0ZSB2ZXJib3NlIG91dHB1dAorICAtdyBhcmcgICAgICAgICAgIHNldCB3YXJwIGZhY3RvciB0byBhcmcgKDEwKQorICAtdCBhcmcgICAgICAgICAgIHJ1biBvbmx5IHRlc3RzIHdpdGggbmFtZXMgbWF0Y2hpbmcgYXJnICgpCisgIC1DIGFyZyAgICAgICAgICAgc2V0IHRoZSBudW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucyB0byBhcmcgKDIwKQorICAtZCAgICAgICAgICAgICAgIGhpZGUgbm9pc2UgaW4gY29tcGFyaXNvbnMgKDApCisgIC12ICAgICAgICAgICAgICAgdmVyYm9zZSBvdXRwdXQgKG5vdCByZWNvbW1lbmRlZCkgKDApCisgIC0td2l0aC1nYyAgICAgICAgZW5hYmxlIGdhcmJhZ2UgY29sbGVjdGlvbiAoMCkKKyAgLS13aXRoLXN5c2NoZWNrICB1c2UgZGVmYXVsdCBzeXMgY2hlY2sgaW50ZXJ2YWwgKDApCisgIC0tdGltZXIgYXJnICAgICAgdXNlIGdpdmVuIHRpbWVyICh0aW1lLnRpbWUpCiAgIC1oICAgICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAgdGV4dAogICAtLWhlbHAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwIHRleHQKICAgLS1kZWJ1ZyAgICAgICAgICBlbmFibGUgZGVidWdnaW5nCkBAIC01NywxNyArODIsMjMgQEAKICAgLS1leGFtcGxlcyAgICAgICBzaG93IGV4YW1wbGVzIG9mIHVzYWdlCiAKIFZlcnNpb246Ci0gMS4zCisgMi4wCiAKIFRoZSBub3JtYWwgb3BlcmF0aW9uIGlzIHRvIHJ1biB0aGUgc3VpdGUgYW5kIGRpc3BsYXkgdGhlCi1yZXN1bHRzLiBVc2UgLWYgdG8gc2F2ZSB0aGVtIGZvciBsYXRlciByZXVzZSBvciBjb21wYXJpc21zLgorcmVzdWx0cy4gVXNlIC1mIHRvIHNhdmUgdGhlbSBmb3IgbGF0ZXIgcmV1c2Ugb3IgY29tcGFyaXNvbnMuCisKK0F2YWlsYWJsZSB0aW1lcnM6CisKKyAgIHRpbWUudGltZQorICAgdGltZS5jbG9jaworICAgc3lzdGltZXMucHJvY2Vzc3RpbWUKIAogRXhhbXBsZXM6CiAKLXB5dGhvbjEuNSBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTUKLXB5dGhvbjEuNCBweWJlbmNoLnB5IC13IDEwMCAtZiBwMTQKLXB5dGhvbiBweWJlbmNoLnB5IC1zIHAxNSAtYyBwMTQKLQorcHl0aG9uMi4xIHB5YmVuY2gucHkgLWYgcDIxLnB5YmVuY2gKK3B5dGhvbjIuNSBweWJlbmNoLnB5IC1mIHAyNS5weWJlbmNoCitweXRob24gcHliZW5jaC5weSAtcyBwMjUucHliZW5jaCAtYyBwMjEucHliZW5jaAorIiIiCiAKIExpY2Vuc2UKIC0tLS0tLS0KQEAgLTc4LDE4NCArMTA5LDEwMyBAQAogU2FtcGxlIG91dHB1dAogLS0tLS0tLS0tLS0tLQogCi1QWUJFTkNIIDEuMworIiIiCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitQWUJFTkNIIDIuMAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKiB1c2luZyBQeXRob24gMi40LjIKKyogZGlzYWJsZWQgZ2FyYmFnZSBjb2xsZWN0aW9uCisqIHN5c3RlbSBjaGVjayBpbnRlcnZhbCBzZXQgdG8gbWF4aW11bTogMjE0NzQ4MzY0NworKiB1c2luZyB0aW1lcjogdGltZS50aW1lCiAKLU1hY2hpbmUgRGV0YWlsczoKLSAgIFBsYXRmb3JtIElEOiAgTGludXgtMi42LjgtMjQuMTktZGVmYXVsdC14ODZfNjQtd2l0aC1TdVNFLTkuMi14ODYtNjQKLSAgIEV4ZWN1dGFibGU6ICAgL2hvbWUvbGVtYnVyZy9wcm9qZWN0cy9QeXRob24vSW5zdGFsbGF0aW9uL2Jpbi9weXRob24KLSAgIFB5dGhvbjogICAgICAgMi41YTEuMAotICAgQ29tcGlsZXI6ICAgICBHQ0MgMy4zLjQgKHByZSAzLjMuNSAyMDA0MDgwOSkKLSAgIEJ1aWxkOiAgICAgICAgQXByICA5IDIwMDYgMDE6NTA6NTcgKCN0cnVuaykKK0NhbGlicmF0aW5nIHRlc3RzLiBQbGVhc2Ugd2FpdC4uLgogCi1TZWFyY2hpbmcgZm9yIHRlc3RzLi4uCi0gICBCdWlsdGluRnVuY3Rpb25DYWxscwotICAgQnVpbHRpbk1ldGhvZExvb2t1cAotICAgQ29tcGFyZUZsb2F0cwotICAgQ29tcGFyZUZsb2F0c0ludGVnZXJzCi0gICBDb21wYXJlSW50ZWdlcnMKLSAgIENvbXBhcmVJbnRlcm5lZFN0cmluZ3MKLSAgIENvbXBhcmVMb25ncwotICAgQ29tcGFyZVN0cmluZ3MKLSAgIENvbXBhcmVVbmljb2RlCi0gICBDb25jYXRTdHJpbmdzCi0gICBDb25jYXRVbmljb2RlCi0gICBDcmVhdGVJbnN0YW5jZXMKLSAgIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0Ci0gICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdAotICAgRGljdENyZWF0aW9uCi0gICBEaWN0V2l0aEZsb2F0S2V5cwotICAgRGljdFdpdGhJbnRlZ2VyS2V5cwotICAgRGljdFdpdGhTdHJpbmdLZXlzCi0gICBGb3JMb29wcwotICAgSWZUaGVuRWxzZQotICAgTGlzdFNsaWNpbmcKLSAgIE5lc3RlZEZvckxvb3BzCi0gICBOb3JtYWxDbGFzc0F0dHJpYnV0ZQotICAgTm9ybWFsSW5zdGFuY2VBdHRyaWJ1dGUKLSAgIFB5dGhvbkZ1bmN0aW9uQ2FsbHMKLSAgIFB5dGhvbk1ldGhvZENhbGxzCi0gICBSZWN1cnNpb24KLSAgIFNlY29uZEltcG9ydAotICAgU2Vjb25kUGFja2FnZUltcG9ydAotICAgU2Vjb25kU3VibW9kdWxlSW1wb3J0Ci0gICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYwotICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbgotICAgU2ltcGxlRmxvYXRBcml0aG1ldGljCi0gICBTaW1wbGVJbnRGbG9hdEFyaXRobWV0aWMKLSAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljCi0gICBTaW1wbGVMaXN0TWFuaXB1bGF0aW9uCi0gICBTaW1wbGVMb25nQXJpdGhtZXRpYwotICAgU21hbGxMaXN0cwotICAgU21hbGxUdXBsZXMKLSAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZQotICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlCi0gICBTdHJpbmdNYXBwaW5ncwotICAgU3RyaW5nUHJlZGljYXRlcwotICAgU3RyaW5nU2xpY2luZwotICAgVHJ5RXhjZXB0Ci0gICBUcnlSYWlzZUV4Y2VwdAotICAgVHVwbGVTbGljaW5nCi0gICBVbmljb2RlTWFwcGluZ3MKLSAgIFVuaWNvZGVQcmVkaWNhdGVzCi0gICBVbmljb2RlUHJvcGVydGllcwotICAgVW5pY29kZVNsaWNpbmcKK1J1bm5pbmcgMTAgcm91bmQocykgb2YgdGhlIHN1aXRlIGF0IHdhcnAgZmFjdG9yIDEwOgogCi1SdW5uaW5nIDEwIHJvdW5kKHMpIG9mIHRoZSBzdWl0ZToKLQorKiBSb3VuZCAxIGRvbmUgaW4gNi4zODggc2Vjb25kcy4KKyogUm91bmQgMiBkb25lIGluIDYuNDg1IHNlY29uZHMuCisqIFJvdW5kIDMgZG9uZSBpbiA2Ljc4NiBzZWNvbmRzLgogLi4uCisqIFJvdW5kIDEwIGRvbmUgaW4gNi41NDYgc2Vjb25kcy4KIAotIFJvdW5kIDEwICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWwgICBhYnMgICAgb3ZlcmhlYWQKLSAgICAgICAgICBCdWlsdGluRnVuY3Rpb25DYWxsczogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgICBCdWlsdGluTWV0aG9kTG9va3VwOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCi0gICAgICAgICAgICAgICAgIENvbXBhcmVGbG9hdHM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgIENvbXBhcmVGbG9hdHNJbnRlZ2VyczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgICAgICAgQ29tcGFyZUludGVnZXJzOiAgIDAuMDcwciAwLjA3MGEgMC4wMDBvCi0gICAgICAgIENvbXBhcmVJbnRlcm5lZFN0cmluZ3M6ICAgMC4wMzlyIDAuMDQwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICAgIENvbXBhcmVMb25nczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgICAgICAgIENvbXBhcmVTdHJpbmdzOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgQ29tcGFyZVVuaWNvZGU6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgQ29uY2F0U3RyaW5nczogICAwLjA0MHIgMC4wNDBhIDAuMDAwbwotICAgICAgICAgICAgICAgICBDb25jYXRVbmljb2RlOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICBDcmVhdGVJbnN0YW5jZXM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdDogICAwLjAyOXIgMC4wMzBhIDAuMDAxbwotICAgICAgIENyZWF0ZVVuaWNvZGVXaXRoQ29uY2F0OiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICBEaWN0Q3JlYXRpb246ICAgMC4wNDByIDAuMDQwYSAwLjAwMG8KLSAgICAgICAgICAgICBEaWN0V2l0aEZsb2F0S2V5czogICAwLjA4OXIgMC4wOTBhIDAuMDAwbwotICAgICAgICAgICBEaWN0V2l0aEludGVnZXJLZXlzOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCi0gICAgICAgICAgICBEaWN0V2l0aFN0cmluZ0tleXM6ICAgMC4wNzByIDAuMDcwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICAgICAgICBGb3JMb29wczogICAwLjA1MHIgMC4wNTBhIDAuMDAwbwotICAgICAgICAgICAgICAgICAgICBJZlRoZW5FbHNlOiAgIDAuMDcwciAwLjA3MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgTGlzdFNsaWNpbmc6ICAgMC4wMzByIDAuMDMwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICBOZXN0ZWRGb3JMb29wczogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgIE5vcm1hbENsYXNzQXR0cmlidXRlOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgTm9ybWFsSW5zdGFuY2VBdHRyaWJ1dGU6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgICAgUHl0aG9uRnVuY3Rpb25DYWxsczogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgICAgICAgIFB5dGhvbk1ldGhvZENhbGxzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgICBSZWN1cnNpb246ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgIFNlY29uZEltcG9ydDogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgICBTZWNvbmRQYWNrYWdlSW1wb3J0OiAgIDAuMDMwciAwLjAzMGEgMC4wMDBvCi0gICAgICAgICBTZWNvbmRTdWJtb2R1bGVJbXBvcnQ6ICAgMC4wNDByIDAuMDQwYSAwLjAwMG8KLSAgICAgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYzogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICBTaW1wbGVEaWN0TWFuaXB1bGF0aW9uOiAgIDAuMDQwciAwLjA0MGEgMC4wMDBvCi0gICAgICAgICBTaW1wbGVGbG9hdEFyaXRobWV0aWM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMW8KLSAgICAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYzogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgIFNpbXBsZUludGVnZXJBcml0aG1ldGljOiAgIDAuMDYwciAwLjA2MGEgMC4wMDBvCi0gICAgICAgIFNpbXBsZUxpc3RNYW5pcHVsYXRpb246ICAgMC4wMzByIDAuMDMwYSAwLjAwMG8KLSAgICAgICAgICBTaW1wbGVMb25nQXJpdGhtZXRpYzogICAwLjAzMHIgMC4wMzBhIDAuMDAwbwotICAgICAgICAgICAgICAgICAgICBTbWFsbExpc3RzOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgU21hbGxUdXBsZXM6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZTogICAwLjA2MHIgMC4wNjBhIDAuMDAwbwotICAgICAgU3BlY2lhbEluc3RhbmNlQXR0cmlidXRlOiAgIDAuMDc5ciAwLjA4MGEgMC4wMDFvCi0gICAgICAgICAgICAgICAgU3RyaW5nTWFwcGluZ3M6ICAgMC4wNjByIDAuMDYwYSAwLjAwMG8KLSAgICAgICAgICAgICAgU3RyaW5nUHJlZGljYXRlczogICAwLjA0OXIgMC4wNTBhIDAuMDAxbwotICAgICAgICAgICAgICAgICBTdHJpbmdTbGljaW5nOiAgIDAuMDM5ciAwLjA0MGEgMC4wMDBvCi0gICAgICAgICAgICAgICAgICAgICBUcnlFeGNlcHQ6ICAgMC4wNzlyIDAuMDgwYSAwLjAwMW8KLSAgICAgICAgICAgICAgICBUcnlSYWlzZUV4Y2VwdDogICAwLjA1OXIgMC4wNjBhIDAuMDAxbwotICAgICAgICAgICAgICAgICAgVHVwbGVTbGljaW5nOiAgIDAuMDUwciAwLjA1MGEgMC4wMDBvCi0gICAgICAgICAgICAgICBVbmljb2RlTWFwcGluZ3M6ICAgMC4wNzByIDAuMDcwYSAwLjAwMW8KLSAgICAgICAgICAgICBVbmljb2RlUHJlZGljYXRlczogICAwLjA1OXIgMC4wNjBhIDAuMDAxbwotICAgICAgICAgICAgIFVuaWNvZGVQcm9wZXJ0aWVzOiAgIDAuMDU5ciAwLjA2MGEgMC4wMDFvCi0gICAgICAgICAgICAgICAgVW5pY29kZVNsaWNpbmc6ICAgMC4wNTByIDAuMDUwYSAwLjAwMG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICAgIEF2ZXJhZ2Ugcm91bmQgdGltZTogICAgICAyLjkzNyBzZWNvbmRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitCZW5jaG1hcms6IDIwMDYtMDYtMTIgMTI6MDk6MjUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFJvdW5kczogMTAKKyAgICBXYXJwOiAgIDEwCisgICAgVGltZXI6ICB0aW1lLnRpbWUKKworICAgIE1hY2hpbmUgRGV0YWlsczoKKyAgICAgICBQbGF0Zm9ybSBJRDogIExpbnV4LTIuNi44LTI0LjE5LWRlZmF1bHQteDg2XzY0LXdpdGgtU3VTRS05LjIteDg2LTY0CisgICAgICAgUHJvY2Vzc29yOiAgICB4ODZfNjQKKworICAgIFB5dGhvbjoKKyAgICAgICBFeGVjdXRhYmxlOiAgIC91c3IvbG9jYWwvYmluL3B5dGhvbgorICAgICAgIFZlcnNpb246ICAgICAgMi40LjIKKyAgICAgICBDb21waWxlcjogICAgIEdDQyAzLjMuNCAocHJlIDMuMy41IDIwMDQwODA5KQorICAgICAgIEJpdHM6ICAgICAgICAgNjRiaXQKKyAgICAgICBCdWlsZDogICAgICAgIE9jdCAgMSAyMDA1IDE1OjI0OjM1ICgjMSkKKyAgICAgICBVbmljb2RlOiAgICAgIFVDUzIKIAogCi1UZXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXIgcnVuICAgIHBlciBvcGVyLiAgIG92ZXJoZWFkCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgICBCdWlsdGluRnVuY3Rpb25DYWxsczogICAgICAyOS44NSBtcyAgICAwLjIzIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgQnVpbHRpbk1ldGhvZExvb2t1cDogICAgICA2Ni44NSBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAgICA0My4wMCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKLSAgICAgICAgIENvbXBhcmVGbG9hdHNJbnRlZ2VyczogICAgICA1MS44MCBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgIENvbXBhcmVJbnRlZ2VyczogICAgICA3MC43MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKLSAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAgICA0MS40MCBtcyAgICAwLjA4IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgIENvbXBhcmVMb25nczogICAgICA0Ny45MCBtcyAgICAwLjExIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICBDb21wYXJlU3RyaW5nczogICAgICA1OC41MCBtcyAgICAwLjEyIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAgICA1Ni41NSBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgQ29uY2F0U3RyaW5nczogICAgICA0NC43NSBtcyAgICAwLjMwIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgQ29uY2F0VW5pY29kZTogICAgICA1NC41NSBtcyAgICAwLjM2IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAgICA1MC45NSBtcyAgICAxLjIxIHVzICAgIDAuMDAgbXMKLSAgICAgICBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdDogICAgICAyOC44NSBtcyAgICAwLjE0IHVzICAgIDAuNTAgbXMKLSAgICAgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdDogICAgICA1My43NSBtcyAgICAwLjI3IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAgICA0MS45MCBtcyAgICAwLjI4IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICBEaWN0V2l0aEZsb2F0S2V5czogICAgICA4OC41MCBtcyAgICAwLjE1IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgRGljdFdpdGhJbnRlZ2VyS2V5czogICAgICA2Mi41NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAgICA2MC41MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgICAgICBGb3JMb29wczogICAgICA0Ni45MCBtcyAgICA0LjY5IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgICAgSWZUaGVuRWxzZTogICAgICA2MC41NSBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAgICAyOS45MCBtcyAgICA4LjU0IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICBOZXN0ZWRGb3JMb29wczogICAgICAzMy45NSBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2Mi43NSBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKLSAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA2MS44MCBtcyAgICAwLjEwIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgUHl0aG9uRnVuY3Rpb25DYWxsczogICAgICA2MC4wMCBtcyAgICAwLjM2IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICBQeXRob25NZXRob2RDYWxsczogICAgICA1MC4wMCBtcyAgICAwLjY3IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAgICA0Ni44NSBtcyAgICAzLjc1IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgIFNlY29uZEltcG9ydDogICAgICAzNS4wMCBtcyAgICAxLjQwIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgU2Vjb25kUGFja2FnZUltcG9ydDogICAgICAzMi4wMCBtcyAgICAxLjI4IHVzICAgIDAuMDAgbXMKLSAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAgICAzOC4wMCBtcyAgICAxLjUyIHVzICAgIDAuMDAgbXMKLSAgICAgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYzogICAgICAyNi44NSBtcyAgICAwLjEyIHVzICAgIDAuMDAgbXMKLSAgICAgICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbjogICAgICA0MC44NSBtcyAgICAwLjE0IHVzICAgIDAuMDAgbXMKLSAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAgICA0OC43MCBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKLSAgICAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYzogICAgICA1Ny43MCBtcyAgICAwLjA5IHVzICAgIDAuMDAgbXMKLSAgICAgICBTaW1wbGVJbnRlZ2VyQXJpdGhtZXRpYzogICAgICA1OC43NSBtcyAgICAwLjA5IHVzICAgIDAuNTAgbXMKLSAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAgICAzNC44MCBtcyAgICAwLjEzIHVzICAgIDAuMDAgbXMKLSAgICAgICAgICBTaW1wbGVMb25nQXJpdGhtZXRpYzogICAgICAzMC45NSBtcyAgICAwLjE5IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgICAgU21hbGxMaXN0czogICAgICA0Ny42MCBtcyAgICAwLjE5IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAgICA0OC44MCBtcyAgICAwLjIwIHVzICAgIDAuNTAgbXMKLSAgICAgICAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZTogICAgICA2MS43MCBtcyAgICAwLjEwIHVzICAgIDAuMDAgbXMKLSAgICAgIFNwZWNpYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgICA3Ni43MCBtcyAgICAwLjEzIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAgICA1OC43MCBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgU3RyaW5nUHJlZGljYXRlczogICAgICA1MC4wMCBtcyAgICAwLjE4IHVzICAgIDEuMDAgbXMKLSAgICAgICAgICAgICAgICAgU3RyaW5nU2xpY2luZzogICAgICAzOS42NSBtcyAgICAwLjIzIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAgICA4NC40NSBtcyAgICAwLjA2IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICBUcnlSYWlzZUV4Y2VwdDogICAgICA2MS43NSBtcyAgICA0LjEyIHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICAgICAgIFR1cGxlU2xpY2luZzogICAgICA0OC45NSBtcyAgICAwLjQ3IHVzICAgIDAuMDAgbXMKLSAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAgICA3MS41MCBtcyAgICAzLjk3IHVzICAgIDAuNTAgbXMKLSAgICAgICAgICAgICBVbmljb2RlUHJlZGljYXRlczogICAgICA1Mi43NSBtcyAgICAwLjIzIHVzICAgIDEuMDAgbXMKLSAgICAgICAgICAgICBVbmljb2RlUHJvcGVydGllczogICAgICA2MS45MCBtcyAgICAwLjMxIHVzICAgIDEuMDAgbXMKLSAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAgICA1My43NSBtcyAgICAwLjMxIHVzICAgIDAuNTAgbXMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgQXZlcmFnZSByb3VuZCB0aW1lOiAgICAyOTM3LjAwIG1zCi0KK1Rlc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbmltdW0gIGF2ZXJhZ2UgIG9wZXJhdGlvbiAgb3ZlcmhlYWQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICBCdWlsdGluRnVuY3Rpb25DYWxsczogICAgMTI2bXMgICAgMTQ1bXMgICAgMC4yOHVzICAgIDAuMjc0bXMKKyAgICAgICAgICAgQnVpbHRpbk1ldGhvZExvb2t1cDogICAgMTI0bXMgICAgMTMwbXMgICAgMC4xMnVzICAgIDAuMzE2bXMKKyAgICAgICAgICAgICAgICAgQ29tcGFyZUZsb2F0czogICAgMTA5bXMgICAgMTEwbXMgICAgMC4wOXVzICAgIDAuMzYxbXMKKyAgICAgICAgIENvbXBhcmVGbG9hdHNJbnRlZ2VyczogICAgMTAwbXMgICAgMTA0bXMgICAgMC4xMnVzICAgIDAuMjcxbXMKKyAgICAgICAgICAgICAgIENvbXBhcmVJbnRlZ2VyczogICAgMTM3bXMgICAgMTM4bXMgICAgMC4wOHVzICAgIDAuNTQybXMKKyAgICAgICAgQ29tcGFyZUludGVybmVkU3RyaW5nczogICAgMTI0bXMgICAgMTI3bXMgICAgMC4wOHVzICAgIDEuMzY3bXMKKyAgICAgICAgICAgICAgICAgIENvbXBhcmVMb25nczogICAgMTAwbXMgICAgMTA0bXMgICAgMC4xMHVzICAgIDAuMzE2bXMKKyAgICAgICAgICAgICAgICBDb21wYXJlU3RyaW5nczogICAgMTExbXMgICAgMTE1bXMgICAgMC4xMnVzICAgIDAuOTI5bXMKKyAgICAgICAgICAgICAgICBDb21wYXJlVW5pY29kZTogICAgMTA4bXMgICAgMTI4bXMgICAgMC4xN3VzICAgIDAuNjkzbXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0U3RyaW5nczogICAgMTQybXMgICAgMTU1bXMgICAgMC4zMXVzICAgIDAuNTYybXMKKyAgICAgICAgICAgICAgICAgQ29uY2F0VW5pY29kZTogICAgMTE5bXMgICAgMTI3bXMgICAgMC40MnVzICAgIDAuMzg0bXMKKyAgICAgICAgICAgICAgIENyZWF0ZUluc3RhbmNlczogICAgMTIzbXMgICAgMTI4bXMgICAgMS4xNHVzICAgIDAuMzY3bXMKKyAgICAgICAgICAgIENyZWF0ZU5ld0luc3RhbmNlczogICAgMTIxbXMgICAgMTI2bXMgICAgMS40OXVzICAgIDAuMzM1bXMKKyAgICAgICBDcmVhdGVTdHJpbmdzV2l0aENvbmNhdDogICAgMTMwbXMgICAgMTM1bXMgICAgMC4xNHVzICAgIDAuOTE2bXMKKyAgICAgICBDcmVhdGVVbmljb2RlV2l0aENvbmNhdDogICAgMTMwbXMgICAgMTM1bXMgICAgMC4zNHVzICAgIDAuMzYxbXMKKyAgICAgICAgICAgICAgICAgIERpY3RDcmVhdGlvbjogICAgMTA4bXMgICAgMTA5bXMgICAgMC4yN3VzICAgIDAuMzYxbXMKKyAgICAgICAgICAgICBEaWN0V2l0aEZsb2F0S2V5czogICAgMTQ5bXMgICAgMTUzbXMgICAgMC4xN3VzICAgIDAuNjc4bXMKKyAgICAgICAgICAgRGljdFdpdGhJbnRlZ2VyS2V5czogICAgMTI0bXMgICAgMTI2bXMgICAgMC4xMXVzICAgIDAuOTE1bXMKKyAgICAgICAgICAgIERpY3RXaXRoU3RyaW5nS2V5czogICAgMTE0bXMgICAgMTE3bXMgICAgMC4xMHVzICAgIDAuOTA1bXMKKyAgICAgICAgICAgICAgICAgICAgICBGb3JMb29wczogICAgMTEwbXMgICAgMTExbXMgICAgNC40NnVzICAgIDAuMDYzbXMKKyAgICAgICAgICAgICAgICAgICAgSWZUaGVuRWxzZTogICAgMTE4bXMgICAgMTE5bXMgICAgMC4wOXVzICAgIDAuNjg1bXMKKyAgICAgICAgICAgICAgICAgICBMaXN0U2xpY2luZzogICAgMTE2bXMgICAgMTIwbXMgICAgOC41OXVzICAgIDAuMTAzbXMKKyAgICAgICAgICAgICAgICBOZXN0ZWRGb3JMb29wczogICAgMTI1bXMgICAgMTM3bXMgICAgMC4wOXVzICAgIDAuMDE5bXMKKyAgICAgICAgICBOb3JtYWxDbGFzc0F0dHJpYnV0ZTogICAgMTI0bXMgICAgMTM2bXMgICAgMC4xMXVzICAgIDAuNDU3bXMKKyAgICAgICBOb3JtYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgMTEwbXMgICAgMTE3bXMgICAgMC4xMHVzICAgIDAuNDU0bXMKKyAgICAgICAgICAgUHl0aG9uRnVuY3Rpb25DYWxsczogICAgMTA3bXMgICAgMTEzbXMgICAgMC4zNHVzICAgIDAuMjcxbXMKKyAgICAgICAgICAgICBQeXRob25NZXRob2RDYWxsczogICAgMTQwbXMgICAgMTQ5bXMgICAgMC42NnVzICAgIDAuMTQxbXMKKyAgICAgICAgICAgICAgICAgICAgIFJlY3Vyc2lvbjogICAgMTU2bXMgICAgMTY2bXMgICAgMy4zMnVzICAgIDAuNDUybXMKKyAgICAgICAgICAgICAgICAgIFNlY29uZEltcG9ydDogICAgMTEybXMgICAgMTE4bXMgICAgMS4xOHVzICAgIDAuMTgwbXMKKyAgICAgICAgICAgU2Vjb25kUGFja2FnZUltcG9ydDogICAgMTE4bXMgICAgMTI3bXMgICAgMS4yN3VzICAgIDAuMTgwbXMKKyAgICAgICAgIFNlY29uZFN1Ym1vZHVsZUltcG9ydDogICAgMTQwbXMgICAgMTUxbXMgICAgMS41MXVzICAgIDAuMTgwbXMKKyAgICAgICBTaW1wbGVDb21wbGV4QXJpdGhtZXRpYzogICAgMTI4bXMgICAgMTM5bXMgICAgMC4xNnVzICAgIDAuMzYxbXMKKyAgICAgICAgU2ltcGxlRGljdE1hbmlwdWxhdGlvbjogICAgMTM0bXMgICAgMTM2bXMgICAgMC4xMXVzICAgIDAuNDUybXMKKyAgICAgICAgIFNpbXBsZUZsb2F0QXJpdGhtZXRpYzogICAgMTEwbXMgICAgMTEzbXMgICAgMC4wOXVzICAgIDAuNTcxbXMKKyAgICAgIFNpbXBsZUludEZsb2F0QXJpdGhtZXRpYzogICAgMTA2bXMgICAgMTExbXMgICAgMC4wOHVzICAgIDAuNTQ4bXMKKyAgICAgICBTaW1wbGVJbnRlZ2VyQXJpdGhtZXRpYzogICAgMTA2bXMgICAgMTA5bXMgICAgMC4wOHVzICAgIDAuNTQ0bXMKKyAgICAgICAgU2ltcGxlTGlzdE1hbmlwdWxhdGlvbjogICAgMTAzbXMgICAgMTEzbXMgICAgMC4xMHVzICAgIDAuNTg3bXMKKyAgICAgICAgICBTaW1wbGVMb25nQXJpdGhtZXRpYzogICAgMTEybXMgICAgMTE4bXMgICAgMC4xOHVzICAgIDAuMjcxbXMKKyAgICAgICAgICAgICAgICAgICAgU21hbGxMaXN0czogICAgMTA1bXMgICAgMTE2bXMgICAgMC4xN3VzICAgIDAuMzY2bXMKKyAgICAgICAgICAgICAgICAgICBTbWFsbFR1cGxlczogICAgMTA4bXMgICAgMTI4bXMgICAgMC4yNHVzICAgIDAuNDA2bXMKKyAgICAgICAgIFNwZWNpYWxDbGFzc0F0dHJpYnV0ZTogICAgMTE5bXMgICAgMTM2bXMgICAgMC4xMXVzICAgIDAuNDUzbXMKKyAgICAgIFNwZWNpYWxJbnN0YW5jZUF0dHJpYnV0ZTogICAgMTQzbXMgICAgMTU1bXMgICAgMC4xM3VzICAgIDAuNDU0bXMKKyAgICAgICAgICAgICAgICBTdHJpbmdNYXBwaW5nczogICAgMTE1bXMgICAgMTIxbXMgICAgMC40OHVzICAgIDAuNDA1bXMKKyAgICAgICAgICAgICAgU3RyaW5nUHJlZGljYXRlczogICAgMTIwbXMgICAgMTI5bXMgICAgMC4xOHVzICAgIDIuMDY0bXMKKyAgICAgICAgICAgICAgICAgU3RyaW5nU2xpY2luZzogICAgMTExbXMgICAgMTI3bXMgICAgMC4yM3VzICAgIDAuNzgxbXMKKyAgICAgICAgICAgICAgICAgICAgIFRyeUV4Y2VwdDogICAgMTI1bXMgICAgMTI2bXMgICAgMC4wNnVzICAgIDAuNjgxbXMKKyAgICAgICAgICAgICAgICBUcnlSYWlzZUV4Y2VwdDogICAgMTMzbXMgICAgMTM3bXMgICAgMi4xNHVzICAgIDAuMzYxbXMKKyAgICAgICAgICAgICAgICAgIFR1cGxlU2xpY2luZzogICAgMTE3bXMgICAgMTIwbXMgICAgMC40NnVzICAgIDAuMDY2bXMKKyAgICAgICAgICAgICAgIFVuaWNvZGVNYXBwaW5nczogICAgMTU2bXMgICAgMTYwbXMgICAgNC40NHVzICAgIDAuNDI5bXMKKyAgICAgICAgICAgICBVbmljb2RlUHJlZGljYXRlczogICAgMTE3bXMgICAgMTIxbXMgICAgMC4yMnVzICAgIDIuNDg3bXMKKyAgICAgICAgICAgICBVbmljb2RlUHJvcGVydGllczogICAgMTE1bXMgICAgMTUzbXMgICAgMC4zOHVzICAgIDIuMDcwbXMKKyAgICAgICAgICAgICAgICBVbmljb2RlU2xpY2luZzogICAgMTI2bXMgICAgMTI5bXMgICAgMC4yNnVzICAgIDAuNjg5bXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RvdGFsczogICAgICAgICAgICAgICAgICAgICAgICAgICA2MjgzbXMgICA2NjczbXMKKyIiIgogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCiAKIFdyaXRpbmcgTmV3IFRlc3RzCkBAIC0yOTMsNyArMjQzLDcgQEAKIAogICAgICMgTnVtYmVyIG9mIHJvdW5kcyB0byBleGVjdXRlIHBlciB0ZXN0IHJ1bi4gVGhpcyBzaG91bGQgYmUKICAgICAjIGFkanVzdGVkIHRvIGEgZmlndXJlIHRoYXQgcmVzdWx0cyBpbiBhIHRlc3QgcnVuLXRpbWUgb2YgYmV0d2VlbgotICAgICMgMjAtNTAgc2Vjb25kcy4KKyAgICAjIDEtMiBzZWNvbmRzIChhdCB3YXJwIDEpLgogICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgZGVmIHRlc3Qoc2VsZik6CkBAIC0zNzcsNiArMzI3LDQxIEBACiB2YXJpYWJsZSBzaG91bGQgYmUgdXBkYXRlZC4gVGhlcmVmYWZ0ZXIsIGNvbXBhcmlzb25zIHdpdGggcHJldmlvdXMKIHZlcnNpb25zIG9mIHRoZSB0ZXN0IHdpbGwgbGlzdCBhcyAibi9hIiB0byByZWZsZWN0IHRoZSBjaGFuZ2UuCiAKKworVmVyc2lvbiBIaXN0b3J5CistLS0tLS0tLS0tLS0tLS0KKworICAyLjA6IHJld3JvdGUgcGFydHMgb2YgcHliZW5jaCB3aGljaCByZXN1bHRlZCBpbiBtb3JlIHJlcGVhdGFibGUKKyAgICAgICB0aW1pbmdzOgorICAgICAgICAtIG1hZGUgdGltZXIgYSBwYXJhbWV0ZXIKKyAgICAgICAgLSBjaGFuZ2VkIHRoZSBwbGF0Zm9ybSBkZWZhdWx0IHRpbWVyIHRvIHVzZSBoaWdoLXJlc29sdXRpb24KKyAgICAgICAgICB0aW1lcnMgcmF0aGVyIHRoYW4gcHJvY2VzcyB0aW1lcnMgKHdoaWNoIGhhdmUgYSBtdWNoIGxvd2VyCisgICAgICAgICAgcmVzb2x1dGlvbikKKyAgICAgICAgLSBhZGRlZCBvcHRpb24gdG8gc2VsZWN0IHRpbWVyCisgICAgICAgIC0gYWRkZWQgcHJvY2VzcyB0aW1lIHRpbWVyICh1c2luZyBzeXN0aW1lcy5weSkKKyAgICAgICAgLSBjaGFuZ2VkIHRvIHVzZSBtaW4oKSBhcyB0aW1pbmcgZXN0aW1hdG9yIChhdmVyYWdlCisgICAgICAgICAgaXMgc3RpbGwgdGFrZW4gYXMgd2VsbCB0byBwcm92aWRlIGFuIGlkZWEgb2YgdGhlIGRpZmZlcmVuY2UpCisgICAgICAgIC0gZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIHR1cm5lZCBvZmYgcGVyIGRlZmF1bHQKKyAgICAgICAgLSBzeXMgY2hlY2sgaW50ZXJ2YWwgaXMgc2V0IHRvIHRoZSBoaWdoZXN0IHBvc3NpYmxlIHZhbHVlCisgICAgICAgIC0gY2FsaWJyYXRpb24gaXMgbm93IGEgc2VwYXJhdGUgc3RlcCBhbmQgZG9uZSB1c2luZworICAgICAgICAgIGEgZGlmZmVyZW50IHN0cmF0ZWd5IHRoYXQgYWxsb3dzIG1lYXN1cmluZyB0aGUgdGVzdAorICAgICAgICAgIG92ZXJoZWFkIG1vcmUgYWNjdXJhdGVseQorICAgICAgICAtIG1vZGlmaWVkIHRoZSB0ZXN0cyB0byBlYWNoIGdpdmUgYSBydW4tdGltZSBvZiBiZXR3ZWVuCisgICAgICAgICAgMTAwLTIwMG1zIHVzaW5nIHdhcnAgMTAKKyAgICAgICAgLSBjaGFuZ2VkIGRlZmF1bHQgd2FycCBmYWN0b3IgdG8gMTAgKGZyb20gMjApCisgICAgICAgIC0gY29tcGFyZWQgcmVzdWx0cyB3aXRoIHRpbWVpdC5weSBhbmQgY29uZmlybWVkIG1lYXN1cmVtZW50cworICAgICAgICAtIGJ1bXBlZCBhbGwgdGVzdCB2ZXJzaW9ucyB0byAyLjAKKyAgICAgICAgLSB1cGRhdGVkIHBsYXRmb3JtLnB5IHRvIHRoZSBsYXRlc3QgdmVyc2lvbgorICAgICAgICAtIGNoYW5nZWQgdGhlIG91dHB1dCBmb3JtYXQgYSBiaXQgdG8gbWFrZSBpdCBsb29rCisgICAgICAgICAgbmljZXIKKyAgICAgICAgLSByZWZhY3RvcmVkIHRoZSBBUElzIHNvbWV3aGF0CisgIDEuMys6IFN0ZXZlIEhvbGRlbiBhZGRlZCB0aGUgTmV3SW5zdGFuY2VzIHRlc3QgYW5kIHRoZSBmaWx0ZXJpbmcgCisgICAgICAgb3B0aW9uIGR1cmluZyB0aGUgTmVlZEZvclNwZWVkIHNwcmludDsgdGhpcyBhbHNvIHRyaWdnZXJlZCBhIGxvbmcgCisgICAgICAgZGlzY3Vzc2lvbiBvbiBob3cgdG8gaW1wcm92ZSBiZW5jaG1hcmsgdGltaW5nIGFuZCBmaW5hbGx5CisgICAgICAgcmVzdWx0ZWQgaW4gdGhlIHJlbGVhc2Ugb2YgMi4wCisgIDEuMzogaW5pdGlhbCBjaGVja2luIGludG8gdGhlIFB5dGhvbiBTVk4gcmVwb3NpdG9yeQorCisKIEhhdmUgZnVuLAogLS0KIE1hcmMtQW5kcmUgTGVtYnVyZwpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9TZXR1cC5weSBiL1Rvb2xzL3B5YmVuY2gvU2V0dXAucHkKaW5kZXggZjVjNTE5MC4uZjE0MTdlNiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9TZXR1cC5weQorKysgYi9Ub29scy9weWJlbmNoL1NldHVwLnB5CkBAIC0xNCw3ICsxNCw3IEBACiAKICMgRGVmYXVsdHMKIE51bWJlcl9vZl9yb3VuZHMgPSAxMAotV2FycF9mYWN0b3IgPSAyMAorV2FycF9mYWN0b3IgPSAxMAogCiAjIEltcG9ydCB0ZXN0cwogZnJvbSBBcml0aG1ldGljIGltcG9ydCAqCkBAIC0yNCw4ICsyNCw4IEBACiBmcm9tIEluc3RhbmNlcyBpbXBvcnQgKgogdHJ5OgogICAgIGZyb20gTmV3SW5zdGFuY2VzIGltcG9ydCAqCi1leGNlcHQ6Ci0gICAgcHJpbnQgIkNhbm5vdCB0ZXN0IG5ldy1zdHlsZSBvYmplY3RzIgorZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKIGZyb20gTGlzdHMgaW1wb3J0ICoKIGZyb20gVHVwbGVzIGltcG9ydCAqCiBmcm9tIERpY3QgaW1wb3J0ICoKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvU3RyaW5ncy5weSBiL1Rvb2xzL3B5YmVuY2gvU3RyaW5ncy5weQppbmRleCBiMDE4NDNhLi4zYmU4YjM1IDEwMDY0NAotLS0gYS9Ub29scy9weWJlbmNoL1N0cmluZ3MucHkKKysrIGIvVG9vbHMvcHliZW5jaC9TdHJpbmdzLnB5CkBAIC0zLDkgKzMsOSBAQAogCiBjbGFzcyBDb25jYXRTdHJpbmdzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1Ci0gICAgcm91bmRzID0gNjAwMDAKKyAgICByb3VuZHMgPSAxMDAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC04NSw3ICs4NSw3IEBACiAKIGNsYXNzIENvbXBhcmVTdHJpbmdzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMgorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1CiAgICAgcm91bmRzID0gMjAwMDAwCiAKQEAgLTE2Nyw5ICsxNjcsOSBAQAogCiBjbGFzcyBDb21wYXJlSW50ZXJuZWRTdHJpbmdzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1Ci0gICAgcm91bmRzID0gMjAwMDAwCisgICAgcm91bmRzID0gMzAwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMjQ5LDkgKzI0OSw5IEBACiAKIGNsYXNzIENyZWF0ZVN0cmluZ3NXaXRoQ29uY2F0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1Ci0gICAgcm91bmRzID0gODAwMDAKKyAgICByb3VuZHMgPSAyMDAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zMjQsOSArMzI0LDkgQEAKIAogY2xhc3MgU3RyaW5nU2xpY2luZyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiA3Ci0gICAgcm91bmRzID0gMTAwMDAwCisgICAgcm91bmRzID0gMTYwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtMzg3LDcgKzM4Nyw3IEBACiAKICAgICBjbGFzcyBTdHJpbmdNYXBwaW5ncyhUZXN0KToKIAotICAgICAgICB2ZXJzaW9uID0gMC4xCisgICAgICAgIHZlcnNpb24gPSAyLjAKICAgICAgICAgb3BlcmF0aW9ucyA9IDMgKiAoNSArIDQgKyAyICsgMSkKICAgICAgICAgcm91bmRzID0gNzAwMDAKIApAQCAtNDYwLDkgKzQ2MCw5IEBACiAKICAgICBjbGFzcyBTdHJpbmdQcmVkaWNhdGVzKFRlc3QpOgogCi0gICAgICAgIHZlcnNpb24gPSAwLjEKKyAgICAgICAgdmVyc2lvbiA9IDIuMAogICAgICAgICBvcGVyYXRpb25zID0gMTAgKiA3Ci0gICAgICAgIHJvdW5kcyA9IDgwMDAwCisgICAgICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1R1cGxlcy5weSBiL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5CmluZGV4IGU4NGVhNTMuLjhlNDY5ODkgMTAwNjQ0Ci0tLSBhL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvVHVwbGVzLnB5CkBAIC0yLDE4ICsyLDE3IEBACiAKIGNsYXNzIFR1cGxlU2xpY2luZyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjMxCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAzICogMjUgKiAxMCAqIDcKLSAgICByb3VuZHMgPSA0MDAKKyAgICByb3VuZHMgPSA1MDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCiAgICAgICAgIHIgPSByYW5nZSgyNSkKKyAgICAgICAgdCA9IHR1cGxlKHJhbmdlKDEwMCkpCiAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKHNlbGYucm91bmRzKToKIAotICAgICAgICAgICAgdCA9IHR1cGxlKHJhbmdlKDEwMCkpCi0KICAgICAgICAgICAgIGZvciBqIGluIHI6CiAKICAgICAgICAgICAgICAgICBtID0gdFs1MDpdCkBAIC0yNTksMjAgKzI1OCwxNyBAQAogICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CiAKICAgICAgICAgciA9IHJhbmdlKDI1KQorICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKIAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5yb3VuZHMpOgotCi0gICAgICAgICAgICB0ID0gdHVwbGUocmFuZ2UoMTAwKSkKLQogICAgICAgICAgICAgZm9yIGogaW4gcjoKLQogICAgICAgICAgICAgICAgIHBhc3MKIAogY2xhc3MgU21hbGxUdXBsZXMoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4zCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSA1KigxICsgMyArIDYgKyAyKQotICAgIHJvdW5kcyA9IDgwMDAwCisgICAgcm91bmRzID0gOTAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCmRpZmYgLS1naXQgYS9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkgYi9Ub29scy9weWJlbmNoL1VuaWNvZGUucHkKaW5kZXggMzY2ZjE3MS4uMTUzYTkxZSAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9Vbmljb2RlLnB5CisrKyBiL1Rvb2xzL3B5YmVuY2gvVW5pY29kZS5weQpAQCAtOCw3ICs4LDcgQEAKIAogY2xhc3MgQ29uY2F0VW5pY29kZShUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDEwICogNQogICAgIHJvdW5kcyA9IDYwMDAwCiAKQEAgLTkwLDcgKzkwLDcgQEAKIAogY2xhc3MgQ29tcGFyZVVuaWNvZGUoVGVzdCk6CiAKLSAgICB2ZXJzaW9uID0gMC4xCisgICAgdmVyc2lvbiA9IDIuMAogICAgIG9wZXJhdGlvbnMgPSAxMCAqIDUKICAgICByb3VuZHMgPSAxNTAwMDAKIApAQCAtMTcyLDcgKzE3Miw3IEBACiAKIGNsYXNzIENyZWF0ZVVuaWNvZGVXaXRoQ29uY2F0KFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMTAgKiA1CiAgICAgcm91bmRzID0gODAwMDAKIApAQCAtMjQ3LDkgKzI0Nyw5IEBACiAKIGNsYXNzIFVuaWNvZGVTbGljaW5nKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gNSAqIDcKLSAgICByb3VuZHMgPSAxMDAwMDAKKyAgICByb3VuZHMgPSAxNDAwMDAKIAogICAgIGRlZiB0ZXN0KHNlbGYpOgogCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogY2xhc3MgVW5pY29kZU1hcHBpbmdzKFRlc3QpOgogCi0gICAgdmVyc2lvbiA9IDAuMQorICAgIHZlcnNpb24gPSAyLjAKICAgICBvcGVyYXRpb25zID0gMyAqICg1ICsgNCArIDIgKyAxKQogICAgIHJvdW5kcyA9IDEwMDAwCiAKQEAgLTM4MSw5ICszODEsOSBAQAogCiBjbGFzcyBVbmljb2RlUHJlZGljYXRlcyhUZXN0KToKIAotICAgIHZlcnNpb24gPSAwLjEKKyAgICB2ZXJzaW9uID0gMi4wCiAgICAgb3BlcmF0aW9ucyA9IDUgKiA5Ci0gICAgcm91bmRzID0gMTAwMDAwCisgICAgcm91bmRzID0gMTIwMDAwCiAKICAgICBkZWYgdGVzdChzZWxmKToKIApAQCAtNDU4LDcgKzQ1OCw3IEBACiBlbHNlOgogICAgIGNsYXNzIFVuaWNvZGVQcm9wZXJ0aWVzKFRlc3QpOgogCi0gICAgICAgIHZlcnNpb24gPSAwLjEKKyAgICAgICAgdmVyc2lvbiA9IDIuMAogICAgICAgICBvcGVyYXRpb25zID0gNSAqIDgKICAgICAgICAgcm91bmRzID0gMTAwMDAwCiAKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvY2xvY2tyZXMucHkgYi9Ub29scy9weWJlbmNoL2Nsb2NrcmVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MDk1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9weWJlbmNoL2Nsb2NrcmVzLnB5CkBAIC0wLDAgKzEsNDMgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorCisiIiIgY2xvY2tyZXMgLSBjYWxjdWxhdGVzIHRoZSByZXNvbHV0aW9uIGluIHNlY29uZHMgb2YgYSBnaXZlbiB0aW1lci4KKworICAgIENvcHlyaWdodCAoYykgMjAwNiwgTWFyYy1BbmRyZSBMZW1idXJnIChtYWxAZWdlbml4LmNvbSkuIFNlZSB0aGUKKyAgICBkb2N1bWVudGF0aW9uIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uIG9uIGNvcHlyaWdodHMsIG9yIGNvbnRhY3QKKyAgICB0aGUgYXV0aG9yLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisiIiIKK2ltcG9ydCB0aW1lCisKK1RFU1RfVElNRSA9IDEuMAorCitkZWYgY2xvY2tyZXModGltZXIpOgorICAgIGQgPSB7fQorICAgIHdhbGxjbG9jayA9IHRpbWUudGltZQorICAgIHN0YXJ0ID0gd2FsbGNsb2NrKCkKKyAgICBzdG9wID0gd2FsbGNsb2NrKCkgKyBURVNUX1RJTUUKKyAgICBzcGluX2xvb3BzID0gcmFuZ2UoMTAwMCkKKyAgICB3aGlsZSAxOgorICAgICAgICBub3cgPSB3YWxsY2xvY2soKQorICAgICAgICBpZiBub3cgPj0gc3RvcDoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGZvciBpIGluIHNwaW5fbG9vcHM6CisgICAgICAgICAgICBkW3RpbWVyKCldID0gMQorICAgIHZhbHVlcyA9IGQua2V5cygpCisgICAgdmFsdWVzLnNvcnQoKQorICAgIG1pbl9kaWZmID0gVEVTVF9USU1FCisgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHZhbHVlcykgLSAxKToKKyAgICAgICAgZGlmZiA9IHZhbHVlc1tpKzFdIC0gdmFsdWVzW2ldCisgICAgICAgIGlmIGRpZmYgPCBtaW5fZGlmZjoKKyAgICAgICAgICAgIG1pbl9kaWZmID0gZGlmZgorICAgIHJldHVybiBtaW5fZGlmZgorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHByaW50ICdDbG9jayByZXNvbHV0aW9uIG9mIHZhcmlvdXMgdGltZXIgaW1wbGVtZW50YXRpb25zOicKKyAgICBwcmludCAndGltZS5jbG9jazogICAgICAgICAgICUxMC4zZnVzJyAlIChjbG9ja3Jlcyh0aW1lLmNsb2NrKSAqIDFlNikKKyAgICBwcmludCAndGltZS50aW1lOiAgICAgICAgICAgICUxMC4zZnVzJyAlIChjbG9ja3Jlcyh0aW1lLnRpbWUpICogMWU2KQorICAgIHRyeToKKyAgICAgICAgaW1wb3J0IHN5c3RpbWVzCisgICAgICAgIHByaW50ICdzeXN0aW1lcy5wcm9jZXNzdGltZTogJTEwLjNmdXMnICUgKGNsb2NrcmVzKHN5c3RpbWVzLnByb2Nlc3N0aW1lKSAqIDFlNikKKyAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgIHBhc3MKZGlmZiAtLWdpdCBhL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weSBiL1Rvb2xzL3B5YmVuY2gvcHliZW5jaC5weQppbmRleCBlMDExMGQwLi43ZDkwYmExIDEwMDc1NQotLS0gYS9Ub29scy9weWJlbmNoL3B5YmVuY2gucHkKKysrIGIvVG9vbHMvcHliZW5jaC9weWJlbmNoLnB5CkBAIC0zNCwyMCArMzQsNyBAQAogV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUgIQogIiIiCiAKLSMgVmVyc2lvbiBudW1iZXIKLV9fdmVyc2lvbl9fID0gJzEuMycKLQotIwotIyBOT1RFOiBVc2UgeHJhbmdlIGZvciBhbGwgdGVzdCBsb29wcyB1bmxlc3MgeW91IHdhbnQgdG8gZmFjZQotIyAgICAgICBhIDIwTUIgcHJvY2VzcyAhCi0jCi0jIEFsbCB0ZXN0cyBzaG91bGQgaGF2ZSByb3VuZHMgc2V0IHRvIHZhbHVlcyBzbyB0aGF0IGEgcnVuKCkKLSMgdGFrZXMgYmV0d2VlbiAyMC01MCBzZWNvbmRzLiBUaGlzIGlzIHRvIGdldCBmYWlybHkgZ29vZAotIyBjbG9jaygpIHZhbHVlcy4gWW91IGNhbiB1c2Ugb3B0aW9uIC13IHRvIHNwZWVkdXAgdGhlIHRlc3RzCi0jIGJ5IGEgZml4ZWQgaW50ZWdlciBmYWN0b3IgKHRoZSAid2FycCBmYWN0b3IiKS4KLSMKLQotaW1wb3J0IHN5cyx0aW1lLG9wZXJhdG9yCitpbXBvcnQgc3lzLCB0aW1lLCBvcGVyYXRvciwgc3RyaW5nCiBmcm9tIENvbW1hbmRMaW5lIGltcG9ydCAqCiAKIHRyeToKQEAgLTU2LDYgKzQzLDExMSBAQAogZXhjZXB0IEltcG9ydEVycm9yOgogICAgIGltcG9ydCBwaWNrbGUKIAorIyBWZXJzaW9uIG51bWJlcjsgdmVyc2lvbiBoaXN0b3J5OiBzZWUgUkVBRE1FIGZpbGUgIQorX192ZXJzaW9uX18gPSAnMi4wJworCisjIyMgQ29uc3RhbnRzCisKKyMgU2Vjb25kIGZyYWN0aW9ucworTUlMTElfU0VDT05EUyA9IDFlMworTUlDUk9fU0VDT05EUyA9IDFlNgorCisjIFBlcmNlbnQgdW5pdAorUEVSQ0VOVCA9IDEwMAorCisjIEhvcml6b250YWwgbGluZSBsZW5ndGgKK0xJTkUgPSA3OQorCisjIE1pbmltdW0gdGVzdCBydW4tdGltZQorTUlOX1RFU1RfUlVOVElNRSA9IDFlLTMKKworIyBOdW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucyB0byB1c2UgZm9yIGNhbGlicmF0aW5nIHRoZSB0ZXN0cworQ0FMSUJSQVRJT05fUlVOUyA9IDIwCisKKyMgTnVtYmVyIG9mIGNhbGlicmF0aW9uIGxvb3BzIHRvIHJ1biBmb3IgZWFjaCBjYWxpYnJhdGlvbiBydW4KK0NBTElCUkFUSU9OX0xPT1BTID0gMjAKKworIyBBbGxvdyBza2lwcGluZyBjYWxpYnJhdGlvbiA/CitBTExPV19TS0lQUElOR19DQUxJQlJBVElPTiA9IDEKKworIyBUaW1lciB0eXBlcworVElNRVJfVElNRV9USU1FID0gJ3RpbWUudGltZScKK1RJTUVSX1RJTUVfQ0xPQ0sgPSAndGltZS5jbG9jaycKK1RJTUVSX1NZU1RJTUVTX1BST0NFU1NUSU1FID0gJ3N5c3RpbWVzLnByb2Nlc3N0aW1lJworCisjIENob29zZSBwbGF0Zm9ybSBkZWZhdWx0IHRpbWVyCitpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgorICAgICMgT24gV2luWFAgdGhpcyBoYXMgMi41bXMgcmVzb2x1dGlvbgorICAgIFRJTUVSX1BMQVRGT1JNX0RFRkFVTFQgPSBUSU1FUl9USU1FX0NMT0NLCitlbHNlOgorICAgICMgT24gTGludXggdGhpcyBoYXMgMW1zIHJlc29sdXRpb24KKyAgICBUSU1FUl9QTEFURk9STV9ERUZBVUxUID0gVElNRVJfVElNRV9USU1FCisKKyMgUHJpbnQgZGVidWcgaW5mb3JtYXRpb24gPworX2RlYnVnID0gMAorCisjIyMgSGVscGVycworCitkZWYgZ2V0X3RpbWVyKHRpbWVydHlwZSk6CisKKyAgICBpZiB0aW1lcnR5cGUgPT0gVElNRVJfVElNRV9USU1FOgorICAgICAgICByZXR1cm4gdGltZS50aW1lCisgICAgZWxpZiB0aW1lcnR5cGUgPT0gVElNRVJfVElNRV9DTE9DSzoKKyAgICAgICAgcmV0dXJuIHRpbWUuY2xvY2sKKyAgICBlbGlmIHRpbWVydHlwZSA9PSBUSU1FUl9TWVNUSU1FU19QUk9DRVNTVElNRToKKyAgICAgICAgaW1wb3J0IHN5c3RpbWVzCisgICAgICAgIHJldHVybiBzeXN0aW1lcy5wcm9jZXNzdGltZQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigndW5rbm93biB0aW1lciB0eXBlOiAlcycgJSB0aW1lcnR5cGUpCisKK2RlZiBnZXRfbWFjaGluZV9kZXRhaWxzKCk6CisKKyAgICBpbXBvcnQgcGxhdGZvcm0KKyAgICBpZiBfZGVidWc6CisgICAgICAgIHByaW50ICdHZXR0aW5nIG1hY2hpbmUgZGV0YWlscy4uLicKKyAgICBidWlsZG5vLCBidWlsZGRhdGUgPSBwbGF0Zm9ybS5weXRob25fYnVpbGQoKQorICAgIHB5dGhvbiA9IHBsYXRmb3JtLnB5dGhvbl92ZXJzaW9uKCkKKyAgICBpZiBweXRob24gPiAnMi4wJzoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5pY2hyKDEwMDAwMCkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAjIFVDUzIgYnVpbGQgKHN0YW5kYXJkKQorICAgICAgICAgICAgdW5pY29kZSA9ICdVQ1MyJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBVQ1M0IGJ1aWxkIChtb3N0IHJlY2VudCBMaW51eCBkaXN0cm9zKQorICAgICAgICAgICAgdW5pY29kZSA9ICdVQ1M0JworICAgIGVsc2U6CisgICAgICAgIHVuaWNvZGUgPSBOb25lCisgICAgYml0cywgbGlua2FnZSA9IHBsYXRmb3JtLmFyY2hpdGVjdHVyZSgpCisgICAgcmV0dXJuIHsKKyAgICAgICAgJ3BsYXRmb3JtJzogcGxhdGZvcm0ucGxhdGZvcm0oKSwKKyAgICAgICAgJ3Byb2Nlc3Nvcic6IHBsYXRmb3JtLnByb2Nlc3NvcigpLAorICAgICAgICAnZXhlY3V0YWJsZSc6IHN5cy5leGVjdXRhYmxlLAorICAgICAgICAncHl0aG9uJzogcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKSwKKyAgICAgICAgJ2NvbXBpbGVyJzogcGxhdGZvcm0ucHl0aG9uX2NvbXBpbGVyKCksCisgICAgICAgICdidWlsZG5vJzogYnVpbGRubywKKyAgICAgICAgJ2J1aWxkZGF0ZSc6IGJ1aWxkZGF0ZSwKKyAgICAgICAgJ3VuaWNvZGUnOiB1bmljb2RlLAorICAgICAgICAnYml0cyc6IGJpdHMsCisgICAgICAgIH0KKworZGVmIHByaW50X21hY2hpbmVfZGV0YWlscyhkLCBpbmRlbnQ9JycpOgorCisgICAgbCA9IFsnTWFjaGluZSBEZXRhaWxzOicsCisgICAgICAgICAnICAgUGxhdGZvcm0gSUQ6ICAlcycgJSBkLmdldCgncGxhdGZvcm0nLCAnbi9hJyksCisgICAgICAgICAnICAgUHJvY2Vzc29yOiAgICAlcycgJSBkLmdldCgncHJvY2Vzc29yJywgJ24vYScpLAorICAgICAgICAgJycsCisgICAgICAgICAnUHl0aG9uOicsCisgICAgICAgICAnICAgRXhlY3V0YWJsZTogICAlcycgJSBkLmdldCgnZXhlY3V0YWJsZScsICduL2EnKSwKKyAgICAgICAgICcgICBWZXJzaW9uOiAgICAgICVzJyAlIGQuZ2V0KCdweXRob24nLCAnbi9hJyksCisgICAgICAgICAnICAgQ29tcGlsZXI6ICAgICAlcycgJSBkLmdldCgnY29tcGlsZXInLCAnbi9hJyksCisgICAgICAgICAnICAgQml0czogICAgICAgICAlcycgJSBkLmdldCgnYml0cycsICduL2EnKSwKKyAgICAgICAgICcgICBCdWlsZDogICAgICAgICVzICgjJXMpJyAlIChkLmdldCgnYnVpbGRkYXRlJywgJ24vYScpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQuZ2V0KCdidWlsZG5vJywgJ24vYScpKSwKKyAgICAgICAgICcgICBVbmljb2RlOiAgICAgICVzJyAlIGQuZ2V0KCd1bmljb2RlJywgJ24vYScpLAorICAgICAgICAgXQorICAgIHByaW50IGluZGVudCArIHN0cmluZy5qb2luKGwsICdcbicgKyBpbmRlbnQpICsgJ1xuJworCiAjIyMgVGVzdCBiYXNlY2xhc3MKIAogY2xhc3MgVGVzdDoKQEAgLTg0LDcgKzE3Niw3IEBACiAgICAgIyBWZXJzaW9uIG51bWJlciBvZiB0aGUgdGVzdCBhcyBmbG9hdCAoeC55eSk7IHRoaXMgaXMgaW1wb3J0YW50CiAgICAgIyBmb3IgY29tcGFyaXNvbnMgb2YgYmVuY2htYXJrIHJ1bnMgLSB0ZXN0cyB3aXRoIHVuZXF1YWwgdmVyc2lvbgogICAgICMgbnVtYmVyIHdpbGwgbm90IGdldCBjb21wYXJlZC4KLSAgICB2ZXJzaW9uID0gMS4wCisgICAgdmVyc2lvbiA9IDIuMAogCiAgICAgIyBUaGUgbnVtYmVyIG9mIGFic3RyYWN0IG9wZXJhdGlvbnMgZG9uZSBpbiBlYWNoIHJvdW5kIG9mIHRoZQogICAgICMgdGVzdC4gQW4gb3BlcmF0aW9uIGlzIHRoZSBiYXNpYyB1bml0IG9mIHdoYXQgeW91IHdhbnQgdG8KQEAgLTk3LDM2ICsxODksMTI1IEBACiAKICAgICAjIE51bWJlciBvZiByb3VuZHMgdG8gZXhlY3V0ZSBwZXIgdGVzdCBydW4uIFRoaXMgc2hvdWxkIGJlCiAgICAgIyBhZGp1c3RlZCB0byBhIGZpZ3VyZSB0aGF0IHJlc3VsdHMgaW4gYSB0ZXN0IHJ1bi10aW1lIG9mIGJldHdlZW4KLSAgICAjIDIwLTUwIHNlY29uZHMuCi0gICAgcm91bmRzID0gMTAwMDAKKyAgICAjIDEtMiBzZWNvbmRzLgorICAgIHJvdW5kcyA9IDEwMDAwMAogCiAgICAgIyMjIEludGVybmFsIHZhcmlhYmxlcwogCiAgICAgIyBNYXJrIHRoaXMgY2xhc3MgYXMgaW1wbGVtZW50aW5nIGEgdGVzdAogICAgIGlzX2FfdGVzdCA9IDEKIAotICAgICMgTWlzYy4gaW50ZXJuYWwgdmFyaWFibGVzCi0gICAgbGFzdF90aW1pbmcgPSAoMCwwLDApICMgbGFzdCB0aW1pbmcgKHJlYWwscnVuLGNhbGlicmF0aW9uKQotICAgIHdhcnAgPSAxICAgICAgICAgICAgIyB3YXJwIGZhY3RvciB0aGlzIHRlc3QgdXNlcwotICAgIGNydW5zID0gMjAgICAgICAgICAgIyBudW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucwotICAgIG92ZXJoZWFkID0gTm9uZSAgICAgIyBsaXN0IG9mIGNhbGlicmF0aW9uIHRpbWluZ3MKKyAgICAjIExhc3QgdGltaW5nOiAocmVhbCwgcnVuLCBvdmVyaGVhZCkKKyAgICBsYXN0X3RpbWluZyA9ICgwLjAsIDAuMCwgMC4wKQogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsd2FycD0xKToKKyAgICAjIFdhcnAgZmFjdG9yIHRvIHVzZSBmb3IgdGhpcyB0ZXN0CisgICAgd2FycCA9IDEKIAotICAgICAgICBpZiB3YXJwID4gMToKLSAgICAgICAgICAgIHNlbGYucm91bmRzID0gc2VsZi5yb3VuZHMgLyB3YXJwCisgICAgIyBOdW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucyB0byB1c2UKKyAgICBjYWxpYnJhdGlvbl9ydW5zID0gQ0FMSUJSQVRJT05fUlVOUworCisgICAgIyBMaXN0IG9mIGNhbGlicmF0aW9uIHRpbWluZ3MKKyAgICBvdmVyaGVhZF90aW1lcyA9IE5vbmUKKworICAgICMgTGlzdCBvZiB0ZXN0IHJ1biB0aW1pbmdzCisgICAgdGltZXMgPSBbXQorCisgICAgIyBUaW1lciB1c2VkIGZvciB0aGUgYmVuY2htYXJrCisgICAgdGltZXIgPSBUSU1FUl9QTEFURk9STV9ERUZBVUxUCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgd2FycD1Ob25lLCBjYWxpYnJhdGlvbl9ydW5zPU5vbmUsIHRpbWVyPU5vbmUpOgorCisgICAgICAgICMgU2V0IHBhcmFtZXRlcnMKKyAgICAgICAgaWYgd2FycCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucm91bmRzID0gaW50KHNlbGYucm91bmRzIC8gd2FycCkKICAgICAgICAgICAgIGlmIHNlbGYucm91bmRzID09IDA6Ci0gICAgICAgICAgICAgICAgc2VsZi5yb3VuZHMgPSAxCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignd2FycCBmYWN0b3Igc2V0IHRvbyBoaWdoJykKICAgICAgICAgICAgIHNlbGYud2FycCA9IHdhcnAKKyAgICAgICAgaWYgY2FsaWJyYXRpb25fcnVucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIChub3QgQUxMT1dfU0tJUFBJTkdfQ0FMSUJSQVRJT04gYW5kCisgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25fcnVucyA8IDEpOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2F0IGxlYXN0IG9uZSBjYWxpYnJhdGlvbiBydW4gaXMgcmVxdWlyZWQnKQorICAgICAgICAgICAgc2VsZi5jYWxpYnJhdGlvbl9ydW5zID0gY2FsaWJyYXRpb25fcnVucworICAgICAgICBpZiB0aW1lciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHRpbWVyID0gdGltZXIKKworICAgICAgICAjIEluaXQgdmFyaWFibGVzCiAgICAgICAgIHNlbGYudGltZXMgPSBbXQotICAgICAgICBzZWxmLm92ZXJoZWFkID0gW10KKyAgICAgICAgc2VsZi5vdmVyaGVhZF90aW1lcyA9IFtdCisKICAgICAgICAgIyBXZSB3YW50IHRoZXNlIHRvIGJlIGluIHRoZSBpbnN0YW5jZSBkaWN0LCBzbyB0aGF0IHBpY2tsZQogICAgICAgICAjIHNhdmVzIHRoZW0KICAgICAgICAgc2VsZi52ZXJzaW9uID0gc2VsZi52ZXJzaW9uCiAgICAgICAgIHNlbGYub3BlcmF0aW9ucyA9IHNlbGYub3BlcmF0aW9ucwogICAgICAgICBzZWxmLnJvdW5kcyA9IHNlbGYucm91bmRzCiAKLSAgICBkZWYgcnVuKHNlbGYsIGNydW5zKToKKyAgICBkZWYgZ2V0X3RpbWVyKHNlbGYpOgorCisgICAgICAgICIiIiBSZXR1cm4gdGhlIHRpbWVyIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRlc3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBnZXRfdGltZXIoc2VsZi50aW1lcikKKworICAgIGRlZiBjb21wYXRpYmxlKHNlbGYsIG90aGVyKToKKworICAgICAgICAiIiIgUmV0dXJuIDEvMCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgdGVzdCBpcyBjb21wYXRpYmxlCisgICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBUZXN0IGluc3RhbmNlIG9yIG5vdC4KKworICAgICAgICAiIiIKKyAgICAgICAgaWYgc2VsZi52ZXJzaW9uICE9IG90aGVyLnZlcnNpb246CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICBpZiBzZWxmLnJvdW5kcyAhPSBvdGhlci5yb3VuZHM6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGNhbGlicmF0ZV90ZXN0KHNlbGYpOgorCisgICAgICAgIGlmIHNlbGYuY2FsaWJyYXRpb25fcnVucyA9PSAwOgorICAgICAgICAgICAgc2VsZi5vdmVyaGVhZF90aW1lcyA9IFswLjBdCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBjYWxpYnJhdGUgPSBzZWxmLmNhbGlicmF0ZQorICAgICAgICB0aW1lciA9IHNlbGYuZ2V0X3RpbWVyKCkKKyAgICAgICAgY2FsaWJyYXRpb25fbG9vcHMgPSByYW5nZShDQUxJQlJBVElPTl9MT09QUykKKworICAgICAgICAjIFRpbWUgdGhlIGNhbGlicmF0aW9uIGxvb3Agb3ZlcmhlYWQKKyAgICAgICAgcHJlcF90aW1lcyA9IFtdCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuY2FsaWJyYXRpb25fcnVucyk6CisgICAgICAgICAgICB0ID0gdGltZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gY2FsaWJyYXRpb25fbG9vcHM6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgdCA9IHRpbWVyKCkgLSB0CisgICAgICAgICAgICBwcmVwX3RpbWVzLmFwcGVuZCh0KQorICAgICAgICBtaW5fcHJlcF90aW1lID0gbWluKHByZXBfdGltZXMpCisgICAgICAgIGlmIF9kZWJ1ZzoKKyAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCAnQ2FsaWIuIHByZXAgdGltZSAgICAgPSAlLjZmbXMnICUgKAorICAgICAgICAgICAgICAgIG1pbl9wcmVwX3RpbWUgKiBNSUxMSV9TRUNPTkRTKQorCisgICAgICAgICMgVGltZSB0aGUgY2FsaWJyYXRpb24gcnVucyAoZG9pbmcgQ0FMSUJSQVRJT05fTE9PUFMgbG9vcHMgb2YKKyAgICAgICAgIyAuY2FsaWJyYXRlKCkgbWV0aG9kIGNhbGxzIGVhY2gpCisgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGYuY2FsaWJyYXRpb25fcnVucyk6CisgICAgICAgICAgICB0ID0gdGltZXIoKQorICAgICAgICAgICAgZm9yIGkgaW4gY2FsaWJyYXRpb25fbG9vcHM6CisgICAgICAgICAgICAgICAgY2FsaWJyYXRlKCkKKyAgICAgICAgICAgIHQgPSB0aW1lcigpIC0gdAorICAgICAgICAgICAgc2VsZi5vdmVyaGVhZF90aW1lcy5hcHBlbmQodCAvIENBTElCUkFUSU9OX0xPT1BTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1pbl9wcmVwX3RpbWUpCisKKyAgICAgICAgIyBDaGVjayB0aGUgbWVhc3VyZWQgdGltZXMKKyAgICAgICAgbWluX292ZXJoZWFkID0gbWluKHNlbGYub3ZlcmhlYWRfdGltZXMpCisgICAgICAgIG1heF9vdmVyaGVhZCA9IG1heChzZWxmLm92ZXJoZWFkX3RpbWVzKQorICAgICAgICBpZiBfZGVidWc6CisgICAgICAgICAgICBwcmludCAnQ2FsaWIuIG92ZXJoZWFkIHRpbWUgPSAlLjZmbXMnICUgKAorICAgICAgICAgICAgICAgIG1pbl9vdmVyaGVhZCAqIE1JTExJX1NFQ09ORFMpCisgICAgICAgIGlmIG1pbl9vdmVyaGVhZCA8IDAuMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ2NhbGlicmF0aW9uIHNldHVwIGRpZCBub3Qgd29yaycpCisgICAgICAgIGlmIG1heF9vdmVyaGVhZCAtIG1pbl9vdmVyaGVhZCA+IDAuMToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgJ292ZXJoZWFkIGNhbGlicmF0aW9uIHRpbWluZyByYW5nZSB0b28gaW5hY2N1cmF0ZTogJworICAgICAgICAgICAgICAgICclciAtICVyJyAlIChtaW5fb3ZlcmhlYWQsIG1heF9vdmVyaGVhZCkpCisKKyAgICBkZWYgcnVuKHNlbGYpOgogCiAgICAgICAgICIiIiBSdW4gdGhlIHRlc3QgaW4gdHdvIHBoYXNlczogZmlyc3QgY2FsaWJyYXRlLCB0aGVuCiAgICAgICAgICAgICBkbyB0aGUgYWN0dWFsIHRlc3QuIEJlIGNhcmVmdWwgdG8ga2VlcCB0aGUgY2FsaWJyYXRpb24KQEAgLTEzNCwyNyArMzE1LDIzIEBACiAKICAgICAgICAgIiIiCiAgICAgICAgIHRlc3QgPSBzZWxmLnRlc3QKLSAgICAgICAgY2FsaWJyYXRlID0gc2VsZi5jYWxpYnJhdGUKLSAgICAgICAgY2xvY2sgPSB0aW1lLmNsb2NrCi0gICAgICAgICMgZmlyc3QgY2FsaWJyYXRlCi0gICAgICAgIHQgPSBjbG9jaygpCi0gICAgICAgIGNhbGlicmF0ZSgpCi0gICAgICAgIG9mZnNldCA9IGNsb2NrKCkgLSB0Ci0gICAgICAgIGlmIGNydW5zOgotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoY3J1bnMtMSk6Ci0gICAgICAgICAgICAgICAgdCA9IGNsb2NrKCkKLSAgICAgICAgICAgICAgICBjYWxpYnJhdGUoKQotICAgICAgICAgICAgICAgIHQgPSBjbG9jaygpIC0gdAotICAgICAgICAgICAgICAgIGlmIHQgPCBvZmZzZXQ6Ci0gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHQKLSAgICAgICAgIyBub3cgdGhlIHJlYWwgdGhpbmcKLSAgICAgICAgdCA9IGNsb2NrKCkKKyAgICAgICAgdGltZXIgPSBzZWxmLmdldF90aW1lcigpCisKKyAgICAgICAgIyBHZXQgY2FsaWJyYXRpb24KKyAgICAgICAgbWluX292ZXJoZWFkID0gbWluKHNlbGYub3ZlcmhlYWRfdGltZXMpCisKKyAgICAgICAgIyBUZXN0IHJ1bgorICAgICAgICB0ID0gdGltZXIoKQogICAgICAgICB0ZXN0KCkKLSAgICAgICAgdCA9IGNsb2NrKCkgLSB0Ci0gICAgICAgIGlmIHQgPCAwLjAxOgotICAgICAgICAgICAgc3lzLmV4aXQoIkxvd2VyIHdhcnAgcmVxdWlyZWQ6IHRlc3QgdGltZXMgPCAxMCBtcyBhcmUgdW5yZWxpYWJsZSIpCi0gICAgICAgIHNlbGYubGFzdF90aW1pbmcgPSAodC1vZmZzZXQsdCxvZmZzZXQpCi0gICAgICAgIHNlbGYudGltZXMuYXBwZW5kKHQtb2Zmc2V0KQorICAgICAgICB0ID0gdGltZXIoKSAtIHQKKyAgICAgICAgaWYgdCA8IE1JTl9URVNUX1JVTlRJTUU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCd3YXJwIGZhY3RvciB0b28gaGlnaDogJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdCB0aW1lcyBhcmUgPCAxMG1zJykKKyAgICAgICAgZWZmX3RpbWUgPSB0IC0gbWluX292ZXJoZWFkCisgICAgICAgIGlmIGVmZl90aW1lIDwgMDoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ3dyb25nIGNhbGlicmF0aW9uJykKKyAgICAgICAgc2VsZi5sYXN0X3RpbWluZyA9IChlZmZfdGltZSwgdCwgbWluX292ZXJoZWFkKQorICAgICAgICBzZWxmLnRpbWVzLmFwcGVuZChlZmZfdGltZSkKIAogICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CiAKQEAgLTE3NiwzMyArMzUzLDMzIEBACiAgICAgICAgICAgICBzZWxmLm9wZXJhdGlvbnMgbnVtYmVyIG9mIG9wZXJhdGlvbnMgZWFjaC4KIAogICAgICAgICAiIiIKLSAgICAgICAgIyBkbyBzb21lIHRlc3RzCiAgICAgICAgIHJldHVybgogCiAgICAgZGVmIHN0YXQoc2VsZik6CiAKLSAgICAgICAgIiIiIFJldHVybnMgZm91ciB2YWx1ZXM6Ci0gICAgICAgIG1pbmltdW0gcm91bmQgdGltZQotICAgICAgICBhdmVyYWdlIHRpbWUgcGVyIHJvdW5kCi0gICAgICAgIGF2ZXJhZ2UgdGltZSBwZXIgb3BlcmF0aW9uCi0gICAgICAgIGF2ZXJhZ2Ugb3ZlcmhlYWQgdGltZQorICAgICAgICAiIiIgUmV0dXJuIHRlc3QgcnVuIHN0YXRpc3RpY3MgYXMgdHVwbGU6CiAKLSAgICAgICAgWFhYIFNob3VsZCB0aGlzIHRha2Ugd2FycCBmYWN0b3JzIGludG8gYWNjb3VudD8KKyAgICAgICAgICAgIChtaW5pbXVtIHJ1biB0aW1lLAorICAgICAgICAgICAgIGF2ZXJhZ2UgcnVuIHRpbWUsCisgICAgICAgICAgICAgdG90YWwgcnVuIHRpbWUsCisgICAgICAgICAgICAgYXZlcmFnZSB0aW1lIHBlciBvcGVyYXRpb24sCisgICAgICAgICAgICAgbWluaW11bSBvdmVyaGVhZCB0aW1lKQorCiAgICAgICAgICIiIgogICAgICAgICBydW5zID0gbGVuKHNlbGYudGltZXMpCiAgICAgICAgIGlmIHJ1bnMgPT0gMDoKLSAgICAgICAgICAgIHJldHVybiAwLDAKLSAgICAgICAgbWludGltZSA9IG1pbihzZWxmLnRpbWVzKQotICAgICAgICB0b3RhbHRpbWUgPSByZWR1Y2Uob3BlcmF0b3IuYWRkLHNlbGYudGltZXMsMC4wKQotICAgICAgICBhdmcgPSB0b3RhbHRpbWUgLyBmbG9hdChydW5zKQotICAgICAgICBvcF9hdmcgPSB0b3RhbHRpbWUgLyBmbG9hdChydW5zICogc2VsZi5yb3VuZHMgKiBzZWxmLm9wZXJhdGlvbnMpCi0gICAgICAgIGlmIHNlbGYub3ZlcmhlYWQ6Ci0gICAgICAgICAgICB0b3RhbG92ZXJoZWFkID0gcmVkdWNlKG9wZXJhdG9yLmFkZCxzZWxmLm92ZXJoZWFkLDAuMCkKLSAgICAgICAgICAgIG92X2F2ZyA9IHRvdGFsb3ZlcmhlYWQgLyBmbG9hdChydW5zKQorICAgICAgICAgICAgcmV0dXJuIDAuMCwgMC4wLCAwLjAsIDAuMAorICAgICAgICBtaW5fdGltZSA9IG1pbihzZWxmLnRpbWVzKQorICAgICAgICB0b3RhbF90aW1lID0gcmVkdWNlKG9wZXJhdG9yLmFkZCwgc2VsZi50aW1lcywgMC4wKQorICAgICAgICBhdmdfdGltZSA9IHRvdGFsX3RpbWUgLyBmbG9hdChydW5zKQorICAgICAgICBvcGVyYXRpb25fYXZnID0gdG90YWxfdGltZSAvIGZsb2F0KHJ1bnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNlbGYucm91bmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzZWxmLm9wZXJhdGlvbnMpCisgICAgICAgIGlmIHNlbGYub3ZlcmhlYWRfdGltZXM6CisgICAgICAgICAgICBtaW5fb3ZlcmhlYWQgPSBtaW4oc2VsZi5vdmVyaGVhZF90aW1lcykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgdXNlIHNlbGYubGFzdF90aW1pbmcgLSBub3QgdG9vIGFjY3VyYXRlCi0gICAgICAgICAgICBvdl9hdmcgPSBzZWxmLmxhc3RfdGltaW5nWzJdCi0gICAgICAgIHJldHVybiBtaW50aW1lLCBhdmcsIG9wX2F2Zywgb3ZfYXZnCisgICAgICAgICAgICBtaW5fb3ZlcmhlYWQgPSBzZWxmLmxhc3RfdGltaW5nWzJdCisgICAgICAgIHJldHVybiBtaW5fdGltZSwgYXZnX3RpbWUsIHRvdGFsX3RpbWUsIG9wZXJhdGlvbl9hdmcsIG1pbl9vdmVyaGVhZAogCiAjIyMgTG9hZCBTZXR1cAogCkBAIC0yMTUsMTUzICszOTIsMzUzIEBACiAKIGNsYXNzIEJlbmNobWFyazoKIAotICAgIG5hbWUgPSAnPycgICAgICAgICAgICAgICAgICAjIE5hbWUgb2YgdGhlIGJlbmNobWFyawotICAgIHJvdW5kcyA9IDEgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiByb3VuZHMgdG8gcnVuCisgICAgIyBOYW1lIG9mIHRoZSBiZW5jaG1hcmsKKyAgICBuYW1lID0gJycKKworICAgICMgTnVtYmVyIG9mIGJlbmNobWFyayByb3VuZHMgdG8gcnVuCisgICAgcm91bmRzID0gMQorCisgICAgIyBXYXJwIGZhY3RvciB1c2UgdG8gcnVuIHRoZSB0ZXN0cwogICAgIHdhcnAgPSAxICAgICAgICAgICAgICAgICAgICAjIFdhcnAgZmFjdG9yCi0gICAgcm91bmR0aW1lID0gMCAgICAgICAgICAgICAgICMgQXZlcmFnZSByb3VuZCB0aW1lCi0gICAgdmVyc2lvbiA9IE5vbmUgICAgICAgICAgICAgICMgQmVuY2htYXJrIHZlcnNpb24gbnVtYmVyIChzZWUgX19pbml0X18pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgYXMgZmxvYXQgeC55eQogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICMgQXZlcmFnZSBiZW5jaG1hcmsgcm91bmQgdGltZQorICAgIHJvdW5kdGltZSA9IDAKIAotICAgICAgICBzZWxmLnRlc3RzID0ge30KLSAgICAgICAgc2VsZi52ZXJzaW9uID0gMC4zMQorICAgICMgQmVuY2htYXJrIHZlcnNpb24gbnVtYmVyIGFzIGZsb2F0IHgueXkKKyAgICB2ZXJzaW9uID0gMi4wCiAKLSAgICBkZWYgbG9hZF90ZXN0cyhzZWxmLCBzZXR1cG1vZCwgd2FycD0xLCBsaW1pdG5hbWVzPSIiLCB2ZXJib3NlPTApOgorICAgICMgUHJvZHVjZSB2ZXJib3NlIG91dHB1dCA/CisgICAgdmVyYm9zZSA9IDAKIAotICAgICAgICBzZWxmLndhcnAgPSB3YXJwCi0gICAgICAgIGlmIGxpbWl0bmFtZXM6Ci0gICAgICAgICAgICBsaW1pdG5hbWVzID0gcmUuY29tcGlsZShsaW1pdG5hbWVzLCByZS5JKQorICAgICMgRGljdGlvbmFyeSB3aXRoIHRoZSBtYWNoaW5lIGRldGFpbHMKKyAgICBtYWNoaW5lX2RldGFpbHMgPSBOb25lCisKKyAgICAjIFRpbWVyIHVzZWQgZm9yIHRoZSBiZW5jaG1hcmsKKyAgICB0aW1lciA9IFRJTUVSX1BMQVRGT1JNX0RFRkFVTFQKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCB2ZXJib3NlPU5vbmUsIHRpbWVyPU5vbmUsIHdhcnA9Tm9uZSwKKyAgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25fcnVucz1Ob25lKToKKworICAgICAgICBpZiBuYW1lOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgbGltaXRuYW1lcyA9IE5vbmUKLSAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzCi0gICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICBwcmludCAnU2VhcmNoaW5nIGZvciB0ZXN0cyAuLi4nLAotICAgICAgICBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKQotICAgICAgICBmb3IgYyBpbiBzZXR1cG1vZC5fX2RpY3RfXy52YWx1ZXMoKToKLSAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKGMsJ2lzX2FfdGVzdCcpOgorICAgICAgICAgICAgc2VsZi5uYW1lID0gJyUwNGktJTAyaS0lMDJpICUwMmk6JTAyaTolMDJpJyAlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICh0aW1lLmxvY2FsdGltZSh0aW1lLnRpbWUoKSlbOjZdKQorICAgICAgICBpZiB2ZXJib3NlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi52ZXJib3NlID0gdmVyYm9zZQorICAgICAgICBpZiB0aW1lciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGltZXIgPSB0aW1lcgorICAgICAgICBpZiB3YXJwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi53YXJwID0gd2FycAorICAgICAgICBpZiBjYWxpYnJhdGlvbl9ydW5zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5jYWxpYnJhdGlvbl9ydW5zID0gY2FsaWJyYXRpb25fcnVucworCisgICAgICAgICMgSW5pdCB2YXJzCisgICAgICAgIHNlbGYudGVzdHMgPSB7fQorICAgICAgICBpZiBfZGVidWc6CisgICAgICAgICAgICBwcmludCAnR2V0dGluZyBtYWNoaW5lIGRldGFpbHMuLi4nCisgICAgICAgIHNlbGYubWFjaGluZV9kZXRhaWxzID0gZ2V0X21hY2hpbmVfZGV0YWlscygpCisKKyAgICAgICAgIyBNYWtlIC52ZXJzaW9uIGFuIGluc3RhbmNlIGF0dHJpYnV0ZSB0byBoYXZlIGl0IHNhdmVkIGluIHRoZQorICAgICAgICAjIEJlbmNobWFyayBwaWNrbGUKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gc2VsZi52ZXJzaW9uCisKKyAgICBkZWYgZ2V0X3RpbWVyKHNlbGYpOgorCisgICAgICAgICIiIiBSZXR1cm4gdGhlIHRpbWVyIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHRlc3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiBnZXRfdGltZXIoc2VsZi50aW1lcikKKworICAgIGRlZiBjb21wYXRpYmxlKHNlbGYsIG90aGVyKToKKworICAgICAgICAiIiIgUmV0dXJuIDEvMCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgYmVuY2htYXJrIGlzCisgICAgICAgICAgICBjb21wYXRpYmxlIHdpdGggdGhlIG90aGVyIEJlbmNobWFyayBpbnN0YW5jZSBvciBub3QuCisKKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlbGYudmVyc2lvbiAhPSBvdGhlci52ZXJzaW9uOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgKHNlbGYubWFjaGluZV9kZXRhaWxzID09IG90aGVyLm1hY2hpbmVfZGV0YWlscyBhbmQKKyAgICAgICAgICAgIHNlbGYudGltZXIgIT0gb3RoZXIudGltZXIpOgorICAgICAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgaWYgKHNlbGYuY2FsaWJyYXRpb25fcnVucyA9PSAwIGFuZAorICAgICAgICAgICAgb3RoZXIuY2FsaWJyYXRpb25fcnVucyAhPSAwKToKKyAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIGlmIChzZWxmLmNhbGlicmF0aW9uX3J1bnMgIT0gMCBhbmQKKyAgICAgICAgICAgIG90aGVyLmNhbGlicmF0aW9uX3J1bnMgPT0gMCk6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGxvYWRfdGVzdHMoc2VsZiwgc2V0dXBtb2QsIGxpbWl0bmFtZXM9Tm9uZSk6CisKKyAgICAgICAgIyBBZGQgdGVzdHMKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgJ1NlYXJjaGluZyBmb3IgdGVzdHMgLi4uJworICAgICAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgICBmb3IgdGVzdGNsYXNzIGluIHNldHVwbW9kLl9fZGljdF9fLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIodGVzdGNsYXNzLCAnaXNfYV90ZXN0Jyk6CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIG5hbWUgPSBjLl9fbmFtZV9fCisgICAgICAgICAgICBuYW1lID0gdGVzdGNsYXNzLl9fbmFtZV9fCiAgICAgICAgICAgICBpZiAgbmFtZSA9PSAnVGVzdCc6CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIGxpbWl0bmFtZXMgaXMgbm90IE5vbmUgYW5kIGxpbWl0bmFtZXMuc2VhcmNoKG5hbWUpIGlzIE5vbmU6CisgICAgICAgICAgICBpZiAobGltaXRuYW1lcyBpcyBub3QgTm9uZSBhbmQKKyAgICAgICAgICAgICAgICBsaW1pdG5hbWVzLnNlYXJjaChuYW1lKSBpcyBOb25lKToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgdGVzdHNbbmFtZV0gPSBjKHdhcnApCi0gICAgICAgIGwgPSB0ZXN0cy5rZXlzKCkKKyAgICAgICAgICAgIHNlbGYudGVzdHNbbmFtZV0gPSB0ZXN0Y2xhc3MoCisgICAgICAgICAgICAgICAgd2FycD1zZWxmLndhcnAsCisgICAgICAgICAgICAgICAgY2FsaWJyYXRpb25fcnVucz1zZWxmLmNhbGlicmF0aW9uX3J1bnMsCisgICAgICAgICAgICAgICAgdGltZXI9c2VsZi50aW1lcikKKyAgICAgICAgbCA9IHNlbGYudGVzdHMua2V5cygpCiAgICAgICAgIGwuc29ydCgpCi0gICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGw6CisgICAgICAgICAgICAgICAgcHJpbnQgJyAgJXMnICUgbmFtZQorICAgICAgICAgICAgcHJpbnQgJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJworICAgICAgICAgICAgcHJpbnQgJyAgJWkgdGVzdHMgZm91bmQnICUgbGVuKGwpCiAgICAgICAgICAgICBwcmludAotICAgICAgICAgICAgZm9yIHQgaW4gbDoKLSAgICAgICAgICAgICAgICBwcmludCAnICAnLCB0Ci0gICAgICAgICAgICBwcmludCBsZW4obCksICJ0ZXN0cyBmb3VuZCIKKworICAgIGRlZiBjYWxpYnJhdGUoc2VsZik6CisKKyAgICAgICAgcHJpbnQgJ0NhbGlicmF0aW5nIHRlc3RzLiBQbGVhc2Ugd2FpdC4uLicKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ICdUZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluICAgICAgbWF4JworICAgICAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQorICAgICAgICB0ZXN0cy5zb3J0KCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHRlc3RzKSk6CisgICAgICAgICAgICBuYW1lLCB0ZXN0ID0gdGVzdHNbaV0KKyAgICAgICAgICAgIHRlc3QuY2FsaWJyYXRlX3Rlc3QoKQorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICclMzBzOiAgJTYuM2ZtcyAgJTYuM2ZtcycgJSBcCisgICAgICAgICAgICAgICAgICAgICAgKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIG1pbih0ZXN0Lm92ZXJoZWFkX3RpbWVzKSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgIG1heCh0ZXN0Lm92ZXJoZWFkX3RpbWVzKSAqIE1JTExJX1NFQ09ORFMpCiAgICAgICAgIHByaW50CiAKLSAgICBkZWYgcnVuKHNlbGYsIHZlcmJvc2UsIGNydW5zKToKKyAgICBkZWYgcnVuKHNlbGYpOgogCiAgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCiAgICAgICAgIHRlc3RzLnNvcnQoKQotICAgICAgICBjbG9jayA9IHRpbWUuY2xvY2sKLSAgICAgICAgcHJpbnQgJ1J1bm5pbmcgJWkgcm91bmQocykgb2YgdGhlIHN1aXRlIGF0IHdhcnAgZmFjdG9yICVpOicgJSAoc2VsZi5yb3VuZHMsIHNlbGYud2FycCkKKyAgICAgICAgdGltZXIgPSBzZWxmLmdldF90aW1lcigpCisgICAgICAgIHByaW50ICdSdW5uaW5nICVpIHJvdW5kKHMpIG9mIHRoZSBzdWl0ZSBhdCB3YXJwIGZhY3RvciAlaTonICUgXAorICAgICAgICAgICAgICAoc2VsZi5yb3VuZHMsIHNlbGYud2FycCkKICAgICAgICAgcHJpbnQKLSAgICAgICAgcm91bmR0aW1lID0gY2xvY2soKQorICAgICAgICBzZWxmLnJvdW5kdGltZXMgPSBbXQogICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnJvdW5kcyk6Ci0gICAgICAgICAgICByb3VuZHN0YXJ0dGltZSA9IGNsb2NrKCkKLSAgICAgICAgICAgIGlmIHZlcmJvc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyBSb3VuZCAlLTI1aSAgcmVhbCAgIGFicyAgICBvdmVyaGVhZCcgJSAoaSsxKQorICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgorICAgICAgICAgICAgICAgIHByaW50ICcgUm91bmQgJS0yNWkgIGVmZmVjdGl2ZSAgIGFic29sdXRlICBvdmVyaGVhZCcgJSAoaSsxKQorICAgICAgICAgICAgdG90YWxfZWZmX3RpbWUgPSAwLjAKICAgICAgICAgICAgIGZvciBqIGluIHJhbmdlKGxlbih0ZXN0cykpOgotICAgICAgICAgICAgICAgIG5hbWUsIHQgPSB0ZXN0c1tqXQotICAgICAgICAgICAgICAgIGlmIHZlcmJvc2U6CisgICAgICAgICAgICAgICAgbmFtZSwgdGVzdCA9IHRlc3RzW2pdCisgICAgICAgICAgICAgICAgaWYgc2VsZi52ZXJib3NlOgogICAgICAgICAgICAgICAgICAgICBwcmludCAnJTMwczonICUgbmFtZSwKLSAgICAgICAgICAgICAgICB0LnJ1bihjcnVucykKLSAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnICAlLjNmciAlLjNmYSAlLjNmbycgJSB0Lmxhc3RfdGltaW5nCi0gICAgICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgICAgIHByaW50ICcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tJwotICAgICAgICAgICAgICAgIHByaW50ICcgICAgICAgICAgICBBdmVyYWdlIHJvdW5kIHRpbWU6ICAgICAgJS4zZiBzZWNvbmRzJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgKChjbG9jaygpIC0gcm91bmR0aW1lKS8oaSsxKSkKKyAgICAgICAgICAgICAgICB0ZXN0LnJ1bigpCisgICAgICAgICAgICAgICAgKGVmZl90aW1lLCBhYnNfdGltZSwgbWluX292ZXJoZWFkKSA9IHRlc3QubGFzdF90aW1pbmcKKyAgICAgICAgICAgICAgICB0b3RhbF9lZmZfdGltZSA9IHRvdGFsX2VmZl90aW1lICsgZWZmX3RpbWUKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICcgICAgJTUuMGZtcyAgICAlNS4wZm1zICU3LjNmbXMnICUgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZWZmX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluX292ZXJoZWFkICogTUlMTElfU0VDT05EUykKKyAgICAgICAgICAgIHNlbGYucm91bmR0aW1lcy5hcHBlbmQodG90YWxfZWZmX3RpbWUpCisgICAgICAgICAgICBpZiBzZWxmLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgKCcgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgICAgICAgICAnICAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJykKKyAgICAgICAgICAgICAgICBwcmludCAoJyAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAgICAgICAgICcgICAgIFRvdGFsczogICAgJTYuMGZtcycgJQorICAgICAgICAgICAgICAgICAgICAgICAodG90YWxfZWZmX3RpbWUgKiBNSUxMSV9TRUNPTkRTKSkKICAgICAgICAgICAgICAgICBwcmludAogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnJWQgZG9uZSBpbiAlLjNmIHNlY29uZHMnICUgKGkrMSwgKGNsb2NrKCkgLSByb3VuZHN0YXJ0dGltZSkpCi0gICAgICAgIHNlbGYucm91bmR0aW1lID0gKGNsb2NrKCkgLSByb3VuZHRpbWUpIC8gc2VsZi5yb3VuZHMKKyAgICAgICAgICAgICAgICBwcmludCAnKiBSb3VuZCAlaSBkb25lIGluICUuM2Ygc2Vjb25kcy4nICUgKGkrMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2VmZl90aW1lKQogICAgICAgICBwcmludAogCi0gICAgZGVmIHByaW50X3N0YXQoc2VsZiwgY29tcGFyZV90bz1Ob25lLCBoaWRlbm9pc2U9MCk6CisgICAgZGVmIHN0YXQoc2VsZik6CiAKLSAgICAgICAgaWYgbm90IGNvbXBhcmVfdG86Ci0gICAgICAgICAgICBwcmludCAnJS0zMHMgICAgICAgbWluIHJ1biAgICBhdmcgcnVuICAgIHBlciBvcHJuICBvdmVyaGVhZCcgJSAnVGVzdHM6JwotICAgICAgICAgICAgcHJpbnQgJy0nKjc3Ci0gICAgICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQotICAgICAgICAgICAgdGVzdHMuc29ydCgpCi0gICAgICAgICAgICB0b3RhbG1pbnRpbWUgPSAwCi0gICAgICAgICAgICBmb3IgbmFtZSx0IGluIHRlc3RzOgotICAgICAgICAgICAgICAgIG1pbnRpbWUsYXZnLG9wX2F2Zyxvdl9hdmcgPSB0LnN0YXQoKQotICAgICAgICAgICAgICAgIHRvdGFsbWludGltZSArPSBtaW50aW1lCi0gICAgICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU5LjJmIG1zICU5LjJmIG1zICU2LjJmIHVzICAlNi4yZicgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKG5hbWUsbWludGltZSoxMDAwLjAsYXZnKjEwMDAuMCxvcF9hdmcqMTAwMDAwMC4wLG92X2F2ZyoxMDAwLjApCi0gICAgICAgICAgICBwcmludCAnLScqNzcKLSAgICAgICAgICAgIHByaW50ICclMzBzOiAlOS4yZiBtcycgJSBcCi0gICAgICAgICAgICAgICAgICAoJ05vdGlvbmFsIG1pbmltdW0gcm91bmQgdGltZScsIHRvdGFsbWludGltZSAqIDEwMDAuMCkKKyAgICAgICAgIiIiIFJldHVybiBiZW5jaG1hcmsgcnVuIHN0YXRpc3RpY3MgYXMgdHVwbGU6CiAKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHByaW50ICdDb21wYXJpbmcgd2l0aDogJXMgKHJvdW5kcz0laSwgd2FycD0laSknICUgXAotICAgICAgICAgICAgICAgICAgKGNvbXBhcmVfdG8ubmFtZSxjb21wYXJlX3RvLnJvdW5kcyxjb21wYXJlX3RvLndhcnApCi0gICAgICAgICAgICBwcmludCAnJS0zMHMgICAgICBtaW4gcnVuICAgICBjbXAgcnVuICAgICBhdmcgcnVuICAgICAgZGlmZicgJSBcCi0gICAgICAgICAgICAgICAgICAnVGVzdHM6JwotICAgICAgICAgICAgcHJpbnQgJy0nKjc3Ci0gICAgICAgICAgICB0ZXN0cyA9IHNlbGYudGVzdHMuaXRlbXMoKQotICAgICAgICAgICAgdGVzdHMuc29ydCgpCi0gICAgICAgICAgICBjb21wYXRpYmxlID0gMQotICAgICAgICAgICAgdG90YWxtaW50aW1lID0gb3RoZXJfdG90YWxtaW50aW1lID0gMAotICAgICAgICAgICAgZm9yIG5hbWUsIHQgaW4gdGVzdHM6Ci0gICAgICAgICAgICAgICAgbWludGltZSwgYXZnLCBvcF9hdmcsIG92X2F2ZyA9IHQuc3RhdCgpCi0gICAgICAgICAgICAgICAgdG90YWxtaW50aW1lICs9IG1pbnRpbWUKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyID0gY29tcGFyZV90by50ZXN0c1tuYW1lXQotICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgb3RoZXIgPSBOb25lCi0gICAgICAgICAgICAgICAgaWYgb3RoZXIgYW5kIG90aGVyLnZlcnNpb24gPT0gdC52ZXJzaW9uIGFuZCBcCi0gICAgICAgICAgICAgICAgICAgb3RoZXIub3BlcmF0aW9ucyA9PSB0Lm9wZXJhdGlvbnM6Ci0gICAgICAgICAgICAgICAgICAgIG1pbnRpbWUxLCBhdmcxLCBvcF9hdmcxLCBvdl9hdmcxID0gb3RoZXIuc3RhdCgpCi0gICAgICAgICAgICAgICAgICAgIG90aGVyX3RvdGFsbWludGltZSArPSBtaW50aW1lMQotICAgICAgICAgICAgICAgICAgICBkaWZmID0gKChtaW50aW1lKnNlbGYud2FycCkvKG1pbnRpbWUxKm90aGVyLndhcnApIC0gMS4wKSoxMDAuMAotICAgICAgICAgICAgICAgICAgICBpZiBoaWRlbm9pc2UgYW5kIGFicyhxb3BfYXZnKSA8IDEwOgotICAgICAgICAgICAgICAgICAgICAgICAgZGlmZiA9ICcnCi0gICAgICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaWZmID0gJyUrNy4yZiUlJyAlIGRpZmYKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBxYXZnLCBkaWZmID0gJ24vYScsICduL2EnCi0gICAgICAgICAgICAgICAgICAgIGNvbXBhdGlibGUgPSAwCi0gICAgICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU4LjJmIG1zICU4LjJmIG1zICU4LjJmIG1zICAlOHMnICUgXAotICAgICAgICAgICAgICAgICAgICAgIChuYW1lLG1pbnRpbWUqMTAwMC4wLG1pbnRpbWUxKjEwMDAuMCAqIGNvbXBhcmVfdG8ud2FycC9zZWxmLndhcnAsIGF2ZyoxMDAwLjAsZGlmZikKLSAgICAgICAgICAgIHByaW50ICctJyo3NwotICAgICAgICAgICAgIwotICAgICAgICAgICAgIyBTdW1tYXJpc2UgdGVzdCByZXN1bHRzCi0gICAgICAgICAgICAjCi0gICAgICAgICAgICBpZiBjb21wYXRpYmxlIGFuZCBjb21wYXJlX3RvLnJvdW5kdGltZSA+IDAgYW5kIFwKLSAgICAgICAgICAgICAgIGNvbXBhcmVfdG8udmVyc2lvbiA9PSBzZWxmLnZlcnNpb246Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU4LjJmIG1zICU4LjJmIG1zICAgICAgICAgICAgICAlKzcuMmYlJScgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKCdOb3Rpb25hbCBtaW5pbXVtIHJvdW5kIHRpbWUnLCB0b3RhbG1pbnRpbWUgKiAxMDAwLjAsCi0gICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxtaW50aW1lICogMTAwMC4wICogY29tcGFyZV90by53YXJwL3NlbGYud2FycCwKLSAgICAgICAgICAgICAgICAgICAgICAgKCh0b3RhbG1pbnRpbWUqc2VsZi53YXJwKS8KLSAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl90b3RhbG1pbnRpbWUqY29tcGFyZV90by53YXJwKS0xLjApKjEwMC4wKQorICAgICAgICAgICAgKG1pbmltdW0gcm91bmQgdGltZSwKKyAgICAgICAgICAgICBhdmVyYWdlIHJvdW5kIHRpbWUsCisgICAgICAgICAgICAgbWF4aW11bSByb3VuZCB0aW1lKQorCisgICAgICAgICAgICBYWFggQ3VycmVudGx5IG5vdCB1c2VkLCBzaW5jZSB0aGUgYmVuY2htYXJrIGRvZXMgdGVzdAorICAgICAgICAgICAgICAgIHN0YXRpc3RpY3MgYWNyb3NzIGFsbCByb3VuZHMuCisKKyAgICAgICAgIiIiCisgICAgICAgIHJ1bnMgPSBsZW4oc2VsZi5yb3VuZHRpbWVzKQorICAgICAgICBpZiBydW5zID09IDA6CisgICAgICAgICAgICByZXR1cm4gMC4wLCAwLjAKKyAgICAgICAgbWluX3RpbWUgPSBtaW4oc2VsZi5yb3VuZHRpbWVzKQorICAgICAgICB0b3RhbF90aW1lID0gcmVkdWNlKG9wZXJhdG9yLmFkZCwgc2VsZi5yb3VuZHRpbWVzLCAwLjApCisgICAgICAgIGF2Z190aW1lID0gdG90YWxfdGltZSAvIGZsb2F0KHJ1bnMpCisgICAgICAgIG1heF90aW1lID0gbWF4KHNlbGYucm91bmR0aW1lcykKKyAgICAgICAgcmV0dXJuIChtaW5fdGltZSwgYXZnX3RpbWUsIG1heF90aW1lKQorCisgICAgZGVmIHByaW50X2hlYWRlcihzZWxmLCB0aXRsZT0nQmVuY2htYXJrJyk6CisKKyAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICBwcmludCAnJXM6ICVzJyAlICh0aXRsZSwgc2VsZi5uYW1lKQorICAgICAgICBwcmludCAnLScgKiBMSU5FCisgICAgICAgIHByaW50CisgICAgICAgIHByaW50ICcgICAgUm91bmRzOiAlcycgJSBzZWxmLnJvdW5kcworICAgICAgICBwcmludCAnICAgIFdhcnA6ICAgJXMnICUgc2VsZi53YXJwCisgICAgICAgIHByaW50ICcgICAgVGltZXI6ICAlcycgJSBzZWxmLnRpbWVyCisgICAgICAgIHByaW50CisgICAgICAgIGlmIHNlbGYubWFjaGluZV9kZXRhaWxzOgorICAgICAgICAgICAgcHJpbnRfbWFjaGluZV9kZXRhaWxzKHNlbGYubWFjaGluZV9kZXRhaWxzLCBpbmRlbnQ9JyAgICAnKQorICAgICAgICAgICAgcHJpbnQKKworICAgIGRlZiBwcmludF9iZW5jaG1hcmsoc2VsZiwgaGlkZW5vaXNlPTAsIGxpbWl0bmFtZXM9Tm9uZSk6CisKKyAgICAgICAgcHJpbnQgKCdUZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAnICAgbWluaW11bSAgYXZlcmFnZSAgb3BlcmF0aW9uICBvdmVyaGVhZCcpCisgICAgICAgIHByaW50ICctJyAqIExJTkUKKyAgICAgICAgdGVzdHMgPSBzZWxmLnRlc3RzLml0ZW1zKCkKKyAgICAgICAgdGVzdHMuc29ydCgpCisgICAgICAgIHRvdGFsX21pbl90aW1lID0gMC4wCisgICAgICAgIHRvdGFsX2F2Z190aW1lID0gMC4wCisgICAgICAgIGZvciBuYW1lLCB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgaWYgKGxpbWl0bmFtZXMgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgbGltaXRuYW1lcy5zZWFyY2gobmFtZSkgaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIChtaW5fdGltZSwKKyAgICAgICAgICAgICBhdmdfdGltZSwKKyAgICAgICAgICAgICB0b3RhbF90aW1lLAorICAgICAgICAgICAgIG9wX2F2ZywKKyAgICAgICAgICAgICBtaW5fb3ZlcmhlYWQpID0gdGVzdC5zdGF0KCkKKyAgICAgICAgICAgIHRvdGFsX21pbl90aW1lID0gdG90YWxfbWluX3RpbWUgKyBtaW5fdGltZQorICAgICAgICAgICAgdG90YWxfYXZnX3RpbWUgPSB0b3RhbF9hdmdfdGltZSArIGF2Z190aW1lCisgICAgICAgICAgICBwcmludCAnJTMwczogICU1LjBmbXMgICU1LjBmbXMgICU2LjJmdXMgICU3LjNmbXMnICUgXAorICAgICAgICAgICAgICAgICAgKG5hbWUsCisgICAgICAgICAgICAgICAgICAgbWluX3RpbWUgKiBNSUxMSV9TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgIGF2Z190aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICBvcF9hdmcgKiBNSUNST19TRUNPTkRTLAorICAgICAgICAgICAgICAgICAgIG1pbl9vdmVyaGVhZCAqTUlMTElfU0VDT05EUykKKyAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICBwcmludCAoJ1RvdGFsczogICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAnICU2LjBmbXMgJTYuMGZtcycgJQorICAgICAgICAgICAgICAgKHRvdGFsX21pbl90aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICB0b3RhbF9hdmdfdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgcHJpbnQKKworICAgIGRlZiBwcmludF9jb21wYXJpc29uKHNlbGYsIGNvbXBhcmVfdG8sIGhpZGVub2lzZT0wLCBsaW1pdG5hbWVzPU5vbmUpOgorCisgICAgICAgICMgQ2hlY2sgYmVuY2htYXJrIHZlcnNpb25zCisgICAgICAgIGlmIGNvbXBhcmVfdG8udmVyc2lvbiAhPSBzZWxmLnZlcnNpb246CisgICAgICAgICAgICBwcmludCAoJyogQmVuY2htYXJrIHZlcnNpb25zIGRpZmZlcjogJworICAgICAgICAgICAgICAgICAgICdjYW5ub3QgY29tcGFyZSB0aGlzIGJlbmNobWFyayB0byAiJXMiICEnICUKKyAgICAgICAgICAgICAgICAgICBjb21wYXJlX3RvLm5hbWUpCisgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgc2VsZi5wcmludF9iZW5jaG1hcmsoaGlkZW5vaXNlPWhpZGVub2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0bmFtZXM9bGltaXRuYW1lcykKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICMgUHJpbnQgaGVhZGVyCisgICAgICAgIGNvbXBhcmVfdG8ucHJpbnRfaGVhZGVyKCdDb21wYXJpbmcgd2l0aCcpCisgICAgICAgIHByaW50ICgnVGVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgJworICAgICAgICAgICAgICAgJyAgIG1pbmltdW0gcnVuLXRpbWUgICAgICAgIGF2ZXJhZ2UgIHJ1bi10aW1lJykKKyAgICAgICAgcHJpbnQgKCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAnICAgdGhpcyAgICBvdGhlciAgIGRpZmYgICAgdGhpcyAgICBvdGhlciAgIGRpZmYnKQorICAgICAgICBwcmludCAnLScgKiBMSU5FCisKKyAgICAgICAgIyBQcmludCB0ZXN0IGNvbXBhcmlzb25zCisgICAgICAgIHRlc3RzID0gc2VsZi50ZXN0cy5pdGVtcygpCisgICAgICAgIHRlc3RzLnNvcnQoKQorICAgICAgICB0b3RhbF9taW5fdGltZSA9IG90aGVyX3RvdGFsX21pbl90aW1lID0gMC4wCisgICAgICAgIHRvdGFsX2F2Z190aW1lID0gb3RoZXJfdG90YWxfYXZnX3RpbWUgPSAwLjAKKyAgICAgICAgYmVuY2htYXJrc19jb21wYXRpYmxlID0gc2VsZi5jb21wYXRpYmxlKGNvbXBhcmVfdG8pCisgICAgICAgIHRlc3RzX2NvbXBhdGlibGUgPSAxCisgICAgICAgIGZvciBuYW1lLCB0ZXN0IGluIHRlc3RzOgorICAgICAgICAgICAgaWYgKGxpbWl0bmFtZXMgaXMgbm90IE5vbmUgYW5kCisgICAgICAgICAgICAgICAgbGltaXRuYW1lcy5zZWFyY2gobmFtZSkgaXMgTm9uZSk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIChtaW5fdGltZSwKKyAgICAgICAgICAgICBhdmdfdGltZSwKKyAgICAgICAgICAgICB0b3RhbF90aW1lLAorICAgICAgICAgICAgIG9wX2F2ZywKKyAgICAgICAgICAgICBtaW5fb3ZlcmhlYWQpID0gdGVzdC5zdGF0KCkKKyAgICAgICAgICAgIHRvdGFsX21pbl90aW1lID0gdG90YWxfbWluX3RpbWUgKyBtaW5fdGltZQorICAgICAgICAgICAgdG90YWxfYXZnX3RpbWUgPSB0b3RhbF9hdmdfdGltZSArIGF2Z190aW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3RoZXIgPSBjb21wYXJlX3RvLnRlc3RzW25hbWVdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgb3RoZXIgPSBOb25lCisgICAgICAgICAgICBpZiBvdGhlciBpcyBOb25lOgorICAgICAgICAgICAgICAgICMgT3RoZXIgYmVuY2htYXJrIGRvZXNuJ3QgaW5jbHVkZSB0aGUgZ2l2ZW4gdGVzdAorICAgICAgICAgICAgICAgIG1pbl9kaWZmLCBhdmdfZGlmZiA9ICduL2EnLCAnbi9hJworICAgICAgICAgICAgICAgIG90aGVyX21pbl90aW1lID0gMC4wCisgICAgICAgICAgICAgICAgb3RoZXJfYXZnX3RpbWUgPSAwLjAKKyAgICAgICAgICAgICAgICB0ZXN0c19jb21wYXRpYmxlID0gMAogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBwcmludCAnJTMwczogJTkuMmYgbXMgICAgICAgICAgICAgICAgICAgIG4vYScgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKCdOb3Rpb25hbCBtaW5pbXVtIHJvdW5kIHRpbWUnLCB0b3RhbG1pbnRpbWUgKiAxMDAwLjApCisgICAgICAgICAgICAgICAgKG90aGVyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICBvdGhlcl9hdmdfdGltZSwKKyAgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxfdGltZSwKKyAgICAgICAgICAgICAgICAgb3RoZXJfb3BfYXZnLAorICAgICAgICAgICAgICAgICBvdGhlcl9taW5fb3ZlcmhlYWQpID0gb3RoZXIuc3RhdCgpCisgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxfbWluX3RpbWUgPSBvdGhlcl90b3RhbF9taW5fdGltZSArIG90aGVyX21pbl90aW1lCisgICAgICAgICAgICAgICAgb3RoZXJfdG90YWxfYXZnX3RpbWUgPSBvdGhlcl90b3RhbF9hdmdfdGltZSArIG90aGVyX2F2Z190aW1lCisgICAgICAgICAgICAgICAgaWYgKGJlbmNobWFya3NfY29tcGF0aWJsZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgdGVzdC5jb21wYXRpYmxlKG90aGVyKSk6CisgICAgICAgICAgICAgICAgICAgICMgQm90aCBiZW5jaG1hcmsgYW5kIHRlc3RzIGFyZSBjb21wYXJpYmxlCisgICAgICAgICAgICAgICAgICAgIG1pbl9kaWZmID0gKChtaW5fdGltZSAqIHNlbGYud2FycCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXJfbWluX3RpbWUgKiBvdGhlci53YXJwKSAtIDEuMCkKKyAgICAgICAgICAgICAgICAgICAgYXZnX2RpZmYgPSAoKGF2Z190aW1lICogc2VsZi53YXJwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl9hdmdfdGltZSAqIG90aGVyLndhcnApIC0gMS4wKQorICAgICAgICAgICAgICAgICAgICBpZiBoaWRlbm9pc2UgYW5kIGFicyhtaW5fZGlmZikgPCAxMC4wOgorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2RpZmYgPSAnJworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWluX2RpZmYgPSAnJSs1LjFmJSUnICUgKG1pbl9kaWZmICogUEVSQ0VOVCkKKyAgICAgICAgICAgICAgICAgICAgaWYgaGlkZW5vaXNlIGFuZCBhYnMoYXZnX2RpZmYpIDwgMTAuMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19kaWZmID0gJycKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2Z19kaWZmID0gJyUrNS4xZiUlJyAlIChhdmdfZGlmZiAqIFBFUkNFTlQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgIyBCZW5jaG1hcmsgb3IgdGVzdHMgYXJlIG5vdCBjb21wYXJpYmxlCisgICAgICAgICAgICAgICAgICAgIG1pbl9kaWZmLCBhdmdfZGlmZiA9ICduL2EnLCAnbi9hJworICAgICAgICAgICAgICAgICAgICB0ZXN0c19jb21wYXRpYmxlID0gMAorICAgICAgICAgICAgcHJpbnQgJyUzMHM6ICU1LjBmbXMgJTUuMGZtcyAlN3MgJTUuMGZtcyAlNS4wZm1zICU3cycgJSBcCisgICAgICAgICAgICAgICAgICAobmFtZSwKKyAgICAgICAgICAgICAgICAgICBtaW5fdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgb3RoZXJfbWluX3RpbWUgKiBNSUxMSV9TRUNPTkRTICogY29tcGFyZV90by53YXJwIC8gc2VsZi53YXJwLAorICAgICAgICAgICAgICAgICAgIG1pbl9kaWZmLAorICAgICAgICAgICAgICAgICAgIGF2Z190aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAgICBvdGhlcl9hdmdfdGltZSAqIE1JTExJX1NFQ09ORFMgKiBjb21wYXJlX3RvLndhcnAgLyBzZWxmLndhcnAsCisgICAgICAgICAgICAgICAgICAgYXZnX2RpZmYpCisgICAgICAgIHByaW50ICctJyAqIExJTkUKKworICAgICAgICAjIFN1bW1hcmlzZSB0ZXN0IHJlc3VsdHMKKyAgICAgICAgaWYgbm90IGJlbmNobWFya3NfY29tcGF0aWJsZSBvciBub3QgdGVzdHNfY29tcGF0aWJsZToKKyAgICAgICAgICAgIG1pbl9kaWZmLCBhdmdfZGlmZiA9ICduL2EnLCAnbi9hJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgb3RoZXJfdG90YWxfbWluX3RpbWUgIT0gMC4wOgorICAgICAgICAgICAgICAgIG1pbl9kaWZmID0gJyUrNS4xZiUlJyAlICgKKyAgICAgICAgICAgICAgICAgICAgKCh0b3RhbF9taW5fdGltZSAqIHNlbGYud2FycCkgLworICAgICAgICAgICAgICAgICAgICAgKG90aGVyX3RvdGFsX21pbl90aW1lICogY29tcGFyZV90by53YXJwKSAtIDEuMCkgKiBQRVJDRU5UKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtaW5fZGlmZiA9ICduL2EnCisgICAgICAgICAgICBpZiBvdGhlcl90b3RhbF9hdmdfdGltZSAhPSAwLjA6CisgICAgICAgICAgICAgICAgYXZnX2RpZmYgPSAnJSs1LjFmJSUnICUgKAorICAgICAgICAgICAgICAgICAgICAoKHRvdGFsX2F2Z190aW1lICogc2VsZi53YXJwKSAvCisgICAgICAgICAgICAgICAgICAgICAob3RoZXJfdG90YWxfYXZnX3RpbWUgKiBjb21wYXJlX3RvLndhcnApIC0gMS4wKSAqIFBFUkNFTlQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGF2Z19kaWZmID0gJ24vYScKKyAgICAgICAgcHJpbnQgKCdUb3RhbHM6ICAgICAgICAgICAgICAgICAgICAgICAnCisgICAgICAgICAgICAgICAnICAlNS4wZm1zICU1LjBmbXMgJTdzICU1LjBmbXMgJTUuMGZtcyAlN3MnICUKKyAgICAgICAgICAgICAgICh0b3RhbF9taW5fdGltZSAqIE1JTExJX1NFQ09ORFMsCisgICAgICAgICAgICAgICAgKG90aGVyX3RvdGFsX21pbl90aW1lICogY29tcGFyZV90by53YXJwL3NlbGYud2FycAorICAgICAgICAgICAgICAgICAqIE1JTExJX1NFQ09ORFMpLAorICAgICAgICAgICAgICAgIG1pbl9kaWZmLAorICAgICAgICAgICAgICAgIHRvdGFsX2F2Z190aW1lICogTUlMTElfU0VDT05EUywKKyAgICAgICAgICAgICAgICAob3RoZXJfdG90YWxfYXZnX3RpbWUgKiBjb21wYXJlX3RvLndhcnAvc2VsZi53YXJwCisgICAgICAgICAgICAgICAgICogTUlMTElfU0VDT05EUyksCisgICAgICAgICAgICAgICAgYXZnX2RpZmYKKyAgICAgICAgICAgICAgICkpCiAgICAgICAgIHByaW50Ci0KLWRlZiBwcmludF9tYWNoaW5lKCk6Ci0KLSAgICBpbXBvcnQgcGxhdGZvcm0KLSAgICBwcmludCAnTWFjaGluZSBEZXRhaWxzOicKLSAgICBwcmludCAnICAgUGxhdGZvcm0gSUQ6ICAlcycgJSBwbGF0Zm9ybS5wbGF0Zm9ybSgpCi0gICAgcHJpbnQgJyAgIEV4ZWN1dGFibGU6ICAgJXMnICUgc3lzLmV4ZWN1dGFibGUKLSAgICAjIFRoZXJlJ3MgYSBidWcgaW4gUHl0aG9uIDIuMmIxKy4uLgotICAgIGlmIHN5cy52ZXJzaW9uWzo2XSA9PSAnMi4yYjErJzoKLSAgICAgICAgcmV0dXJuCi0gICAgcHJpbnQgJyAgIFB5dGhvbjogICAgICAgJXMnICUgcGxhdGZvcm0ucHl0aG9uX3ZlcnNpb24oKQotICAgIHByaW50ICcgICBDb21waWxlcjogICAgICVzJyAlIHBsYXRmb3JtLnB5dGhvbl9jb21waWxlcigpCi0gICAgYnVpbGRubywgYnVpbGRkYXRlID0gcGxhdGZvcm0ucHl0aG9uX2J1aWxkKCkKLSAgICBwcmludCAnICAgQnVpbGQ6ICAgICAgICAlcyAoIyVzKScgJSAoYnVpbGRkYXRlLCBidWlsZG5vKQorICAgICAgICBwcmludCAnKHRoaXM9JXMsIG90aGVyPSVzKScgJSAoc2VsZi5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZV90by5uYW1lKQorICAgICAgICBwcmludAogCiBjbGFzcyBQeUJlbmNoQ21kbGluZShBcHBsaWNhdGlvbik6CiAKQEAgLTM3MCw1MCArNzQ3LDY0IEBACiAKICAgICB2ZXJzaW9uID0gX192ZXJzaW9uX18KIAotICAgIG9wdGlvbnMgPSBbQXJndW1lbnRPcHRpb24oJy1uJywnbnVtYmVyIG9mIHJvdW5kcycsU2V0dXAuTnVtYmVyX29mX3JvdW5kcyksCi0gICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLWYnLCdzYXZlIGJlbmNobWFyayB0byBmaWxlIGFyZycsJycpLAotICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1jJywnY29tcGFyZSBiZW5jaG1hcmsgd2l0aCB0aGUgb25lIGluIGZpbGUgYXJnJywnJyksCi0gICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLXMnLCdzaG93IGJlbmNobWFyayBpbiBmaWxlIGFyZywgdGhlbiBleGl0JywnJyksCi0gICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy1TJywnc2hvdyBzdGF0aXN0aWNzIG9mIGJlbmNobWFya3MnLDApLAotICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy13Jywnc2V0IHdhcnAgZmFjdG9yIHRvIGFyZycsU2V0dXAuV2FycF9mYWN0b3IpLAotICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctZCcsJ2hpZGUgbm9pc2UgaW4gY29tcGFyZXMnLCAwKSwKLSAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLXYnLCd2ZXJib3NlIG91dHB1dCAobm90IHJlY29tbWVuZGVkKScsIDApLAotICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctLW5vLWdjJywnZGlzYWJsZSBnYXJiYWdlIGNvbGxlY3Rpb24nLCAwKSwKLSAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS1uby1zeXNjaGVjaycsCi0gICAgICAgICAgICAgICAgICAgICciZGlzYWJsZSIgc3lzIGNoZWNrIGludGVydmFsIChzZXQgdG8gc3lzLm1heGludCknLCAwKSwKLSAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctdCcsICd0ZXN0cyBjb250YWluaW5nIHN1YnN0cmluZycsICcnKSwKLSAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctQycsICdudW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucycsIDIwKQorICAgIGRlYnVnID0gX2RlYnVnCisKKyAgICBvcHRpb25zID0gW0FyZ3VtZW50T3B0aW9uKCctbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtYmVyIG9mIHJvdW5kcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cC5OdW1iZXJfb2Zfcm91bmRzKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctZicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2F2ZSBiZW5jaG1hcmsgdG8gZmlsZSBhcmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1jJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb21wYXJlIGJlbmNobWFyayB3aXRoIHRoZSBvbmUgaW4gZmlsZSBhcmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycpLAorICAgICAgICAgICAgICAgQXJndW1lbnRPcHRpb24oJy1zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaG93IGJlbmNobWFyayBpbiBmaWxlIGFyZywgdGhlbiBleGl0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctdycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0IHdhcnAgZmFjdG9yIHRvIGFyZycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR1cC5XYXJwX2ZhY3RvciksCisgICAgICAgICAgICAgICBBcmd1bWVudE9wdGlvbignLXQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3J1biBvbmx5IHRlc3RzIHdpdGggbmFtZXMgbWF0Y2hpbmcgYXJnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctQycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2V0IHRoZSBudW1iZXIgb2YgY2FsaWJyYXRpb24gcnVucyB0byBhcmcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0FMSUJSQVRJT05fUlVOUyksCisgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy1kJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGlkZSBub2lzZSBpbiBjb21wYXJpc29ucycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCksCisgICAgICAgICAgICAgICBTd2l0Y2hPcHRpb24oJy12JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zZSBvdXRwdXQgKG5vdCByZWNvbW1lbmRlZCknLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApLAorICAgICAgICAgICAgICAgU3dpdGNoT3B0aW9uKCctLXdpdGgtZ2MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlbmFibGUgZ2FyYmFnZSBjb2xsZWN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKKyAgICAgICAgICAgICAgIFN3aXRjaE9wdGlvbignLS13aXRoLXN5c2NoZWNrJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIGRlZmF1bHQgc3lzIGNoZWNrIGludGVydmFsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKSwKKyAgICAgICAgICAgICAgIEFyZ3VtZW50T3B0aW9uKCctLXRpbWVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndXNlIGdpdmVuIHRpbWVyJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUSU1FUl9QTEFURk9STV9ERUZBVUxUKSwKICAgICAgICAgICAgICAgIF0KIAogICAgIGFib3V0ID0gIiIiXAogVGhlIG5vcm1hbCBvcGVyYXRpb24gaXMgdG8gcnVuIHRoZSBzdWl0ZSBhbmQgZGlzcGxheSB0aGUKLXJlc3VsdHMuIFVzZSAtZiB0byBzYXZlIHRoZW0gZm9yIGxhdGVyIHJldXNlIG9yIGNvbXBhcmlzbXMuCityZXN1bHRzLiBVc2UgLWYgdG8gc2F2ZSB0aGVtIGZvciBsYXRlciByZXVzZSBvciBjb21wYXJpc29ucy4KKworQXZhaWxhYmxlIHRpbWVyczoKKworICAgdGltZS50aW1lCisgICB0aW1lLmNsb2NrCisgICBzeXN0aW1lcy5wcm9jZXNzdGltZQogCiBFeGFtcGxlczoKIAotcHl0aG9uMS41IHB5YmVuY2gucHkgLXcgMTAwIC1mIHAxNQotcHl0aG9uMS40IHB5YmVuY2gucHkgLXcgMTAwIC1mIHAxNAotcHl0aG9uIHB5YmVuY2gucHkgLXMgcDE1IC1jIHAxNAorcHl0aG9uMi4xIHB5YmVuY2gucHkgLWYgcDIxLnB5YmVuY2gKK3B5dGhvbjIuNSBweWJlbmNoLnB5IC1mIHAyNS5weWJlbmNoCitweXRob24gcHliZW5jaC5weSAtcyBwMjUucHliZW5jaCAtYyBwMjEucHliZW5jaAogIiIiCiAgICAgY29weXJpZ2h0ID0gX19jb3B5cmlnaHRfXwogCi0gICAgZGVmIGhhbmRsZV9TKHNlbGYsIHZhbHVlKToKLQotICAgICAgICAiIiIgRGlzcGxheSBvbmUgbGluZSBzdGF0cyBmb3IgZWFjaCBiZW5jaG1hcmsgZmlsZSBnaXZlbiBvbiB0aGUKLSAgICAgICAgICAgIGNvbW1hbmQgbGluZS4KLQotICAgICAgICAiIiIKLSAgICAgICAgZm9yIGJlbmNobWFyayBpbiBzZWxmLmZpbGVzOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGYgPSBvcGVuKGJlbmNobWFyaywgJ3JiJykKLSAgICAgICAgICAgICAgICBiZW5jaCA9IHBpY2tsZS5sb2FkKGYpCi0gICAgICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKLSAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3JlYWRpbmcgZmlsZSAlcycgJSByZXByKGJlbmNobWFyaykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyVzLCUtLjJmLG1zJyAlIChiZW5jaG1hcmssIGJlbmNoLnJvdW5kdGltZSoxMDAwLjApCi0gICAgICAgIHJldHVybiAwCi0KICAgICBkZWYgbWFpbihzZWxmKToKIAogICAgICAgICByb3VuZHMgPSBzZWxmLnZhbHVlc1snLW4nXQpAQCAtNDIxLDM4ICs4MTIsNTIgQEAKICAgICAgICAgc2hvd19iZW5jaCA9IHNlbGYudmFsdWVzWyctcyddCiAgICAgICAgIGNvbXBhcmVfdG8gPSBzZWxmLnZhbHVlc1snLWMnXQogICAgICAgICBoaWRlbm9pc2UgPSBzZWxmLnZhbHVlc1snLWQnXQotICAgICAgICB3YXJwID0gc2VsZi52YWx1ZXNbJy13J10KLSAgICAgICAgbm9nYyA9IHNlbGYudmFsdWVzWyctLW5vLWdjJ10KKyAgICAgICAgd2FycCA9IGludChzZWxmLnZhbHVlc1snLXcnXSkKKyAgICAgICAgd2l0aGdjID0gc2VsZi52YWx1ZXNbJy0td2l0aC1nYyddCiAgICAgICAgIGxpbWl0bmFtZXMgPSBzZWxmLnZhbHVlc1snLXQnXQorICAgICAgICBpZiBsaW1pdG5hbWVzOgorICAgICAgICAgICAgaWYgX2RlYnVnOgorICAgICAgICAgICAgICAgIHByaW50ICcqIGxpbWl0aW5nIHRlc3QgbmFtZXMgdG8gb25lIHdpdGggc3Vic3RyaW5nICIlcyInICUgXAorICAgICAgICAgICAgICAgICAgICAgIGxpbWl0bmFtZXMKKyAgICAgICAgICAgIGxpbWl0bmFtZXMgPSByZS5jb21waWxlKGxpbWl0bmFtZXMsIHJlLkkpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW1pdG5hbWVzID0gTm9uZQogICAgICAgICB2ZXJib3NlID0gc2VsZi52ZXJib3NlCi0gICAgICAgIG5vc3lzY2hlY2sgPSBzZWxmLnZhbHVlc1snLS1uby1zeXNjaGVjayddCi0gICAgICAgIGNydW5zID0gc2VsZi52YWx1ZXNbJy1DJ10KLSAgICAgICAgcHJpbnQgIkNSVU5TOiIsIGNydW5zCisgICAgICAgIHdpdGhzeXNjaGVjayA9IHNlbGYudmFsdWVzWyctLXdpdGgtc3lzY2hlY2snXQorICAgICAgICBjYWxpYnJhdGlvbl9ydW5zID0gc2VsZi52YWx1ZXNbJy1DJ10KKyAgICAgICAgdGltZXIgPSBzZWxmLnZhbHVlc1snLS10aW1lciddCiAKLSAgICAgICAgcHJpbnQgJ1BZQkVOQ0gnLF9fdmVyc2lvbl9fCisgICAgICAgIHByaW50ICctJyAqIExJTkUKKyAgICAgICAgcHJpbnQgJ1BZQkVOQ0ggJXMnICUgX192ZXJzaW9uX18KKyAgICAgICAgcHJpbnQgJy0nICogTElORQorICAgICAgICBwcmludCAnKiB1c2luZyBQeXRob24gJXMnICUgKHN0cmluZy5zcGxpdChzeXMudmVyc2lvbilbMF0pCiAKLSAgICAgICAgIyBTd2l0Y2ggb2ZmIEdDCi0gICAgICAgIGlmIG5vZ2M6CisgICAgICAgICMgU3dpdGNoIG9mZiBnYXJiYWdlIGNvbGxlY3Rpb24KKyAgICAgICAgaWYgbm90IHdpdGhnYzoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBpbXBvcnQgZ2MKICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICAgICBub2djID0gMAorICAgICAgICAgICAgICAgIHByaW50ICcqIFB5dGhvbiB2ZXJzaW9uIGRvZXNuXCd0IHN1cHBvcnQgZ2FyYmFnZSBjb2xsZWN0aW9uJwogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlc1snLS1uby1nYyddOgotICAgICAgICAgICAgICAgICAgICBnYy5kaXNhYmxlKCkKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ05PIEdDJworICAgICAgICAgICAgICAgIGdjLmRpc2FibGUoKQorICAgICAgICAgICAgICAgIHByaW50ICcqIGRpc2FibGVkIGdhcmJhZ2UgY29sbGVjdGlvbicKIAotICAgICAgICAjIG1heGltaXNlIHN5cyBjaGVjayBpbnRlcnZhbAotICAgICAgICBpZiBub3N5c2NoZWNrOgotICAgICAgICAgICAgc3lzLnNldGNoZWNraW50ZXJ2YWwoc3lzLm1heGludCkKLSAgICAgICAgICAgIHByaW50ICdDSEVDS0lOVEVSVkFMID0nLCBzeXMubWF4aW50CisgICAgICAgICMgIkRpc2FibGUiIHN5cyBjaGVjayBpbnRlcnZhbAorICAgICAgICBpZiBub3Qgd2l0aHN5c2NoZWNrOgorICAgICAgICAgICAgIyBUb28gYmFkIHRoZSBjaGVjayBpbnRlcnZhbCB1c2VzIGFuIGludCBpbnN0ZWFkIG9mIGEgbG9uZy4uLgorICAgICAgICAgICAgdmFsdWUgPSAyMTQ3NDgzNjQ3CisgICAgICAgICAgICBzeXMuc2V0Y2hlY2tpbnRlcnZhbCh2YWx1ZSkKKyAgICAgICAgICAgIHByaW50ICcqIHN5c3RlbSBjaGVjayBpbnRlcnZhbCBzZXQgdG8gbWF4aW11bTogJXMnICUgdmFsdWUKKworICAgICAgICBpZiB0aW1lciA9PSBUSU1FUl9TWVNUSU1FU19QUk9DRVNTVElNRToKKyAgICAgICAgICAgIGltcG9ydCBzeXN0aW1lcworICAgICAgICAgICAgcHJpbnQgJyogdXNpbmcgdGltZXI6IHN5c3RpbWVzLnByb2Nlc3N0aW1lICglcyknICUgXAorICAgICAgICAgICAgICAgICAgc3lzdGltZXMuU1lTVElNRVNfSU1QTEVNRU5UQVRJT04KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICcqIHVzaW5nIHRpbWVyOiAlcycgJSB0aW1lcgogCiAgICAgICAgIHByaW50CiAKLSAgICAgICAgaWYgbm90IGNvbXBhcmVfdG86Ci0gICAgICAgICAgICBwcmludF9tYWNoaW5lKCkKLSAgICAgICAgICAgIHByaW50Ci0KICAgICAgICAgaWYgY29tcGFyZV90bzoKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBmID0gb3Blbihjb21wYXJlX3RvLCdyYicpCkBAIC00NjAsOCArODY1LDEwIEBACiAgICAgICAgICAgICAgICAgYmVuY2gubmFtZSA9IGNvbXBhcmVfdG8KICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gYmVuY2gKLSAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgotICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlJyxjb21wYXJlX3RvCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgcmVhc29uOgorICAgICAgICAgICAgICAgIHByaW50ICcqIEVycm9yIG9wZW5pbmcvcmVhZGluZyBmaWxlICVzOiAlcycgJSAoCisgICAgICAgICAgICAgICAgICAgIHJlcHIoY29tcGFyZV90byksCisgICAgICAgICAgICAgICAgICAgIHJlYXNvbikKICAgICAgICAgICAgICAgICBjb21wYXJlX3RvID0gTm9uZQogCiAgICAgICAgIGlmIHNob3dfYmVuY2g6CkBAIC00NzAsMzcgKzg3Nyw1MiBAQAogICAgICAgICAgICAgICAgIGJlbmNoID0gcGlja2xlLmxvYWQoZikKICAgICAgICAgICAgICAgICBiZW5jaC5uYW1lID0gc2hvd19iZW5jaAogICAgICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgICAgIHByaW50ICdCZW5jaG1hcms6ICVzIChyb3VuZHM9JWksIHdhcnA9JWkpJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAoYmVuY2gubmFtZSxiZW5jaC5yb3VuZHMsYmVuY2gud2FycCkKLSAgICAgICAgICAgICAgICBwcmludAotICAgICAgICAgICAgICAgIGJlbmNoLnByaW50X3N0YXQoY29tcGFyZV90bywgaGlkZW5vaXNlKQorICAgICAgICAgICAgICAgIGJlbmNoLnByaW50X2hlYWRlcigpCisgICAgICAgICAgICAgICAgaWYgY29tcGFyZV90bzoKKyAgICAgICAgICAgICAgICAgICAgYmVuY2gucHJpbnRfY29tcGFyaXNvbihjb21wYXJlX3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVub2lzZT1oaWRlbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcz1saW1pdG5hbWVzKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJlbmNoLnByaW50X2JlbmNobWFyayhoaWRlbm9pc2U9aGlkZW5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRuYW1lcz1saW1pdG5hbWVzKQogICAgICAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJyogRXJyb3Igb3BlbmluZy9yZWFkaW5nIGZpbGUnLHNob3dfYmVuY2gKKyAgICAgICAgICAgICAgICBwcmludCAnKiBFcnJvciBvcGVuaW5nL3JlYWRpbmcgZmlsZSAlczogJXMnICUgKAorICAgICAgICAgICAgICAgICAgICByZXByKHNob3dfYmVuY2gpLAorICAgICAgICAgICAgICAgICAgICByZWFzb24pCiAgICAgICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgIHJldHVybgogCiAgICAgICAgIGlmIHJlcG9ydGZpbGU6Ci0gICAgICAgICAgICBpZiBub2djOgotICAgICAgICAgICAgICAgIHByaW50ICdCZW5jaG1hcms6ICVzIChyb3VuZHM9JWksIHdhcnA9JWksIG5vIEdDKScgJSBcCi0gICAgICAgICAgICAgICAgICAgICAgKHJlcG9ydGZpbGUscm91bmRzLHdhcnApCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICdCZW5jaG1hcms6ICVzIChyb3VuZHM9JWksIHdhcnA9JWkpJyAlIFwKLSAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0ZmlsZSxyb3VuZHMsd2FycCkKKyAgICAgICAgICAgIHByaW50ICdDcmVhdGluZyBiZW5jaG1hcms6ICVzIChyb3VuZHM9JWksIHdhcnA9JWkpJyAlIFwKKyAgICAgICAgICAgICAgICAgIChyZXBvcnRmaWxlLCByb3VuZHMsIHdhcnApCiAgICAgICAgICAgICBwcmludAogCiAgICAgICAgICMgQ3JlYXRlIGJlbmNobWFyayBvYmplY3QKLSAgICAgICAgYmVuY2ggPSBCZW5jaG1hcmsoKQorICAgICAgICBiZW5jaCA9IEJlbmNobWFyayhyZXBvcnRmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJib3NlPXZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVyPXRpbWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB3YXJwPXdhcnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGlicmF0aW9uX3J1bnM9Y2FsaWJyYXRpb25fcnVucykKICAgICAgICAgYmVuY2gucm91bmRzID0gcm91bmRzCi0gICAgICAgIGJlbmNoLmxvYWRfdGVzdHMoU2V0dXAsIHdhcnAsIGxpbWl0bmFtZXMsIHZlcmJvc2UpCisgICAgICAgIGJlbmNoLmxvYWRfdGVzdHMoU2V0dXAsIGxpbWl0bmFtZXM9bGltaXRuYW1lcykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgYmVuY2gucnVuKHZlcmJvc2UsIGNydW5zKQorICAgICAgICAgICAgYmVuY2guY2FsaWJyYXRlKCkKKyAgICAgICAgICAgIGJlbmNoLnJ1bigpCiAgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKICAgICAgICAgICAgIHByaW50CiAgICAgICAgICAgICBwcmludCAnKioqIEtleWJvYXJkSW50ZXJydXB0IC0tIEFib3J0aW5nJwogICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBiZW5jaC5wcmludF9zdGF0KGNvbXBhcmVfdG8pCi0gICAgICAgICMgcmluZyBiZWxsCisgICAgICAgIGJlbmNoLnByaW50X2hlYWRlcigpCisgICAgICAgIGlmIGNvbXBhcmVfdG86CisgICAgICAgICAgICBiZW5jaC5wcmludF9jb21wYXJpc29uKGNvbXBhcmVfdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGVub2lzZT1oaWRlbm9pc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0bmFtZXM9bGltaXRuYW1lcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJlbmNoLnByaW50X2JlbmNobWFyayhoaWRlbm9pc2U9aGlkZW5vaXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0bmFtZXM9bGltaXRuYW1lcykKKworICAgICAgICAjIFJpbmcgYmVsbAogICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCdcMDA3JykKIAogICAgICAgICBpZiByZXBvcnRmaWxlOgpkaWZmIC0tZ2l0IGEvVG9vbHMvcHliZW5jaC9zeXN0aW1lcy5weSBiL1Rvb2xzL3B5YmVuY2gvc3lzdGltZXMucHkKaW5kZXggNzlkMjQ5Zi4uYmYwN2UzNiAxMDA2NDQKLS0tIGEvVG9vbHMvcHliZW5jaC9zeXN0aW1lcy5weQorKysgYi9Ub29scy9weWJlbmNoL3N5c3RpbWVzLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAgICAgcGxhdGZvcm1zLgogCiAgICAgSWYgbm8gc3VwcG9ydGVkIHRpbWluZyBtZXRob2RzIGJhc2VkIG9uIHByb2Nlc3MgdGltZSBjYW4gYmUgZm91bmQsCi0gICAgdGhlIG1vZHVsZSByZXZlcnRzIHRvIHRoZSBoaWdoZXN0IHJlc29sdXRpb24gd2FsbC10aW1lIHRpbWVyCisgICAgdGhlIG1vZHVsZSByZXZlcnRzIHRvIHRoZSBoaWdoZXN0IHJlc29sdXRpb24gd2FsbC1jbG9jayB0aW1lcgogICAgIGluc3RlYWQuIFRoZSBzeXN0ZW0gdGltZSBwYXJ0IHdpbGwgdGhlbiBhbHdheXMgYmUgMC4wLgogCiAgICAgVGhlIG1vZHVsZSBleHBvcnRzIG9uZSBwdWJsaWMgQVBJOgpAQCAtNTIsOCArNTIsOCBAQAogVVNFX1dJTjMyUFJPQ0VTU19HRVRQUk9DRVNTVElNRVMgPSAnd2luMzJwcm9jZXNzLkdldFByb2Nlc3NUaW1lcygpJwogVVNFX1JFU09VUkNFX0dFVFJVU0FHRSA9ICdyZXNvdXJjZS5nZXRydXNhZ2UoKScKIFVTRV9QUk9DRVNTX1RJTUVfQ0xPQ0sgPSAndGltZS5jbG9jaygpIChwcm9jZXNzIHRpbWUpJwotVVNFX1dBTExfVElNRV9DTE9DSyA9ICd0aW1lLmNsb2NrKCkgKHdhbGwtdGltZSknCi1VU0VfV0FMTF9USU1FX1RJTUUgPSAndGltZS50aW1lKCkgKHdhbGwtdGltZSknCitVU0VfV0FMTF9USU1FX0NMT0NLID0gJ3RpbWUuY2xvY2soKSAod2FsbC1jbG9jayknCitVU0VfV0FMTF9USU1FX1RJTUUgPSAndGltZS50aW1lKCkgKHdhbGwtY2xvY2spJwogCiBpZiBzeXMucGxhdGZvcm1bOjNdID09ICd3aW4nOgogICAgICMgV2luZG93cyBwbGF0Zm9ybQpAQCAtNjMsNyArNjMsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpbXBvcnQgY3R5cGVzCiAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICAgICAgICAgICMgVXNlIHRoZSB3YWxsLXRpbWUgaW1wbGVtZW50YXRpb24gdGltZS5jbG9jaygpLCBzaW5jZSB0aGlzCisgICAgICAgICAgICAjIFVzZSB0aGUgd2FsbC1jbG9jayBpbXBsZW1lbnRhdGlvbiB0aW1lLmNsb2NrKCksIHNpbmNlIHRoaXMKICAgICAgICAgICAgICMgaXMgdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiBjbG9jayBhdmFpbGFibGUgb24gV2luZG93cwogICAgICAgICAgICAgU1lTVElNRVNfSU1QTEVNRU5UQVRJT04gPSBVU0VfV0FMTF9USU1FX0NMT0NLCiAgICAgICAgIGVsc2U6CkBAIC05MSw3ICs5MSw3IEBACiAgICAgICAgICMgdGltZSkKICAgICAgICAgU1lTVElNRVNfSU1QTEVNRU5UQVRJT04gPSBVU0VfUFJPQ0VTU19USU1FX0NMT0NLCiAgICAgZWxzZToKLSAgICAgICAgIyBVc2Ugd2FsbC10aW1lIGltcGxlbWVudGF0aW9uIHRpbWUudGltZSgpIHNpbmNlIHRoaXMgcHJvdmlkZXMKKyAgICAgICAgIyBVc2Ugd2FsbC1jbG9jayBpbXBsZW1lbnRhdGlvbiB0aW1lLnRpbWUoKSBzaW5jZSB0aGlzIHByb3ZpZGVzCiAgICAgICAgICMgdGhlIGhpZ2hlc3QgcmVzb2x1dGlvbiBjbG9jayBvbiBtb3N0IHN5c3RlbXMKICAgICAgICAgU1lTVElNRVNfSU1QTEVNRU5UQVRJT04gPSBVU0VfV0FMTF9USU1FX1RJTUUKIApAQCAtMTAzLDI0ICsxMDMsMjcgQEAKIGRlZiBwcm9jZXNzX3RpbWVfY2xvY2tfc3lzdGltZXMoKToKICAgICByZXR1cm4gKHRpbWUuY2xvY2soKSwgMC4wKQogCi1kZWYgd2FsbF90aW1lX2Nsb2NrX3N5c3RpbWVzKCk6CitkZWYgd2FsbF9jbG9ja19jbG9ja19zeXN0aW1lcygpOgogICAgIHJldHVybiAodGltZS5jbG9jaygpLCAwLjApCiAKLWRlZiB3YWxsX3RpbWVfdGltZV9zeXN0aW1lcygpOgorZGVmIHdhbGxfY2xvY2tfdGltZV9zeXN0aW1lcygpOgogICAgIHJldHVybiAodGltZS50aW1lKCksIDAuMCkKIAogIyBOdW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlY29uZCBmb3IgdGhlIHZhbHVlcyByZXR1cm5lZAogIyBieSBHZXRQcm9jZXNzVGltZXMoKSBvbiBXaW5kb3dzLgogIwotIyBOb3RlOiBUaWNrcyByZXR1cm5lZCBieSBHZXRQcm9jZXNzVGltZXMoKSBhcmUgbWljcm8tc2Vjb25kcyBvbgotIyBXaW5kb3dzIFhQICh0aG91Z2ggdGhlIGRvY3Mgc2F5IDEwMG5zIGludGVydmFscykKLVdJTjMyX1BST0NFU1NfVElNRVNfVElDS1NfUEVSX1NFQ09ORCA9IDEwZTYKKyMgTm90ZTogVGlja3MgcmV0dXJuZWQgYnkgR2V0UHJvY2Vzc1RpbWVzKCkgYXJlIDEwMG5zIGludGVydmFscyBvbgorIyBXaW5kb3dzIFhQLiBIb3dldmVyLCB0aGUgcHJvY2VzcyB0aW1lcyBhcmUgb25seSB1cGRhdGVkIHdpdGggZXZlcnkKKyMgY2xvY2sgdGljayBhbmQgdGhlIGZyZXF1ZW5jeSBvZiB0aGVzZSBpcyBzb21ld2hhdCBsb3dlcjogZGVwZW5kaW5nCisjIG9uIHRoZSBPUyB2ZXJzaW9uIGJldHdlZW4gMTBtcyBhbmQgMTVtcy4gRXZlbiB3b3JzZSwgdGhlIHByb2Nlc3MKKyMgdGltZSBzZWVtcyB0byBiZSBhbGxvY2F0ZWQgdG8gcHJvY2VzcyBjdXJyZW50bHkgcnVubmluZyB3aGVuIHRoZQorIyBjbG9jayBpbnRlcnJ1cHQgYXJyaXZlcywgaWUuIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGN1cnJlbnQgdGltZQorIyBzbGljZSBnZXRzIGFjY291bnRlZCB0byBhIGRpZmZlcmVudCBwcm9jZXNzLgorCitXSU4zMl9QUk9DRVNTX1RJTUVTX1RJQ0tTX1BFUl9TRUNPTkQgPSAxZTcKIAogZGVmIHdpbjMycHJvY2Vzc19nZXRwcm9jZXNzdGltZXNfc3lzdGltZXMoKToKICAgICBkID0gd2luMzJwcm9jZXNzLkdldFByb2Nlc3NUaW1lcyh3aW4zMnByb2Nlc3MuR2V0Q3VycmVudFByb2Nlc3MoKSkKLSAgICAjIE5vdGU6IEknbSBub3Qgc3VyZSB3aGV0aGVyIEtlcm5lbFRpbWUgb24gV2luZG93cyBpcyB0aGUgc2FtZSBhcwotICAgICMgc3lzdGVtIHRpbWUgb24gVW5peCAtIEkndmUgeWV0IHRvIHNlZSBhIG5vbi16ZXJvIHZhbHVlIGZvcgotICAgICMgS2VybmVsVGltZSBvbiBXaW5kb3dzLgogICAgIHJldHVybiAoZFsnVXNlclRpbWUnXSAvIFdJTjMyX1BST0NFU1NfVElNRVNfVElDS1NfUEVSX1NFQ09ORCwKICAgICAgICAgICAgIGRbJ0tlcm5lbFRpbWUnXSAvIFdJTjMyX1BST0NFU1NfVElNRVNfVElDS1NfUEVSX1NFQ09ORCkKIApAQCAtMTQ5LDEwICsxNTIsMTAgQEAKICAgICBzeXN0aW1lcyA9IHByb2Nlc3NfdGltZV9jbG9ja19zeXN0aW1lcwogCiBlbGlmIFNZU1RJTUVTX0lNUExFTUVOVEFUSU9OIGlzIFVTRV9XQUxMX1RJTUVfQ0xPQ0s6Ci0gICAgc3lzdGltZXMgPSB3YWxsX3RpbWVfY2xvY2tfc3lzdGltZXMKKyAgICBzeXN0aW1lcyA9IHdhbGxfY2xvY2tfY2xvY2tfc3lzdGltZXMKIAogZWxpZiBTWVNUSU1FU19JTVBMRU1FTlRBVElPTiBpcyBVU0VfV0FMTF9USU1FX1RJTUU6Ci0gICAgc3lzdGltZXMgPSB3YWxsX3RpbWVfdGltZV9zeXN0aW1lcworICAgIHN5c3RpbWVzID0gd2FsbF9jbG9ja190aW1lX3N5c3RpbWVzCiAKIGVsaWYgU1lTVElNRVNfSU1QTEVNRU5UQVRJT04gaXMgVVNFX1dJTjMyUFJPQ0VTU19HRVRQUk9DRVNTVElNRVM6CiAgICAgc3lzdGltZXMgPSB3aW4zMnByb2Nlc3NfZ2V0cHJvY2Vzc3RpbWVzX3N5c3RpbWVzCkBAIC0xNjMsNiArMTY2LDE3IEBACiBlbHNlOgogICAgIHJhaXNlIFR5cGVFcnJvcignbm8gc3VpdGFibGUgc3lzdGltZXMoKSBpbXBsZW1lbnRhdGlvbiBmb3VuZCcpCiAKK2RlZiBwcm9jZXNzdGltZSgpOgorCisgICAgIiIiIFJldHVybiB0aGUgdG90YWwgdGltZSBzcGVudCBvbiB0aGUgcHJvY2Vzcy4KKworICAgICAgICBUaGlzIGlzIHRoZSBzdW0gb2YgdXNlciBhbmQgc3lzdGVtIHRpbWUgYXMgcmV0dXJuZWQgYnkKKyAgICAgICAgc3lzdGltZXMoKS4KKworICAgICIiIgorICAgIHVzZXIsIHN5c3RlbSA9IHN5c3RpbWVzKCkKKyAgICByZXR1cm4gdXNlciArIHN5c3RlbQorCiAjIyMgVGVzdGluZwogCiBkZWYgc29tZV93b3JrbG9hZCgpOgpkaWZmIC0tZ2l0IGEvVG9vbHMvc2NyaXB0cy9SRUFETUUgYi9Ub29scy9zY3JpcHRzL1JFQURNRQppbmRleCA1NmFhMzkxLi45YzdiNDBlIDEwMDY0NAotLS0gYS9Ub29scy9zY3JpcHRzL1JFQURNRQorKysgYi9Ub29scy9zY3JpcHRzL1JFQURNRQpAQCAtMjcsNyArMjcsNiBAQAogZml4bm90aWNlLnB5CQlGaXggdGhlIGNvcHlyaWdodCBub3RpY2UgaW4gc291cmNlIGZpbGVzCiBmaXhwcy5weQkJRml4IFB5dGhvbiBzY3JpcHRzJyBmaXJzdCBsaW5lIChpZiAjISkKIGZ0cG1pcnJvci5weQkJRlRQIG1pcnJvciBzY3JpcHQKLWdlbmNvZGVjLnB5CQlDcmVhdGUgUHl0aG9uIGNvZGVjcyBmcm9tIFVuaWNvZGUgbWFwcGluZyBmaWxlcwogZ29vZ2xlLnB5CQlPcGVuIGEgd2ViYnJvd3NlciB3aXRoIEdvb2dsZS4KIGdwcm9mMmh0bWwucHkJCVRyYW5zZm9ybSBncHJvZigxKSBvdXRwdXQgaW50byB1c2VmdWwgSFRNTC4KIGgycHkucHkJCQlUcmFuc2xhdGUgI2RlZmluZSdzIGludG8gUHl0aG9uIGFzc2lnbm1lbnRzCkBAIC01MywxNCArNTIsMTQgQEAKIHB0YWdzLnB5CQlDcmVhdGUgdmkgdGFncyBmaWxlIGZvciBQeXRob24gbW9kdWxlcwogcHlkb2MJCQlQeXRob24gZG9jdW1lbnRhdGlvbiBicm93c2VyLgogcHlzb3VyY2UucHkJCUZpbmQgUHl0aG9uIHNvdXJjZSBmaWxlcwotcmVkZW1vLnB5CQlCYXNpYyByZWd1bGFyIGV4cHJlc3Npb24gZGVtb3N0cmF0aW9uIGZhY2lsaXR5CityZWRlbW8ucHkJCUJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZW1vbnN0cmF0aW9uIGZhY2lsaXR5CiByZWluZGVudC5weQkJQ2hhbmdlIC5weSBmaWxlcyB0byB1c2UgNC1zcGFjZSBpbmRlbnRzLgogcmdyZXAucHkJCVJldmVyc2UgZ3JlcCB0aHJvdWdoIGEgZmlsZSAodXNlZnVsIGZvciBiaWcgbG9nZmlsZXMpCiBzZXR1cC5weQkJSW5zdGFsbCBhbGwgc2NyaXB0cyBsaXN0ZWQgaGVyZS4KIHN1ZmYucHkJCQlTb3J0IGEgbGlzdCBvZiBmaWxlcyBieSBzdWZmaXgKK3N2bmVvbC5weQkJU2V0cyBzdm46ZW9sLXN0eWxlIG9uIGFsbCBmaWxlcyBpbiBkaXJlY3RvcnkuCiB0ZXhjaGVjay5weSAgICAgICAgICAgICBWYWxpZGF0ZSBQeXRob24gTGFUZVggZm9ybWF0dGluZyAoUmF5bW9uZCBIZXR0aW5nZXIpCiB0ZXhpMmh0bWwucHkJCUNvbnZlcnQgR05VIHRleGluZm8gZmlsZXMgaW50byBIVE1MCi10cmFjZS5weQkJVHJhY2UgUHl0aG9uIHByb2dyYW0gb3IgZnVuY3Rpb24gZXhlY3V0aW9uCiB0cmVlc3luYy5weQkJU3luY2hyb25pemUgc291cmNlIHRyZWVzICh2ZXJ5IGlkZW9zeW5jcmF0aWMpCiB1bnRhYmlmeS5weQkJUmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIGluIGFyZ3VtZW50IGZpbGVzCiB3aGljaC5weQkJRmluZCBhIHByb2dyYW0gaW4gJFBBVEgKZGlmZiAtLWdpdCBhL1Rvb2xzL3dlYmNoZWNrZXIvd2ViY2hlY2tlci5weSBiL1Rvb2xzL3dlYmNoZWNrZXIvd2ViY2hlY2tlci5weQppbmRleCA3MTk5ZGE4Li45MjNlOGU2IDEwMDc1NQotLS0gYS9Ub29scy93ZWJjaGVja2VyL3dlYmNoZWNrZXIucHkKKysrIGIvVG9vbHMvd2ViY2hlY2tlci93ZWJjaGVja2VyLnB5CkBAIC03NjAsNyArNzYwLDggQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBuYW1lcyA9IG9zLmxpc3RkaXIocGF0aCkKICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgbXNnOgotICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsIG1zZywgc3lzLmV4Y190cmFjZWJhY2sKKyAgICAgICAgICAgICAgICBleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdGIgPSBzeXMuZXhjX2luZm8oKQorICAgICAgICAgICAgICAgIHJhaXNlIElPRXJyb3IsIG1zZywgZXhjX3RiCiAgICAgICAgICAgICBuYW1lcy5zb3J0KCkKICAgICAgICAgICAgIHMgPSBNeVN0cmluZ0lPKCJmaWxlOiIrdXJsLCB7J2NvbnRlbnQtdHlwZSc6ICd0ZXh0L2h0bWwnfSkKICAgICAgICAgICAgIHMud3JpdGUoJzxCQVNFIEhSRUY9ImZpbGU6JXMiPlxuJyAlCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggYjAyZWJjNi4uMDMzYmI2OCAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMSw3ICsxLDcgQEAKICMhIC9iaW4vc2gKLSMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQ2NzUzIC4KKyMgRnJvbSBjb25maWd1cmUuaW4gUmV2aXNpb246IDQ2NzU0IC4KICMgR3Vlc3MgdmFsdWVzIGZvciBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyBhbmQgY3JlYXRlIE1ha2VmaWxlcy4KLSMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZSBmb3IgcHl0aG9uIDMuMC4KKyMgR2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYwIGZvciBweXRob24gMy4wLgogIwogIyBSZXBvcnQgYnVncyB0byA8aHR0cDovL3d3dy5weXRob24ub3JnL3B5dGhvbi1idWdzPi4KICMKQEAgLTIzMyw4ICsyMzMsOCBAQAogCiAKICAgICAgIGZvciBhc19zaGVsbCBpbiAkYXNfY2FuZGlkYXRlX3NoZWxscyAkU0hFTEw7IGRvCi0JICMgVHJ5IG9ubHkgc2hlbGxzIHdoaWNoIGV4aXN0LCB0byBzYXZlIHNldmVyYWwgZm9ya3MuCi0JIGlmIHRlc3QgLWYgIiRhc19zaGVsbCIgJiYKKwkgIyBUcnkgb25seSBzaGVsbHMgdGhhdCBleGlzdCwgdG8gc2F2ZSBzZXZlcmFsIGZvcmtzLgorCSBpZiB7IHRlc3QgLWYgIiRhc19zaGVsbCIgfHwgdGVzdCAtZiAiJGFzX3NoZWxsLmV4ZSI7IH0gJiYKIAkJeyAoIiRhc19zaGVsbCIpIDI+IC9kZXYvbnVsbCA8PFxfQVNFT0YKICMgQmUgQm91cm5lIGNvbXBhdGlibGUKIGlmIHRlc3QgLW4gIiR7WlNIX1ZFUlNJT04rc2V0fSIgJiYgKGVtdWxhdGUgc2gpID4vZGV2L251bGwgMj4mMTsgdGhlbgpAQCAtMTQwOCw3ICsxNDA4LDcgQEAKIGlmICRhY19pbml0X3ZlcnNpb247IHRoZW4KICAgY2F0IDw8XF9BQ0VPRgogcHl0aG9uIGNvbmZpZ3VyZSAzLjAKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OWUKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MAogCiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTMsIDE5OTQsIDE5OTUsIDE5OTYsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsCiAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgpAQCAtMTQyMiw3ICsxNDIyLDcgQEAKIHJ1bm5pbmcgY29uZmlndXJlLCB0byBhaWQgZGVidWdnaW5nIGlmIGNvbmZpZ3VyZSBtYWtlcyBhIG1pc3Rha2UuCiAKIEl0IHdhcyBjcmVhdGVkIGJ5IHB5dGhvbiAkYXNfbWUgMy4wLCB3aGljaCB3YXMKLWdlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi41OWUuICBJbnZvY2F0aW9uIGNvbW1hbmQgbGluZSB3YXMKK2dlbmVyYXRlZCBieSBHTlUgQXV0b2NvbmYgMi42MC4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcwogCiAgICQgJDAgJEAKIApAQCAtMjAyMCw4ICsyMDIwLDggQEAKICAgIyBPbiBNYWMgT1MgWCAxMC40LCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRQogICAjIGRpc2FibGVzIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzIGJleW9uZCByZXBhaXIuCiAgICMgT24gTWFjIE9TIFggMTAuMywgZGVmaW5pbmcgX1BPU0lYX0NfU09VUkNFIG9yIF9YT1BFTl9TT1VSQ0UKLSAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5laW5nIHRoZW0KLSAgRGFyd2luL1s3OF0uKikKKyAgIyBoYXMgbm8gZWZmZWN0LCBkb24ndCBib3RoZXIgZGVmaW5pbmcgdGhlbQorICBEYXJ3aW4vWzc4OV0uKikKICAgICBkZWZpbmVfeG9wZW5fc291cmNlPW5vCiAgICAgOzsKIApAQCAtMjg0Niw3ICsyODQ2LDcgQEAKIAlhY19jb21waWxlcl9nbnU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogYWNfY3ZfY19jb21waWxlcl9nbnU9JGFjX2NvbXBpbGVyX2dudQogCiBmaQpAQCAtMzAzMiwxMyArMzAzMiwxMyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgICBhY19jX3dlcnJvcl9mbGFnPSRhY19zYXZlX2Nfd2Vycm9yX2ZsYWcKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9wcm9nX2NjX2ciID4mNQpAQCAtMzEwMyw2ICszMTAzLDExIEBACiAgICB0aGF0J3MgdHJ1ZSBvbmx5IHdpdGggLXN0ZC4gICovCiBpbnQgb3NmNF9jY19hcnJheSBbJ1x4MDAnID09IDAgPyAxIDogLTFdOwogCisvKiBJQk0gQyA2IGZvciBBSVggaXMgYWxtb3N0LUFOU0kgYnkgZGVmYXVsdCwgYnV0IGl0IHJlcGxhY2VzIG1hY3JvIHBhcmFtZXRlcnMKKyAgIGluc2lkZSBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLiAgKi8KKyNkZWZpbmUgRk9PKHgpICd4JworaW50IHhsYzZfY2NfYXJyYXlbRk9PKGEpID09ICd4JyA/IDEgOiAtMV07CisKIGludCB0ZXN0IChpbnQgaSwgZG91YmxlIHgpOwogc3RydWN0IHMxIHtpbnQgKCpmKSAoaW50IGEpO307CiBzdHJ1Y3QgczIge2ludCAoKmYpIChkb3VibGUgYSk7fTsKQEAgLTMxNjMsNyArMzE2OCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0CiAgIHRlc3QgIngkYWNfY3ZfcHJvZ19jY19jODkiICE9ICJ4bm8iICYmIGJyZWFrCiBkb25lCiBybSAtZiBjb25mdGVzdC4kYWNfZXh0CkBAIC01MTk5LDcgKzUyMDQsNyBAQAogCWFjX2N2X2hlYWRlcl9zdGRjPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgpAQCAtNTM5NSw3ICs1NDAwLDcgQEAKIAlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCiAJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CkBAIC01NDUwLDE0ICs1NDU1LDI0IEBACiAKIAogCi1mb3IgYWNfaGVhZGVyIGluIGFzbS90eXBlcy5oIGN1cnNlcy5oIGRsZmNuLmggZmNudGwuaCBncnAuaCBcCi1zaGFkb3cuaCBsYW5naW5mby5oIGxpYmludGwuaCBuY3Vyc2VzLmggcG9sbC5oIHB0aHJlYWQuaCBcCi1zdHJvcHRzLmggdGVybWlvcy5oIHRocmVhZC5oIFwKKworCisKKworCisKKworCitmb3IgYWNfaGVhZGVyIGluIGFzbS90eXBlcy5oIGNvbmlvLmggY3Vyc2VzLmggZGlyZWN0LmggZGxmY24uaCBlcnJuby5oIFwKK2ZjbnRsLmggZ3JwLmggXAorc2hhZG93LmggaW8uaCBsYW5naW5mby5oIGxpYmludGwuaCBuY3Vyc2VzLmggcG9sbC5oIHByb2Nlc3MuaCBwdGhyZWFkLmggXAorc2lnbmFsLmggc3Ryb3B0cy5oIHRlcm1pb3MuaCB0aHJlYWQuaCBcCiB1bmlzdGQuaCB1dGltZS5oIFwKIHN5cy9hdWRpb2lvLmggc3lzL2JzZHR0eS5oIHN5cy9maWxlLmggc3lzL2xvYWRhdmcuaCBzeXMvbG9jay5oIHN5cy9ta2Rldi5oIFwKIHN5cy9tb2RlbS5oIFwKLXN5cy9wYXJhbS5oIHN5cy9wb2xsLmggc3lzL3NlbGVjdC5oIHN5cy9zb2NrZXQuaCBzeXMvc3RhdHZmcy5oIHN5cy90aW1lLmggXAotc3lzL3RpbWVzLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIGxpYnV0aWwuaCBcCitzeXMvcGFyYW0uaCBzeXMvcG9sbC5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2V0Lmggc3lzL3N0YXR2ZnMuaCBzeXMvc3RhdC5oIFwKK3N5cy90aW1lLmggXAorc3lzL3RpbWVzLmggc3lzL3R5cGVzLmggc3lzL3VuLmggc3lzL3V0c25hbWUuaCBzeXMvd2FpdC5oIHB0eS5oIGxpYnV0aWwuaCBcCiBzeXMvcmVzb3VyY2UuaCBuZXRwYWNrZXQvcGFja2V0Lmggc3lzZXhpdHMuaCBibHVldG9vdGguaCBcCiBibHVldG9vdGgvYmx1ZXRvb3RoLmgKIGRvCkBAIC01NTI2LDcgKzU1NDEsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTU3MDAsNyArNTcxNSw3IEBACiAJZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAogCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQpAQCAtNTc5Myw3ICs1ODA4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQKICAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbmRpcitzZXR9IiA9IHNldDsgdGhlbgogICBicmVhawpAQCAtNTg5Myw3ICs1OTA4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQKICAgaWYgdGVzdCAiJHthY19jdl9zZWFyY2hfb3BlbmRpcitzZXR9IiA9IHNldDsgdGhlbgogICBicmVhawpAQCAtNTk3OSw3ICs1OTk0LDcgQEAKIAlhY19jdl9oZWFkZXJfc3lzX3R5cGVzX2hfbWFrZWRldj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmaQpAQCAtNjA1MCw3ICs2MDY1LDcgQEAKIAlhY19oZWFkZXJfY29tcGlsZXI9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19oZWFkZXJfY29tcGlsZXIiID4mNjsgfQogCkBAIC02MjE1LDcgKzYyMzAsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTYzODUsNyArNjQwMCw3IEBACiAJZXZhbCAiJGFzX2FjX0hlYWRlcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfSGVhZGVyJ30nYAogCSAgICAgICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19yZXMiID4mNQpAQCAtNjQ2OSw3ICs2NDg0LDcgQEAKIAlldmFsICIkYXNfYWNfSGVhZGVyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY19IZWFkZXInfSdgCiAJICAgICAgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX3JlcyIgPiY1CkBAIC02NTc0LDcgKzY1ODksNyBAQAogCWFjX2N2X2hhc19tYWtlZGV2PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBpZiB0ZXN0ICIkYWNfY3ZfaGFzX21ha2VkZXYiID0gIm5vIjsgdGhlbgogICAgICMgd2UgZGlkbid0IGxpbmssIHRyeSBpZiBfT1NGX1NPVVJDRSB3aWxsIGFsbG93IHVzIHRvIGxpbmsKQEAgLTY2MzgsNyArNjY1Myw3IEBACiAJYWNfY3ZfaGFzX21ha2VkZXY9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgICBpZiB0ZXN0ICIkYWNfY3ZfaGFzX21ha2VkZXYiID0gInllcyI7IHRoZW4KIApAQCAtNjcyOSw3ICs2NzQ0LDcgQEAKIAlzb2xfbGZzX2J1Zz15ZXMKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkc29sX2xmc19idWciID4mNQogZWNobyAiJHtFQ0hPX1R9JHNvbF9sZnNfYnVnIiA+JjY7IH0KIGlmIHRlc3QgIiRzb2xfbGZzX2J1ZyIgPSAieWVzIjsgdGhlbgpAQCAtNjgyNSw3ICs2ODQwLDcgQEAKIAlhY19jdl90eXBlX21vZGVfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9tb2RlX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbW9kZV90IiA+JjY7IH0KQEAgLTY5MDUsNyArNjkyMCw3IEBACiAJYWNfY3ZfdHlwZV9vZmZfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9vZmZfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9vZmZfdCIgPiY2OyB9CkBAIC02OTg1LDcgKzcwMDAsNyBAQAogCWFjX2N2X3R5cGVfcGlkX3Q9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfcGlkX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfcGlkX3QiID4mNjsgfQpAQCAtNzA2Myw3ICs3MDc4LDcgQEAKIAlhY19jdl90eXBlX3NpZ25hbD12b2lkCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NpZ25hbCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9zaWduYWwiID4mNjsgfQpAQCAtNzEzOSw3ICs3MTU0LDcgQEAKIAlhY19jdl90eXBlX3NpemVfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjY7IH0KQEAgLTcyNTcsNyArNzI3Miw3IEBACiAJYWNfY3ZfdHlwZV9zc2l6ZV90PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3NzaXplX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc3NpemVfdCIgPiY2OyB9CkBAIC03MzM4LDcgKzczNTMsNyBAQAogCWFjX2N2X3R5cGVfaW50PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2ludCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9pbnQiID4mNjsgfQpAQCAtNzQ3NCw3ICs3NDg5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC03NTk5LDcgKzc2MTQsNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWRgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtNzYwOCwxMCArNzYyMywxMCBAQAogCWFjX2xvPSBhY19oaT0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAjIEJpbmFyeSBzZWFyY2ggYmV0d2VlbiBsbyBhbmQgaGkgYm91bmRzLgogd2hpbGUgdGVzdCAieCRhY19sbyIgIT0gIngkYWNfaGkiOyBkbwogICBhY19taWQ9YGV4cHIgJygnICRhY19oaSAtICRhY19sbyAnKScgLyAyICsgJGFjX2xvYApAQCAtNzY3NSw3ICs3NjkwLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9pbnQ9JGFjX2xvOzsKQEAgLTc4MzgsNyArNzg1Myw3IEBACiAJYWNfY3ZfdHlwZV9sb25nPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2xvbmciID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZyIgPiY2OyB9CkBAIC03OTc0LDcgKzc5ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTgwOTksNyArODExNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC04MTA4LDEwICs4MTIzLDEwIEBACiAJYWNfbG89IGFjX2hpPQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCiAgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCkBAIC04MTc1LDcgKzgxOTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2xvbmc9JGFjX2xvOzsKQEAgLTgzMzgsNyArODM1Myw3IEBACiAJYWNfY3ZfdHlwZV92b2lkX3A9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfdm9pZF9wIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3ZvaWRfcCIgPiY2OyB9CkBAIC04NDc0LDcgKzg0ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTg1OTksNyArODYxNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC04NjA4LDEwICs4NjIzLDEwIEBACiAJYWNfbG89IGFjX2hpPQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCiAgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCkBAIC04Njc1LDcgKzg2OTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX3ZvaWRfcD0kYWNfbG87OwpAQCAtODgzOCw3ICs4ODUzLDcgQEAKIAlhY19jdl90eXBlX3Nob3J0PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX3Nob3J0IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3Nob3J0IiA+JjY7IH0KQEAgLTg5NzQsNyArODk4OSw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZCArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgZG9uZQogZWxzZQogICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQpAQCAtOTA5OSw3ICs5MTE0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTkxMDgsMTAgKzkxMjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTkxNzUsNyArOTE5MCw3IEBACiAJYWNfbG89YGV4cHIgJygnICRhY19taWQgJyknICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZG9uZQogY2FzZSAkYWNfbG8gaW4KID8qKSBhY19jdl9zaXplb2Zfc2hvcnQ9JGFjX2xvOzsKQEAgLTkzMzgsNyArOTM1Myw3IEBACiAJYWNfY3ZfdHlwZV9mbG9hdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9mbG9hdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9mbG9hdCIgPiY2OyB9CkBAIC05NDc0LDcgKzk0ODksNyBAQAogCQkJYWNfbWlkPWBleHByIDIgJyonICRhY19taWQgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAgIGRvbmUKIGVsc2UKICAgZWNobyAiJGFzX21lOiBmYWlsZWQgcHJvZ3JhbSB3YXM6IiA+JjUKQEAgLTk1OTksNyArOTYxNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC05NjA4LDEwICs5NjIzLDEwIEBACiAJYWNfbG89IGFjX2hpPQogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICMgQmluYXJ5IHNlYXJjaCBiZXR3ZWVuIGxvIGFuZCBoaSBib3VuZHMuCiB3aGlsZSB0ZXN0ICJ4JGFjX2xvIiAhPSAieCRhY19oaSI7IGRvCiAgIGFjX21pZD1gZXhwciAnKCcgJGFjX2hpIC0gJGFjX2xvICcpJyAvIDIgKyAkYWNfbG9gCkBAIC05Njc1LDcgKzk2OTAsNyBAQAogCWFjX2xvPWBleHByICcoJyAkYWNfbWlkICcpJyArIDFgCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGRvbmUKIGNhc2UgJGFjX2xvIGluCiA/KikgYWNfY3Zfc2l6ZW9mX2Zsb2F0PSRhY19sbzs7CkBAIC05ODM4LDcgKzk4NTMsNyBAQAogCWFjX2N2X3R5cGVfZG91YmxlPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl90eXBlX2RvdWJsZSIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV9kb3VibGUiID4mNjsgfQpAQCAtOTk3NCw3ICs5OTg5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMDA5OSw3ICsxMDExNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMDEwOCwxMCArMTAxMjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTEwMTc1LDcgKzEwMTkwLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9kb3VibGU9JGFjX2xvOzsKQEAgLTEwMzM4LDcgKzEwMzUzLDcgQEAKIAlhY19jdl90eXBlX2Zwb3NfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9mcG9zX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfZnBvc190IiA+JjY7IH0KQEAgLTEwNDc0LDcgKzEwNDg5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMDU5OSw3ICsxMDYxNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMDYwOCwxMCArMTA2MjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTEwNjc1LDcgKzEwNjkwLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9mcG9zX3Q9JGFjX2xvOzsKQEAgLTEwODM4LDcgKzEwODUzLDcgQEAKIAlhY19jdl90eXBlX3NpemVfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9zaXplX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfc2l6ZV90IiA+JjY7IH0KQEAgLTEwOTc0LDcgKzEwOTg5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMTA5OSw3ICsxMTExNCw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMTEwOCwxMCArMTExMjMsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTExMTc1LDcgKzExMTkwLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9zaXplX3Q9JGFjX2xvOzsKQEAgLTExMzQwLDcgKzExMzU1LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXZlX2xvbmdfbG9uZyIgPiY1CiBlY2hvICIke0VDSE9fVH0kaGF2ZV9sb25nX2xvbmciID4mNjsgfQogaWYgdGVzdCAiJGhhdmVfbG9uZ19sb25nIiA9IHllcyA7IHRoZW4KQEAgLTExNDEwLDcgKzExNDI1LDcgQEAKIAlhY19jdl90eXBlX2xvbmdfbG9uZz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV9sb25nX2xvbmciID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfbG9uZ19sb25nIiA+JjY7IH0KQEAgLTExNTQ2LDcgKzExNTYxLDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMTY3MSw3ICsxMTY4Niw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMTY4MCwxMCArMTE2OTUsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTExNzQ3LDcgKzExNzYyLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl9sb25nX2xvbmc9JGFjX2xvOzsKQEAgLTExOTEzLDcgKzExOTI4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXZlX3VpbnRwdHJfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kaGF2ZV91aW50cHRyX3QiID4mNjsgfQogaWYgdGVzdCAiJGhhdmVfdWludHB0cl90IiA9IHllcyA7IHRoZW4KQEAgLTExOTgzLDcgKzExOTk4LDcgQEAKIAlhY19jdl90eXBlX3VpbnRwdHJfdD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdHlwZV91aW50cHRyX3QiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X3R5cGVfdWludHB0cl90IiA+JjY7IH0KQEAgLTEyMTE5LDcgKzEyMTM0LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMjI0NCw3ICsxMjI1OSw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0xMjI1MywxMCArMTIyNjgsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTEyMzIwLDcgKzEyMzM1LDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl91aW50cHRyX3Q9JGFjX2xvOzsKQEAgLTEyNjQ0LDcgKzEyNjU5LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRoYXZlX3B0aHJlYWRfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kaGF2ZV9wdGhyZWFkX3QiID4mNjsgfQogaWYgdGVzdCAiJGhhdmVfcHRocmVhZF90IiA9IHllcyA7IHRoZW4KQEAgLTEzMTgyLDcgKzEzMTk3LDcgQEAKIAlhY19jdl9saWJfZGxfZGxvcGVuPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTMyNjksNyArMTMyODQsNyBAQAogCWFjX2N2X2xpYl9kbGRfc2hsX2xvYWQ9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xMzM2NCw3ICsxMzM3OSw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0CiAgIGlmIHRlc3QgIiR7YWNfY3Zfc2VhcmNoX3NlbV9pbml0K3NldH0iID0gc2V0OyB0aGVuCiAgIGJyZWFrCkBAIC0xMzQ2Miw3ICsxMzQ3Nyw3IEBACiAJYWNfY3ZfbGliX2ludGxfdGV4dGRvbWFpbj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTEzNTQ1LDcgKzEzNTYwLDcgQEAKIGVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQ7OwogCSopIDs7CiBlc2FjCkBAIC0xMzYyMyw3ICsxMzYzOCw3IEBACiAJYWNfY3ZfbGliX25zbF90X29wZW49bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xMzcwNCw3ICsxMzcxOSw3IEBACiAJYWNfY3ZfbGliX3NvY2tldF9zb2NrZXQ9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xMzc4OCw3ICsxMzgwMyw3IEBACiAJYWNfY3ZfbGliX25ldF9zb2NrZXQ9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNDA3MSw3ICsxNDA4Niw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtMTQyNDMsNyArMTQyNTgsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTE0NTM5LDcgKzE0NTU0LDcgQEAKIAlhY19jdl9mdW5jX3B0aHJlYWRfZGV0YWNoPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfZnVuY19wdGhyZWFkX2RldGFjaCIgPiY1CkBAIC0xNDYxNiw3ICsxNDYzMSw3IEBACiAJYWNfaGVhZGVyX2NvbXBpbGVyPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2hlYWRlcl9jb21waWxlciIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfaGVhZGVyX2NvbXBpbGVyIiA+JjY7IH0KIApAQCAtMTQ3ODMsNyArMTQ3OTgsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTE0OTU4LDcgKzE0OTczLDcgQEAKIAlhY19jdl9saWJfcHRocmVhZHNfcHRocmVhZF9jcmVhdGU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNTA0NSw3ICsxNTA2MCw3IEBACiAJYWNfY3ZfbGliX2Nfcl9wdGhyZWFkX2NyZWF0ZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE1MTMyLDcgKzE1MTQ3LDcgQEAKIAlhY19jdl9saWJfcHRocmVhZF9fX3B0aHJlYWRfY3JlYXRlX3N5c3RlbT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE1MjE5LDcgKzE1MjM0LDcgQEAKIAlhY19jdl9saWJfY21hX3B0aHJlYWRfY3JlYXRlPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTUyNTUsNyArMTUyNzAsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCkBAIC0xNTMzNyw3ICsxNTM1Miw3IEBACiAJYWNfY3ZfbGliX21wY191c2NvbmZpZz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE1NDI2LDcgKzE1NDQxLDcgQEAKIAlhY19jdl9saWJfdGhyZWFkX3Rocl9jcmVhdGU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNTY0Nyw3ICsxNTY2Miw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE1ODI0LDcgKzE1ODM5LDcgQEAKIAkJaXB2Nj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiBpZiB0ZXN0ICIkaXB2NiIgPSAieWVzIjsgdGhlbgpAQCAtMTYyMTksNyArMTYyMzQsNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0xNjQ3MSw3ICsxNjQ4Niw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE2NTU1LDcgKzE2NTcwLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgbGluayIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBsaW5rLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNjYyMyw3ICsxNjYzOCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIHN5bWxpbmsiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3Igc3ltbGluay4uLiAkRUNIT19DIiA+JjY7IH0KIGNhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgpAQCAtMTY2OTEsNyArMTY3MDYsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBmY2hkaXIiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgZmNoZGlyLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNjc1OSw3ICsxNjc3NCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZzeW5jIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZzeW5jLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNjgyNyw3ICsxNjg0Miw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZkYXRhc3luYyIgPiY1CiBlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBmZGF0YXN5bmMuLi4gJEVDSE9fQyIgPiY2OyB9CiBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKQEAgLTE2ODk1LDcgKzE2OTEwLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgT24gc29tZSBzeXN0ZW1zIChlZy4gRnJlZUJTRCA1KSwgd2Ugd291bGQgZmluZCBhIGRlZmluaXRpb24gb2YgdGhlCiAjIGZ1bmN0aW9ucyBjdGVybWlkX3IsIHNldGdyb3VwcyBpbiB0aGUgbGlicmFyeSwgYnV0IG5vIHByb3RvdHlwZQpAQCAtMTY5NzMsNyArMTY5ODgsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGZsb2NrIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGZsb2NrLi4uICRFQ0hPX0MiID4mNjsgfQpAQCAtMTcwNDUsNyArMTcwNjAsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGdldHBhZ2VzaXplIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGdldHBhZ2VzaXplLi4uICRFQ0hPX0MiID4mNjsgfQpAQCAtMTcxMTcsNyArMTcxMzIsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogZm9yIGFjX3Byb2cgaW4gdHJ1ZQogZG8KQEAgLTE3MjM0LDcgKzE3MjQ5LDcgQEAKIAlhY19jdl9saWJfY19pbmV0X2F0b249bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNzMxNSw3ICsxNzMzMCw3IEBACiAJYWNfY3ZfbGliX3Jlc29sdl9pbmV0X2F0b249bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xNzMzNCw2ICsxNzM0OSwxMDggQEAKIGZpCiAKIAorY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KK0Rhcndpbi8qKQorCV9DVVJfQ0ZMQUdTPSIke0NGTEFHU30iCisJX0NVUl9MREZMQUdTPSIke0xERkxBR1N9IgorCUNGTEFHUz0iJHtDRkxBR1N9IC1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0IgorCUxERkxBR1M9IiR7TERGTEFHU30gLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QgLUwvdXNyL2xvY2FsL2xpYiIKKwk7OworZXNhYworCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgaW5mbGF0ZUNvcHkgaW4gLWx6IiA+JjUKK2VjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIGluZmxhdGVDb3B5IGluIC1sei4uLiAkRUNIT19DIiA+JjY7IH0KK2lmIHRlc3QgIiR7YWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHkrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgYWNfY2hlY2tfbGliX3NhdmVfTElCUz0kTElCUworTElCUz0iLWx6ICAkTElCUyIKK2NhdCA+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogY29uZmRlZnMuaC4gICovCitfQUNFT0YKK2NhdCBjb25mZGVmcy5oID4+Y29uZnRlc3QuJGFjX2V4dAorY2F0ID4+Y29uZnRlc3QuJGFjX2V4dCA8PF9BQ0VPRgorLyogZW5kIGNvbmZkZWZzLmguICAqLworCisvKiBPdmVycmlkZSBhbnkgR0NDIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4KKyAgIFVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIEdDQworICAgYnVpbHRpbiBhbmQgdGhlbiBpdHMgYXJndW1lbnQgcHJvdG90eXBlIHdvdWxkIHN0aWxsIGFwcGx5LiAgKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIgorI2VuZGlmCitjaGFyIGluZmxhdGVDb3B5ICgpOworaW50CittYWluICgpCit7CityZXR1cm4gaW5mbGF0ZUNvcHkgKCk7CisgIDsKKyAgcmV0dXJuIDA7Cit9CitfQUNFT0YKK3JtIC1mIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QkYWNfZXhlZXh0CitpZiB7IChhY190cnk9IiRhY19saW5rIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2xpbmsiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdCRhY19leGVleHQnCisgIHsgKGNhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY190cnkiKSAyPiY1CisgIGFjX3N0YXR1cz0kPworICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9OyB9OyB0aGVuCisgIGFjX2N2X2xpYl96X2luZmxhdGVDb3B5PXllcworZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJYWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHk9bm8KK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKK0xJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9saWJfel9pbmZsYXRlQ29weSIgPiY1CitlY2hvICIke0VDSE9fVH0kYWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHkiID4mNjsgfQoraWYgdGVzdCAkYWNfY3ZfbGliX3pfaW5mbGF0ZUNvcHkgPSB5ZXM7IHRoZW4KKworY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKKyNkZWZpbmUgSEFWRV9aTElCX0NPUFkgMQorX0FDRU9GCisKK2ZpCisKKworY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KK0Rhcndpbi8qKQorCUNGTEFHUz0iJHtfQ1VSX0NGTEFHU30iCisJTERGTEFHUz0iJHtfQ1VSX0xERkxBR1N9IgorCTs7Citlc2FjCisKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciBoc3RyZXJyb3IiID4mNQogZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgaHN0cmVycm9yLi4uICRFQ0hPX0MiID4mNjsgfQogY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCkBAIC0xNzQwNCw3ICsxNzUyMSw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfYXRvbiIgPiY1CkBAIC0xNzQ4MCw3ICsxNzU5Nyw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGluZXRfcHRvbiIgPiY1CkBAIC0xNzU1Niw3ICsxNzY3Myw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiAjIE9uIHNvbWUgc3lzdGVtcywgc2V0Z3JvdXBzIGlzIGluIHVuaXN0ZC5oLCBvbiBvdGhlcnMsIGluIGdycC5oCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3Igc2V0Z3JvdXBzIiA+JjUKQEAgLTE3NjMyLDcgKzE3NzQ5LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgY2hlY2sgZm9yIG9wZW5wdHkgYW5kIGZvcmtwdHkKIApAQCAtMTc3MzIsNyArMTc4NDksNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0xNzgxNSw3ICsxNzkzMiw3IEBACiAJYWNfY3ZfbGliX3V0aWxfb3BlbnB0eT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE3ODk4LDcgKzE4MDE1LDcgQEAKIAlhY19jdl9saWJfYnNkX29wZW5wdHk9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIExJQlM9JGFjX2NoZWNrX2xpYl9zYXZlX0xJQlMKIGZpCkBAIC0xODAxNCw3ICsxODEzMSw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE4MDk3LDcgKzE4MjE0LDcgQEAKIAlhY19jdl9saWJfdXRpbF9mb3JrcHR5PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMTgxODAsNyArMTgyOTcsNyBAQAogCWFjX2N2X2xpYl9ic2RfZm9ya3B0eT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTE4MzAzLDcgKzE4NDIwLDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMTg0MTgsNyArMTg1MzUsNyBAQAogCWV2YWwgIiRhc19hY192YXI9bm8iCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogYWNfcmVzPWBldmFsIGVjaG8gJyR7JyRhc19hY192YXInfSdgCkBAIC0xODUzNiw3ICsxODY1Myw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE4NjA4LDcgKzE4NzI1LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCiBkb25lCkBAIC0xODcwOSw3ICsxODgyNiw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE4NzgxLDcgKzE4ODk4LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCiBkb25lCkBAIC0xODg4Miw3ICsxODk5OSw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE4OTU0LDcgKzE5MDcxLDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCiBkb25lCkBAIC0xOTA0MCw3ICsxOTE1Nyw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIAogIyBPbiBPU0YvMSBWNS4xLCBnZXRhZGRyaW5mbyBpcyBhdmFpbGFibGUsIGJ1dCBhIGRlZmluZQpAQCAtMTkyNTUsNyArMTkzNzIsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGlmIHRlc3QgIiRidWdneWdldGFkZHJpbmZvIiA9ICJ5ZXMiOyB0aGVuCkBAIC0xOTM2Nyw3ICsxOTQ4NCw3IEBACiAJZXZhbCAiJGFzX2FjX3Zhcj1ubyIKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiBhY19yZXM9YGV2YWwgZWNobyAnJHsnJGFzX2FjX3Zhcid9J2AKQEAgLTE5NDQ5LDcgKzE5NTY2LDcgQEAKIAlhY19jdl9oZWFkZXJfdGltZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfaGVhZGVyX3RpbWUiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X2hlYWRlcl90aW1lIiA+JjY7IH0KQEAgLTE5NTI1LDcgKzE5NjQyLDcgQEAKIAlhY19jdl9zdHJ1Y3RfdG09c3lzL3RpbWUuaAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3RtIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9zdHJ1Y3RfdG0iID4mNjsgfQpAQCAtMTk2NjMsMTAgKzE5NzgwLDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjY7IH0KQEAgLTE5NzUzLDcgKzE5ODcwLDcgQEAKIAlhY19jdl9oYXZlX2RlY2xfdHpuYW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA+JjY7IH0KQEAgLTE5ODM5LDcgKzE5OTU2LDcgQEAKIAlhY19jdl92YXJfdHpuYW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3R6bmFtZSIgPiY1CkBAIC0xOTk3MywxMCArMjAwOTAsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfcmRldiIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X3JkZXYiID4mNjsgfQpAQCAtMjAxMDksMTAgKzIwMjI2LDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3NpemU9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsa3NpemUiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibGtzaXplIiA+JjY7IH0KQEAgLTIwMjQ1LDEwICsyMDM2MiwxMCBAQAogCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9mbGFncz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZmxhZ3MiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9mbGFncyIgPiY2OyB9CkBAIC0yMDM4MSwxMCArMjA0OTgsMTAgQEAKIAlhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfZ2VuPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW4iID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9nZW4iID4mNjsgfQpAQCAtMjA1MTcsMTAgKzIwNjM0LDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2JpcnRodGltZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9tZW1iZXJfc3RydWN0X3N0YXRfc3RfYmlydGh0aW1lIiA+JjY7IH0KQEAgLTIwNjUzLDEwICsyMDc3MCwxMCBAQAogCWFjX2N2X21lbWJlcl9zdHJ1Y3Rfc3RhdF9zdF9ibG9ja3M9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF9zdGF0X3N0X2Jsb2NrcyIgPiY2OyB9CkBAIC0yMDc0NCw3ICsyMDg2MSw3IEBACiAJYWNfY3ZfaGVhZGVyX3RpbWVfYWx0em9uZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oZWFkZXJfdGltZV9hbHR6b25lIiA+JjUKQEAgLTIwODI4LDcgKzIwOTQ1LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3YXNfaXRfZGVmaW5lZCIgPiY1CiBlY2hvICIke0VDSE9fVH0kd2FzX2l0X2RlZmluZWQiID4mNjsgfQogCkBAIC0yMDg5NSw3ICsyMTAxMiw3IEBACiAJYWNfY3Zfc3RydWN0X2FkZHJpbmZvPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N0cnVjdF9hZGRyaW5mbyIgPiY1CkBAIC0yMDk3Miw3ICsyMTA4OSw3IEBACiAJYWNfY3Zfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2U9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfc3RydWN0X3NvY2thZGRyX3N0b3JhZ2UiID4mNQpAQCAtMjEwNTIsNyArMjExNjksNyBAQAogCWFjX2N2X2NfY2hhcl91bnNpZ25lZD15ZXMKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2NfY2hhcl91bnNpZ25lZCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19jaGFyX3Vuc2lnbmVkIiA+JjY7IH0KQEAgLTIxMTc0LDcgKzIxMjkxLDcgQEAKIAlhY19jdl9jX2NvbnN0PW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2NvbnN0IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9jX2NvbnN0IiA+JjY7IH0KQEAgLTIxMjUyLDcgKzIxMzY5LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICR3b3JrcyIgPiY1CiBlY2hvICIke0VDSE9fVH0kd29ya3MiID4mNjsgfQogCkBAIC0yMTMyMSw3ICsyMTQzOCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkd29ya3MiID4mNQogZWNobyAiJHtFQ0hPX1R9JHdvcmtzIiA+JjY7IH0KIApAQCAtMjEzOTIsNyArMjE1MDksNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGhhdmVfcHJvdG90eXBlcyIgPiY1CiBlY2hvICIke0VDSE9fVH0kaGF2ZV9wcm90b3R5cGVzIiA+JjY7IH0KIApAQCAtMjE0NzMsNyArMjE1OTAsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHdvcmtzIiA+JjUKIGVjaG8gIiR7RUNIT19UfSR3b3JrcyIgPiY2OyB9CiAKQEAgLTIxNTQ4LDcgKzIxNjY1LDcgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKICMgY2hlY2sgaWYgc29ja2FkZHIgaGFzIHNhX2xlbiBtZW1iZXIKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGlmIHNvY2thZGRyIGhhcyBzYV9sZW4gbWVtYmVyIiA+JjUKQEAgLTIxNjE5LDcgKzIxNzM2LDcgQEAKIGVjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiB2YV9saXN0X2lzX2FycmF5PW5vCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyB3aGV0aGVyIHZhX2xpc3QgaXMgYW4gYXJyYXkiID4mNQpAQCAtMjE2OTQsNyArMjE4MTEsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJHZhX2xpc3RfaXNfYXJyYXkiID4mNQogZWNobyAiJHtFQ0hPX1R9JHZhX2xpc3RfaXNfYXJyYXkiID4mNjsgfQogCkBAIC0yMTc5NCw3ICsyMTkxMSw3IEBACiAJYWNfY3ZfZnVuY19nZXRob3N0YnluYW1lX3I9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAogICAgICAgY29uZnRlc3QkYWNfZXhlZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9mdW5jX2dldGhvc3RieW5hbWVfciIgPiY1CkBAIC0yMjA1MSwxNSArMjIxNjgsMTUgQEAKIAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKICAgQ0ZMQUdTPSRPTERfQ0ZMQUdTCiAKIGVsc2UKQEAgLTIyMTYwLDcgKzIyMjc3LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMjIyNzksNyArMjIzOTYsNyBAQAogCWFjX2N2X2Z1bmNfX19mcHVfY29udHJvbD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2Z1bmNfX19mcHVfY29udHJvbCIgPiY1CkBAIC0yMjM1OSw3ICsyMjQ3Niw3IEBACiAJYWNfY3ZfbGliX2llZWVfX19mcHVfY29udHJvbD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTIyNTU5LDcgKzIyNjc2LDcgQEAKIAlldmFsICIkYXNfYWNfdmFyPW5vIgogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIGFjX3Jlcz1gZXZhbCBlY2hvICckeyckYXNfYWNfdmFyJ30nYApAQCAtMjI2NDcsNyArMjI3NjQsNyBAQAogCWFjX2hlYWRlcl9jb21waWxlcj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19oZWFkZXJfY29tcGlsZXIiID4mNQogZWNobyAiJHtFQ0hPX1R9JGFjX2hlYWRlcl9jb21waWxlciIgPiY2OyB9CiAKQEAgLTIyODI0LDcgKzIyOTQxLDcgQEAKIAlhY19jdl90eXBlX3djaGFyX3Q9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfd2NoYXJfdCIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfdHlwZV93Y2hhcl90IiA+JjY7IH0KQEAgLTIyOTYyLDcgKzIzMDc5LDcgQEAKIAkJCWFjX21pZD1gZXhwciAyICcqJyAkYWNfbWlkICsgMWAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0yMzA4OSw3ICsyMzIwNiw3IEBACiAJCQlhY19taWQ9YGV4cHIgMiAnKicgJGFjX21pZGAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogICBkb25lCiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CkBAIC0yMzA5OCwxMCArMjMyMTUsMTAgQEAKIAlhY19sbz0gYWNfaGk9CiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogIyBCaW5hcnkgc2VhcmNoIGJldHdlZW4gbG8gYW5kIGhpIGJvdW5kcy4KIHdoaWxlIHRlc3QgIngkYWNfbG8iICE9ICJ4JGFjX2hpIjsgZG8KICAgYWNfbWlkPWBleHByICcoJyAkYWNfaGkgLSAkYWNfbG8gJyknIC8gMiArICRhY19sb2AKQEAgLTIzMTY2LDcgKzIzMjgzLDcgQEAKIAlhY19sbz1gZXhwciAnKCcgJGFjX21pZCAnKScgKyAxYAogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBkb25lCiBjYXNlICRhY19sbyBpbgogPyopIGFjX2N2X3NpemVvZl93Y2hhcl90PSRhY19sbzs7CkBAIC0yMzMzNyw3ICsyMzQ1NCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkaGF2ZV91Y3M0X3RjbCIgPiY1CiBlY2hvICIke0VDSE9fVH0kaGF2ZV91Y3M0X3RjbCIgPiY2OyB9CiAKQEAgLTIzNjIyLDcgKzIzNzM5LDcgQEAKIAlhY19jdl9jX2JpZ2VuZGlhbj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBlbHNlCiAgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CiBzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CkBAIC0yMzcwMyw3ICsyMzgyMCw3IEBACiAKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZWxzZQogICBjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKIC8qIGNvbmZkZWZzLmguICAqLwpAQCAtMjM3NjQsNyArMjM4ODEsNyBAQAogCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9jX2JpZ2VuZGlhbiIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfY19iaWdlbmRpYW4iID4mNjsgfQpAQCAtMjM5MjcsNyArMjQwNDQsNyBAQAogCWFjX2N2X2hhdmVfZ2V0Y191bmxvY2tlZD1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIApAQCAtMjQwMTcsNyArMjQxMzQsNyBAQAogCWFjX2N2X2xpYl9yZWFkbGluZV9yZWFkbGluZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTI0MTA2LDcgKzI0MjIzLDcgQEAKIAlhY19jdl9saWJfdGVybWNhcF9yZWFkbGluZT1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTI0MTk1LDcgKzI0MzEyLDcgQEAKIAlhY19jdl9saWJfcmVhZGxpbmVfcmxfY2FsbGJhY2tfaGFuZGxlcl9pbnN0YWxsPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjQzNDYsNyArMjQ0NjMsNyBAQAogCWFjX2N2X2xpYl9yZWFkbGluZV9ybF9wcmVfaW5wdXRfaG9vaz1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgXAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCiAgICAgICBjb25mdGVzdCRhY19leGVleHQgY29uZnRlc3QuJGFjX2V4dAogTElCUz0kYWNfY2hlY2tfbGliX3NhdmVfTElCUwogZmkKQEAgLTI0NDMzLDcgKzI0NTUwLDcgQEAKIAlhY19jdl9saWJfcmVhZGxpbmVfcmxfY29tcGxldGlvbl9tYXRjaGVzPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBMSUJTPSRhY19jaGVja19saWJfc2F2ZV9MSUJTCiBmaQpAQCAtMjQ3OTYsMTAgKzI0OTEzLDEwIEBACiAJYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X21lbWJlcl9zdHJ1Y3RfdG1fdG1fem9uZSIgPiY1CiBlY2hvICIke0VDSE9fVH0kYWNfY3ZfbWVtYmVyX3N0cnVjdF90bV90bV96b25lIiA+JjY7IH0KQEAgLTI0ODg2LDcgKzI1MDAzLDcgQEAKIAlhY19jdl9oYXZlX2RlY2xfdHpuYW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl9oYXZlX2RlY2xfdHpuYW1lIiA+JjY7IH0KQEAgLTI0OTcyLDcgKzI1MDg5LDcgQEAKIAlhY19jdl92YXJfdHpuYW1lPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBcCitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IFwKICAgICAgIGNvbmZ0ZXN0JGFjX2V4ZWV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3ZfdmFyX3R6bmFtZSIgPiY1CkBAIC0yNTE4MCw3ICsyNTI5Nyw3IEBACiAJYWNfY3Zfc3RhdF90dl9uc2VjPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3N0YXRfdHZfbnNlYyIgPiY1CkBAIC0yNTI2MCw3ICsyNTM3Nyw3IEBACiAJYWNfY3Zfc3RhdF90dl9uc2VjMj1ubwogZmkKIAotcm0gLWYgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CiBmaQogCiB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9zdGF0X3R2X25zZWMyIiA+JjUKQEAgLTI1MzQwLDcgKzI1NDU3LDcgQEAKIAlhY19jdl9tdndkZWxjaF9pc19leHByZXNzaW9uPW5vCiBmaQogCi1ybSAtZiBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CitybSAtZiBjb3JlIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKIGZpCiAKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X212d2RlbGNoX2lzX2V4cHJlc3Npb24iID4mNQpAQCAtMjU0MjAsNyArMjU1MzcsNyBAQAogCWFjX2N2X3dpbmRvd19oYXNfZmxhZ3M9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiAkYWNfY3Zfd2luZG93X2hhc19mbGFncyIgPiY1CkBAIC0yNTQzNiw0MCArMjU1NTMsMjY0IEBACiAKIGZpCiAKLXsgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAvZGV2L3B0bXgiID4mNQotZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgL2Rldi9wdG14Li4uICRFQ0hPX0MiID4mNjsgfQoreyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIGlzX3Rlcm1fcmVzaXplZCIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciBpc190ZXJtX3Jlc2l6ZWQuLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdXJzZXMuaD4KK2ludAorbWFpbiAoKQorewordm9pZCAqeD1pc190ZXJtX3Jlc2l6ZWQKKyAgOworICByZXR1cm4gMDsKK30KK19BQ0VPRgorcm0gLWYgY29uZnRlc3QuJGFjX29iamV4dAoraWYgeyAoYWNfdHJ5PSIkYWNfY29tcGlsZSIKK2Nhc2UgIigoJGFjX3RyeSIgaW4KKyAgKlwiKiB8ICpcYCogfCAqXFwqKSBhY190cnlfZWNobz1cJGFjX3RyeTs7CisgICopIGFjX3RyeV9lY2hvPSRhY190cnk7OworZXNhYworZXZhbCAiZWNobyBcIlwkYXNfbWU6JExJTkVOTzogJGFjX3RyeV9lY2hvXCIiKSA+JjUKKyAgKGV2YWwgIiRhY19jb21waWxlIikgMj5jb25mdGVzdC5lcjEKKyAgYWNfc3RhdHVzPSQ/CisgIGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0LmVyMSA+Y29uZnRlc3QuZXJyCisgIHJtIC1mIGNvbmZ0ZXN0LmVyMQorICBjYXQgY29uZnRlc3QuZXJyID4mNQorICBlY2hvICIkYXNfbWU6JExJTkVOTzogXCQ/ID0gJGFjX3N0YXR1cyIgPiY1CisgIChleGl0ICRhY19zdGF0dXMpOyB9ICYmCisJIHsgYWNfdHJ5PSd0ZXN0IC16ICIkYWNfY193ZXJyb3JfZmxhZyIgfHwgdGVzdCAhIC1zIGNvbmZ0ZXN0LmVycicKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXMgY29uZnRlc3QuJGFjX29iamV4dCcKKyAgeyAoY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX3RyeSIpIDI+JjUKKyAgYWNfc3RhdHVzPSQ/CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH07IH07IHRoZW4KIAotaWYgdGVzdCAtZSAvZGV2L3B0bXgKLXRoZW4KK2NhdCA+PmNvbmZkZWZzLmggPDxcX0FDRU9GCisjZGVmaW5lIEhBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRCAxCitfQUNFT0YKKwogICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CiBlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVzaXplX3Rlcm0iID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgcmVzaXplX3Rlcm0uLi4gJEVDSE9fQyIgPiY2OyB9CitjYXQgPmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGNvbmZkZWZzLmguICAqLworX0FDRU9GCitjYXQgY29uZmRlZnMuaCA+PmNvbmZ0ZXN0LiRhY19leHQKK2NhdCA+PmNvbmZ0ZXN0LiRhY19leHQgPDxfQUNFT0YKKy8qIGVuZCBjb25mZGVmcy5oLiAgKi8KKyNpbmNsdWRlIDxjdXJzZXMuaD4KK2ludAorbWFpbiAoKQorewordm9pZCAqeD1yZXNpemVfdGVybQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0NVUlNFU19SRVNJWkVfVEVSTSAxCitfQUNFT0YKKworICB7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IHllcyIgPiY1CitlY2hvICIke0VDSE9fVH15ZXMiID4mNjsgfQorZWxzZQorICBlY2hvICIkYXNfbWU6IGZhaWxlZCBwcm9ncmFtIHdhczoiID4mNQorc2VkICdzL14vfCAvJyBjb25mdGVzdC4kYWNfZXh0ID4mNQorCisJeyBlY2hvICIkYXNfbWU6JExJTkVOTzogcmVzdWx0OiBubyIgPiY1CitlY2hvICIke0VDSE9fVH1ubyIgPiY2OyB9CisKK2ZpCisKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAorCit7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgcmVzaXpldGVybSIgPiY1CitlY2hvICRFQ0hPX04gImNoZWNraW5nIGZvciByZXNpemV0ZXJtLi4uICRFQ0hPX0MiID4mNjsgfQorY2F0ID5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBjb25mZGVmcy5oLiAgKi8KK19BQ0VPRgorY2F0IGNvbmZkZWZzLmggPj5jb25mdGVzdC4kYWNfZXh0CitjYXQgPj5jb25mdGVzdC4kYWNfZXh0IDw8X0FDRU9GCisvKiBlbmQgY29uZmRlZnMuaC4gICovCisjaW5jbHVkZSA8Y3Vyc2VzLmg+CitpbnQKK21haW4gKCkKK3sKK3ZvaWQgKng9cmVzaXpldGVybQorICA7CisgIHJldHVybiAwOworfQorX0FDRU9GCitybSAtZiBjb25mdGVzdC4kYWNfb2JqZXh0CitpZiB7IChhY190cnk9IiRhY19jb21waWxlIgorY2FzZSAiKCgkYWNfdHJ5IiBpbgorICAqXCIqIHwgKlxgKiB8ICpcXCopIGFjX3RyeV9lY2hvPVwkYWNfdHJ5OzsKKyAgKikgYWNfdHJ5X2VjaG89JGFjX3RyeTs7Citlc2FjCitldmFsICJlY2hvIFwiXCRhc19tZTokTElORU5POiAkYWNfdHJ5X2VjaG9cIiIpID4mNQorICAoZXZhbCAiJGFjX2NvbXBpbGUiKSAyPmNvbmZ0ZXN0LmVyMQorICBhY19zdGF0dXM9JD8KKyAgZ3JlcCAtdiAnXiAqKycgY29uZnRlc3QuZXIxID5jb25mdGVzdC5lcnIKKyAgcm0gLWYgY29uZnRlc3QuZXIxCisgIGNhdCBjb25mdGVzdC5lcnIgPiY1CisgIGVjaG8gIiRhc19tZTokTElORU5POiBcJD8gPSAkYWNfc3RhdHVzIiA+JjUKKyAgKGV4aXQgJGFjX3N0YXR1cyk7IH0gJiYKKwkgeyBhY190cnk9J3Rlc3QgLXogIiRhY19jX3dlcnJvcl9mbGFnIiB8fCB0ZXN0ICEgLXMgY29uZnRlc3QuZXJyJworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfSAmJgorCSB7IGFjX3RyeT0ndGVzdCAtcyBjb25mdGVzdC4kYWNfb2JqZXh0JworICB7IChjYXNlICIoKCRhY190cnkiIGluCisgICpcIiogfCAqXGAqIHwgKlxcKikgYWNfdHJ5X2VjaG89XCRhY190cnk7OworICAqKSBhY190cnlfZWNobz0kYWNfdHJ5OzsKK2VzYWMKK2V2YWwgImVjaG8gXCJcJGFzX21lOiRMSU5FTk86ICRhY190cnlfZWNob1wiIikgPiY1CisgIChldmFsICIkYWNfdHJ5IikgMj4mNQorICBhY19zdGF0dXM9JD8KKyAgZWNobyAiJGFzX21lOiRMSU5FTk86IFwkPyA9ICRhY19zdGF0dXMiID4mNQorICAoZXhpdCAkYWNfc3RhdHVzKTsgfTsgfTsgdGhlbgorCitjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgorI2RlZmluZSBIQVZFX0NVUlNFU19SRVNJWkVURVJNIDEKK19BQ0VPRgorCisgIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKK2VjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitlbHNlCisgIGVjaG8gIiRhc19tZTogZmFpbGVkIHByb2dyYW0gd2FzOiIgPiY1CitzZWQgJ3MvXi98IC8nIGNvbmZ0ZXN0LiRhY19leHQgPiY1CisKKwl7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6IG5vIiA+JjUKK2VjaG8gIiR7RUNIT19UfW5vIiA+JjY7IH0KKworZmkKKworcm0gLWYgY29yZSBjb25mdGVzdC5lcnIgY29uZnRlc3QuJGFjX29iamV4dCBjb25mdGVzdC4kYWNfZXh0CisKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IGNoZWNraW5nIGZvciAvZGV2L3B0bXgiID4mNQorZWNobyAkRUNIT19OICJjaGVja2luZyBmb3IgL2Rldi9wdG14Li4uICRFQ0hPX0MiID4mNjsgfQoraWYgdGVzdCAiJHthY19jdl9maWxlX19kZXZfcHRteCtzZXR9IiA9IHNldDsgdGhlbgorICBlY2hvICRFQ0hPX04gIihjYWNoZWQpICRFQ0hPX0MiID4mNgorZWxzZQorICB0ZXN0ICIkY3Jvc3NfY29tcGlsaW5nIiA9IHllcyAmJgorICB7IHsgZWNobyAiJGFzX21lOiRMSU5FTk86IGVycm9yOiBjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiA+JjUKK2VjaG8gIiRhc19tZTogZXJyb3I6IGNhbm5vdCBjaGVjayBmb3IgZmlsZSBleGlzdGVuY2Ugd2hlbiBjcm9zcyBjb21waWxpbmciID4mMjt9CisgICB7IChleGl0IDEpOyBleGl0IDE7IH07IH0KK2lmIHRlc3QgLXIgIi9kZXYvcHRteCI7IHRoZW4KKyAgYWNfY3ZfZmlsZV9fZGV2X3B0bXg9eWVzCitlbHNlCisgIGFjX2N2X2ZpbGVfX2Rldl9wdG14PW5vCitmaQorZmkKK3sgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X2ZpbGVfX2Rldl9wdG14IiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9maWxlX19kZXZfcHRteCIgPiY2OyB9CitpZiB0ZXN0ICRhY19jdl9maWxlX19kZXZfcHRteCA9IHllczsgdGhlbgogCiBjYXQgPj5jb25mZGVmcy5oIDw8XF9BQ0VPRgogI2RlZmluZSBIQVZFX0RFVl9QVE1YIDEKIF9BQ0VPRgogCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAogeyBlY2hvICIkYXNfbWU6JExJTkVOTzogY2hlY2tpbmcgZm9yIC9kZXYvcHRjIiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yIC9kZXYvcHRjLi4uICRFQ0hPX0MiID4mNjsgfQotCi1pZiB0ZXN0IC1lIC9kZXYvcHRjCi10aGVuCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogeWVzIiA+JjUKLWVjaG8gIiR7RUNIT19UfXllcyIgPiY2OyB9CitpZiB0ZXN0ICIke2FjX2N2X2ZpbGVfX2Rldl9wdGMrc2V0fSIgPSBzZXQ7IHRoZW4KKyAgZWNobyAkRUNIT19OICIoY2FjaGVkKSAkRUNIT19DIiA+JjYKK2Vsc2UKKyAgdGVzdCAiJGNyb3NzX2NvbXBpbGluZyIgPSB5ZXMgJiYKKyAgeyB7IGVjaG8gIiRhc19tZTokTElORU5POiBlcnJvcjogY2Fubm90IGNoZWNrIGZvciBmaWxlIGV4aXN0ZW5jZSB3aGVuIGNyb3NzIGNvbXBpbGluZyIgPiY1CitlY2hvICIkYXNfbWU6IGVycm9yOiBjYW5ub3QgY2hlY2sgZm9yIGZpbGUgZXhpc3RlbmNlIHdoZW4gY3Jvc3MgY29tcGlsaW5nIiA+JjI7fQorICAgeyAoZXhpdCAxKTsgZXhpdCAxOyB9OyB9CitpZiB0ZXN0IC1yICIvZGV2L3B0YyI7IHRoZW4KKyAgYWNfY3ZfZmlsZV9fZGV2X3B0Yz15ZXMKK2Vsc2UKKyAgYWNfY3ZfZmlsZV9fZGV2X3B0Yz1ubworZmkKK2ZpCit7IGVjaG8gIiRhc19tZTokTElORU5POiByZXN1bHQ6ICRhY19jdl9maWxlX19kZXZfcHRjIiA+JjUKK2VjaG8gIiR7RUNIT19UfSRhY19jdl9maWxlX19kZXZfcHRjIiA+JjY7IH0KK2lmIHRlc3QgJGFjX2N2X2ZpbGVfX2Rldl9wdGMgPSB5ZXM7IHRoZW4KIAogY2F0ID4+Y29uZmRlZnMuaCA8PFxfQUNFT0YKICNkZWZpbmUgSEFWRV9ERVZfUFRDIDEKIF9BQ0VPRgogCi1lbHNlCi0gIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogbm8iID4mNQotZWNobyAiJHtFQ0hPX1R9bm8iID4mNjsgfQogZmkKIAorCiB7IGVjaG8gIiRhc19tZTokTElORU5POiBjaGVja2luZyBmb3IgJXpkIHByaW50ZigpIGZvcm1hdCBzdXBwb3J0IiA+JjUKIGVjaG8gJEVDSE9fTiAiY2hlY2tpbmcgZm9yICV6ZCBwcmludGYoKSBmb3JtYXQgc3VwcG9ydC4uLiAkRUNIT19DIiA+JjY7IH0KIGlmIHRlc3QgIiRjcm9zc19jb21waWxpbmciID0geWVzOyB0aGVuCkBAIC0yNTYxNyw3ICsyNTk1OCw3IEBACiAJYWNfY3ZfdHlwZV9zb2NrbGVuX3Q9bm8KIGZpCiAKLXJtIC1mIGNvbmZ0ZXN0LmVyciBjb25mdGVzdC4kYWNfb2JqZXh0IGNvbmZ0ZXN0LiRhY19leHQKK3JtIC1mIGNvcmUgY29uZnRlc3QuZXJyIGNvbmZ0ZXN0LiRhY19vYmpleHQgY29uZnRlc3QuJGFjX2V4dAogZmkKIHsgZWNobyAiJGFzX21lOiRMSU5FTk86IHJlc3VsdDogJGFjX2N2X3R5cGVfc29ja2xlbl90IiA+JjUKIGVjaG8gIiR7RUNIT19UfSRhY19jdl90eXBlX3NvY2tsZW5fdCIgPiY2OyB9CkBAIC0yNjAzOCw3ICsyNjM3OSw3IEBACiAjIHZhbHVlcyBhZnRlciBvcHRpb25zIGhhbmRsaW5nLgogYWNfbG9nPSIKIFRoaXMgZmlsZSB3YXMgZXh0ZW5kZWQgYnkgcHl0aG9uICRhc19tZSAzLjAsIHdoaWNoIHdhcwotZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjU5ZS4gIEludm9jYXRpb24gY29tbWFuZCBsaW5lIHdhcworZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYwLiAgSW52b2NhdGlvbiBjb21tYW5kIGxpbmUgd2FzCiAKICAgQ09ORklHX0ZJTEVTICAgID0gJENPTkZJR19GSUxFUwogICBDT05GSUdfSEVBREVSUyAgPSAkQ09ORklHX0hFQURFUlMKQEAgLTI2MDg3LDcgKzI2NDI4LDcgQEAKIGNhdCA+PiRDT05GSUdfU1RBVFVTIDw8X0FDRU9GCiBhY19jc192ZXJzaW9uPSJcXAogcHl0aG9uIGNvbmZpZy5zdGF0dXMgMy4wCi1jb25maWd1cmVkIGJ5ICQwLCBnZW5lcmF0ZWQgYnkgR05VIEF1dG9jb25mIDIuNTllLAorY29uZmlndXJlZCBieSAkMCwgZ2VuZXJhdGVkIGJ5IEdOVSBBdXRvY29uZiAyLjYwLAogICB3aXRoIG9wdGlvbnMgXFwiYGVjaG8gIiRhY19jb25maWd1cmVfYXJncyIgfCBzZWQgJ3MvXiAvLzsgcy9bXFwiIlxgXCRdL1xcXFwmL2cnYFxcIgogCiBDb3B5cmlnaHQgKEMpIDIwMDYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBAIC0yNjcwNSw2ICsyNzA0Niw3IEBACiAKIHRlc3QgLXogIiRhY19kYXRhcm9vdGRpcl9oYWNrJGFjX2RhdGFyb290ZGlyX3NlZW4iICYmCiAgIHsgYWNfb3V0PWBzZWQgLW4gJy9cJHtkYXRhcm9vdGRpcn0vcCcgIiR0bXAvb3V0ImA7IHRlc3QgLW4gIiRhY19vdXQiOyB9ICYmCisgIHsgYWNfb3V0PWBzZWQgLW4gJy9eWwkgXSpkYXRhcm9vdGRpclsJIF0qOio9L3AnICIkdG1wL291dCJgOyB0ZXN0IC16ICIkYWNfb3V0IjsgfSAmJgogICB7IGVjaG8gIiRhc19tZTokTElORU5POiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKIHdoaWNoIHNlZW1zIHRvIGJlIHVuZGVmaW5lZC4gIFBsZWFzZSBtYWtlIHN1cmUgaXQgaXMgZGVmaW5lZC4iID4mNQogZWNobyAiJGFzX21lOiBXQVJOSU5HOiAkYWNfZmlsZSBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgXGBkYXRhcm9vdGRpcicKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBkOTYyNmY5Li41ZDQ0Y2NlIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC0yMzUsOCArMjM1LDggQEAKICAgIyBPbiBNYWMgT1MgWCAxMC40LCBkZWZpbmluZyBfUE9TSVhfQ19TT1VSQ0Ugb3IgX1hPUEVOX1NPVVJDRQogICAjIGRpc2FibGVzIHBsYXRmb3JtIHNwZWNpZmljIGZlYXR1cmVzIGJleW9uZCByZXBhaXIuCiAgICMgT24gTWFjIE9TIFggMTAuMywgZGVmaW5pbmcgX1BPU0lYX0NfU09VUkNFIG9yIF9YT1BFTl9TT1VSQ0UgCi0gICMgaGFzIG5vIGVmZmVjdCwgZG9uJ3QgYm90aGVyIGRlZmluZWluZyB0aGVtCi0gIERhcndpbi9APDpANzhAOj5ALiopCisgICMgaGFzIG5vIGVmZmVjdCwgZG9uJ3QgYm90aGVyIGRlZmluaW5nIHRoZW0KKyAgRGFyd2luL0A8OkA3ODlAOj5ALiopCiAgICAgZGVmaW5lX3hvcGVuX3NvdXJjZT1ubwogICAgIDs7CiAKQEAgLTEwNjYsMTQgKzEwNjYsMTYgQEAKIAogIyBjaGVja3MgZm9yIGhlYWRlciBmaWxlcwogQUNfSEVBREVSX1NUREMKLUFDX0NIRUNLX0hFQURFUlMoYXNtL3R5cGVzLmggY3Vyc2VzLmggZGxmY24uaCBmY250bC5oIGdycC5oIFwKLXNoYWRvdy5oIGxhbmdpbmZvLmggbGliaW50bC5oIG5jdXJzZXMuaCBwb2xsLmggcHRocmVhZC5oIFwKLXN0cm9wdHMuaCB0ZXJtaW9zLmggdGhyZWFkLmggXAorQUNfQ0hFQ0tfSEVBREVSUyhhc20vdHlwZXMuaCBjb25pby5oIGN1cnNlcy5oIGRpcmVjdC5oIGRsZmNuLmggZXJybm8uaCBcCitmY250bC5oIGdycC5oIFwKK3NoYWRvdy5oIGlvLmggbGFuZ2luZm8uaCBsaWJpbnRsLmggbmN1cnNlcy5oIHBvbGwuaCBwcm9jZXNzLmggcHRocmVhZC5oIFwKK3NpZ25hbC5oIHN0cm9wdHMuaCB0ZXJtaW9zLmggdGhyZWFkLmggXAogdW5pc3RkLmggdXRpbWUuaCBcCiBzeXMvYXVkaW9pby5oIHN5cy9ic2R0dHkuaCBzeXMvZmlsZS5oIHN5cy9sb2FkYXZnLmggc3lzL2xvY2suaCBzeXMvbWtkZXYuaCBcCiBzeXMvbW9kZW0uaCBcCi1zeXMvcGFyYW0uaCBzeXMvcG9sbC5oIHN5cy9zZWxlY3QuaCBzeXMvc29ja2V0Lmggc3lzL3N0YXR2ZnMuaCBzeXMvdGltZS5oIFwKLXN5cy90aW1lcy5oIHN5cy91bi5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCBwdHkuaCBsaWJ1dGlsLmggXAorc3lzL3BhcmFtLmggc3lzL3BvbGwuaCBzeXMvc2VsZWN0Lmggc3lzL3NvY2tldC5oIHN5cy9zdGF0dmZzLmggc3lzL3N0YXQuaCBcCitzeXMvdGltZS5oIFwKK3N5cy90aW1lcy5oIHN5cy90eXBlcy5oIHN5cy91bi5oIHN5cy91dHNuYW1lLmggc3lzL3dhaXQuaCBwdHkuaCBsaWJ1dGlsLmggXAogc3lzL3Jlc291cmNlLmggbmV0cGFja2V0L3BhY2tldC5oIHN5c2V4aXRzLmggYmx1ZXRvb3RoLmggXAogYmx1ZXRvb3RoL2JsdWV0b290aC5oKQogQUNfSEVBREVSX0RJUkVOVApAQCAtMjM0OSw2ICsyMzUxLDM1IEBACiAgIEFDX0NIRUNLX0xJQihyZXNvbHYsIGluZXRfYXRvbikKICkKIAorZG5sIENoZWNrIGlmIHN5c3RlbSB6bGliIGhhcyAqQ29weSgpIGZ1bmN0aW9ucworZG5sCitkbmwgT24gTWFjT1NYIHRoZSBsaW5rZXIgd2lsbCBzZWFyY2ggZm9yIGR5bGlicyBvbiB0aGUgZW50aXJlIGxpbmtlciBwYXRoCitkbmwgYmVmb3JlIHNlYXJjaGluZyBmb3Igc3RhdGljIGxpYnJhcmllcy4gc2V0dXAucHkgYWRkcyAtV2wsLXNlYXJjaF9wYXRoc19maXJzdAorZG5sIHRvIHJldmVydCB0byBhIG1vcmUgdHJhZGl0aW9uYWwgdW5peCBiZWhhdmlvdXIgYW5kIG1ha2UgaXQgcG9zc2libGUgdG8KK2RubCBvdmVycmlkZSB0aGUgc3lzdGVtIGxpYnogd2l0aCBhIGxvY2FsIHN0YXRpYyBsaWJyYXJ5IG9mIGxpYnouIFRlbXBvcmFyaWx5CitkbmwgYWRkIHRoYXQgZmxhZyB0byBvdXIgQ0ZMQUdTIGFzIHdlbGwgdG8gZW5zdXJlIHRoYXQgd2UgY2hlY2sgdGhlIHZlcnNpb24KK2RubCBvZiBsaWJ6IHRoYXQgd2lsbCBiZSB1c2VkIGJ5IHNldHVwLnB5LiAKK2RubCBUaGUgLUwvdXNyL2xvY2FsL2xpYiBpcyBuZWVkZWQgYXMgd2VsIHRvIGdldCB0aGUgc2FtZSBjb21waWxhdGlvbiAKK2RubCBlbnZpcm9ubWVudCBhcyBzZXR1cC5weSAoYW5kIGxlYXZpbmcgaXQgb3V0IGNhbiBjYXVzZSBjb25maWd1cmUgdG8gdXNlIHRoZQorZG5sIHdyb25nIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkpCitjYXNlICRhY19zeXNfc3lzdGVtLyRhY19zeXNfcmVsZWFzZSBpbgorRGFyd2luLyopIAorCV9DVVJfQ0ZMQUdTPSIke0NGTEFHU30iCisJX0NVUl9MREZMQUdTPSIke0xERkxBR1N9IgorCUNGTEFHUz0iJHtDRkxBR1N9IC1XbCwtc2VhcmNoX3BhdGhzX2ZpcnN0IgorCUxERkxBR1M9IiR7TERGTEFHU30gLVdsLC1zZWFyY2hfcGF0aHNfZmlyc3QgLUwvdXNyL2xvY2FsL2xpYiIKKwk7OworZXNhYworCitBQ19DSEVDS19MSUIoeiwgaW5mbGF0ZUNvcHksIEFDX0RFRklORShIQVZFX1pMSUJfQ09QWSwgMSwgRGVmaW5lIGlmIHRoZSB6bGliIGxpYnJhcnkgaGFzIGluZmxhdGVDb3B5KSkKKworY2FzZSAkYWNfc3lzX3N5c3RlbS8kYWNfc3lzX3JlbGVhc2UgaW4KK0Rhcndpbi8qKSAKKwlDRkxBR1M9IiR7X0NVUl9DRkxBR1N9IgorCUxERkxBR1M9IiR7X0NVUl9MREZMQUdTfSIKKwk7OworZXNhYworCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yIGhzdHJlcnJvcikKIEFDX1RSWV9MSU5LKFsKICNpbmNsdWRlICJjb25mZGVmcy5oIiAKQEAgLTMyOTAsMjcgKzMzMjEsMjkgQEAKICAgW0RlZmluZSBpZiBXSU5ET1cgaW4gY3Vyc2VzLmggb2ZmZXJzIGEgZmllbGQgX2ZsYWdzLl0pCiBmaQogCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvcHRteCkKLQotaWYgdGVzdCAtZSAvZGV2L3B0bXgKLXRoZW4KLSAgQUNfTVNHX1JFU1VMVCh5ZXMpCi0gIEFDX0RFRklORShIQVZFX0RFVl9QVE1YLCAxLAotICBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdG14Ll0pCi1lbHNlCitBQ19NU0dfQ0hFQ0tJTkcoZm9yIGlzX3Rlcm1fcmVzaXplZCkKK0FDX1RSWV9DT01QSUxFKFsjaW5jbHVkZSA8Y3Vyc2VzLmg+XSwgdm9pZCAqeD1pc190ZXJtX3Jlc2l6ZWQsCisgIEFDX0RFRklORShIQVZFX0NVUlNFU19JU19URVJNX1JFU0laRUQsIDEsIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ2lzX3Rlcm1fcmVzaXplZCcgZnVuY3Rpb24uKQorICBBQ19NU0dfUkVTVUxUKHllcyksCiAgIEFDX01TR19SRVNVTFQobm8pCi1maQorKQogCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIC9kZXYvcHRjKQotCi1pZiB0ZXN0IC1lIC9kZXYvcHRjCi10aGVuCi0gIEFDX01TR19SRVNVTFQoeWVzKQotICBBQ19ERUZJTkUoSEFWRV9ERVZfUFRDLCAxLAotICBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdGMuXSkKLWVsc2UKK0FDX01TR19DSEVDS0lORyhmb3IgcmVzaXplX3Rlcm0pCitBQ19UUllfQ09NUElMRShbI2luY2x1ZGUgPGN1cnNlcy5oPl0sIHZvaWQgKng9cmVzaXplX3Rlcm0sCisgIEFDX0RFRklORShIQVZFX0NVUlNFU19SRVNJWkVfVEVSTSwgMSwgRGVmaW5lIGlmIHlvdSBoYXZlIHRoZSAncmVzaXplX3Rlcm0nIGZ1bmN0aW9uLikKKyAgQUNfTVNHX1JFU1VMVCh5ZXMpLAogICBBQ19NU0dfUkVTVUxUKG5vKQotZmkKKykKKworQUNfTVNHX0NIRUNLSU5HKGZvciByZXNpemV0ZXJtKQorQUNfVFJZX0NPTVBJTEUoWyNpbmNsdWRlIDxjdXJzZXMuaD5dLCB2b2lkICp4PXJlc2l6ZXRlcm0sCisgIEFDX0RFRklORShIQVZFX0NVUlNFU19SRVNJWkVURVJNLCAxLCBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdyZXNpemV0ZXJtJyBmdW5jdGlvbi4pCisgIEFDX01TR19SRVNVTFQoeWVzKSwKKyAgQUNfTVNHX1JFU1VMVChubykKKykKKworQUNfQ0hFQ0tfRklMRSgvZGV2L3B0bXgsIEFDX0RFRklORShIQVZFX0RFVl9QVE1YLCAxLCBbRGVmaW5lIGlmIHdlIGhhdmUgL2Rldi9wdG14Ll0pKQorQUNfQ0hFQ0tfRklMRSgvZGV2L3B0YywgQUNfREVGSU5FKEhBVkVfREVWX1BUQywgMSwgW0RlZmluZSBpZiB3ZSBoYXZlIC9kZXYvcHRjLl0pKQogCiBBQ19NU0dfQ0hFQ0tJTkcoZm9yICV6ZCBwcmludGYoKSBmb3JtYXQgc3VwcG9ydCkKIEFDX1RSWV9SVU4oWyNpbmNsdWRlIDxzdGRpby5oPgpkaWZmIC0tZ2l0IGEvcHljb25maWcuaC5pbiBiL3B5Y29uZmlnLmguaW4KaW5kZXggMTQ2OGJmNi4uYTNkN2Y2ZSAxMDA2NDQKLS0tIGEvcHljb25maWcuaC5pbgorKysgYi9weWNvbmZpZy5oLmluCkBAIC03Myw2ICs3Myw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGNvbmZzdHInIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfQ09ORlNUUgogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGNvbmlvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfQ09OSU9fSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGN0ZXJtaWQnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfQ1RFUk1JRAogCkBAIC04Miw2ICs4NSwxNSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxjdXJzZXMuaD4gaGVhZGVyIGZpbGUuICovCiAjdW5kZWYgSEFWRV9DVVJTRVNfSAogCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdpc190ZXJtX3Jlc2l6ZWQnIGZ1bmN0aW9uLiAqLworI3VuZGVmIEhBVkVfQ1VSU0VTX0lTX1RFUk1fUkVTSVpFRAorCisvKiBEZWZpbmUgaWYgeW91IGhhdmUgdGhlICdyZXNpemV0ZXJtJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NVUlNFU19SRVNJWkVURVJNCisKKy8qIERlZmluZSBpZiB5b3UgaGF2ZSB0aGUgJ3Jlc2l6ZV90ZXJtJyBmdW5jdGlvbi4gKi8KKyN1bmRlZiBIQVZFX0NVUlNFU19SRVNJWkVfVEVSTQorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgZGV2aWNlIG1hY3Jvcy4gKi8KICN1bmRlZiBIQVZFX0RFVklDRV9NQUNST1MKIApAQCAtOTEsNiArMTAzLDkgQEAKIC8qIERlZmluZSBpZiB3ZSBoYXZlIC9kZXYvcHRteC4gKi8KICN1bmRlZiBIQVZFX0RFVl9QVE1YCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZGlyZWN0Lmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfRElSRUNUX0gKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkaXJlbnQuaD4gaGVhZGVyIGZpbGUsIGFuZCBpdCBkZWZpbmVzIGBESVInLgogICAgKi8KICN1bmRlZiBIQVZFX0RJUkVOVF9ICkBAIC0xMDcsNiArMTIyLDkgQEAKIC8qIERlZmluZWQgd2hlbiBhbnkgZHluYW1pYyBtb2R1bGUgbG9hZGluZyBpcyBlbmFibGVkLiAqLwogI3VuZGVmIEhBVkVfRFlOQU1JQ19MT0FESU5HCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8ZXJybm8uaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9FUlJOT19ICisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgZXhlY3YnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfRVhFQ1YKIApAQCAtMjQ4LDYgKzI2Niw5IEBACiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGludHR5cGVzLmg+IGhlYWRlciBmaWxlLiAqLwogI3VuZGVmIEhBVkVfSU5UVFlQRVNfSAogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPGlvLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfSU9fSAorCiAvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYGtpbGwnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfS0lMTAogCkBAIC0zNTMsNiArMzc0LDkgQEAKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8cG9sbC5oPiBoZWFkZXIgZmlsZS4gKi8KICN1bmRlZiBIQVZFX1BPTExfSAogCisvKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHByb2Nlc3MuaD4gaGVhZGVyIGZpbGUuICovCisjdW5kZWYgSEFWRV9QUk9DRVNTX0gKKwogLyogRGVmaW5lIGlmIHlvdXIgY29tcGlsZXIgc3VwcG9ydHMgZnVuY3Rpb24gcHJvdG90eXBlICovCiAjdW5kZWYgSEFWRV9QUk9UT1RZUEVTCiAKQEAgLTQ0Niw2ICs0NzAsOSBAQAogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdpbnRlcnJ1cHQnIGZ1bmN0aW9uLiAqLwogI3VuZGVmIEhBVkVfU0lHSU5URVJSVVBUCiAKKy8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c2lnbmFsLmg+IGhlYWRlciBmaWxlLiAqLworI3VuZGVmIEhBVkVfU0lHTkFMX0gKKwogLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzaWdyZWxzZScgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9TSUdSRUxTRQogCkBAIC02OTIsNiArNzE5LDkgQEAKICAgICovCiAjdW5kZWYgSEFWRV9XT1JLSU5HX1RaU0VUCiAKKy8qIERlZmluZSBpZiB0aGUgemxpYiBsaWJyYXJ5IGhhcyBpbmZsYXRlQ29weSAqLworI3VuZGVmIEhBVkVfWkxJQl9DT1BZCisKIC8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgX2dldHB0eScgZnVuY3Rpb24uICovCiAjdW5kZWYgSEFWRV9fR0VUUFRZCiAKZGlmZiAtLWdpdCBhL3NldHVwLnB5IGIvc2V0dXAucHkKaW5kZXggYmQ5YjhiOC4uNWQ3MTE4MSAxMDA2NDQKLS0tIGEvc2V0dXAucHkKKysrIGIvc2V0dXAucHkKQEAgLTYzOCw2ICs2MzgsMjQgQEAKICAgICAgICAgICAgIGRiX2luY19wYXRocy5hcHBlbmQoJy9wa2cvZGItMy4lZC9pbmNsdWRlJyAlIHgpCiAgICAgICAgICAgICBkYl9pbmNfcGF0aHMuYXBwZW5kKCcvb3B0L2RiLTMuJWQvaW5jbHVkZScgJSB4KQogCisgICAgICAgICMgQWRkIHNvbWUgY29tbW9uIHN1YmRpcmVjdG9yaWVzIGZvciBTbGVlcHljYXQgREIgdG8gdGhlIGxpc3QsCisgICAgICAgICMgYmFzZWQgb24gdGhlIHN0YW5kYXJkIGluY2x1ZGUgZGlyZWN0b3JpZXMuIFRoaXMgd2F5IERCMy80IGdldHMKKyAgICAgICAgIyBwaWNrZWQgdXAgd2hlbiBpdCBpcyBpbnN0YWxsZWQgaW4gYSBub24tc3RhbmRhcmQgcHJlZml4IGFuZAorICAgICAgICAjIHRoZSB1c2VyIGhhcyBhZGRlZCB0aGF0IHByZWZpeCBpbnRvIGluY19kaXJzLgorICAgICAgICBzdGRfdmFyaWFudHMgPSBbXQorICAgICAgICBmb3IgZG4gaW4gaW5jX2RpcnM6CisgICAgICAgICAgICBzdGRfdmFyaWFudHMuYXBwZW5kKG9zLnBhdGguam9pbihkbiwgJ2RiMycpKQorICAgICAgICAgICAgc3RkX3ZhcmlhbnRzLmFwcGVuZChvcy5wYXRoLmpvaW4oZG4sICdkYjQnKSkKKyAgICAgICAgICAgIGZvciB4IGluICgwLDEsMiwzLDQpOgorICAgICAgICAgICAgICAgIHN0ZF92YXJpYW50cy5hcHBlbmQob3MucGF0aC5qb2luKGRuLCAiZGI0JWQiJXgpKQorICAgICAgICAgICAgICAgIHN0ZF92YXJpYW50cy5hcHBlbmQob3MucGF0aC5qb2luKGRuLCAiZGI0LiVkIiV4KSkKKyAgICAgICAgICAgIGZvciB4IGluICgyLDMpOgorICAgICAgICAgICAgICAgIHN0ZF92YXJpYW50cy5hcHBlbmQob3MucGF0aC5qb2luKGRuLCAiZGIzJWQiJXgpKQorICAgICAgICAgICAgICAgIHN0ZF92YXJpYW50cy5hcHBlbmQob3MucGF0aC5qb2luKGRuLCAiZGIzLiVkIiV4KSkKKworICAgICAgICBkYl9pbmNfcGF0aHMgPSBzdGRfdmFyaWFudHMgKyBkYl9pbmNfcGF0aHMKKworCiAgICAgICAgIGRiX3Zlcl9pbmNfbWFwID0ge30KIAogICAgICAgICBjbGFzcyBkYl9mb3VuZChFeGNlcHRpb24pOiBwYXNzCkBAIC04ODQsOCArOTAyLDEyIEBACiAKICAgICAgICAgIyBDdXJzZXMgc3VwcG9ydCwgcmVxdWlyaW5nIHRoZSBTeXN0ZW0gViB2ZXJzaW9uIG9mIGN1cnNlcywgb2Z0ZW4KICAgICAgICAgIyBwcm92aWRlZCBieSB0aGUgbmN1cnNlcyBsaWJyYXJ5LgorICAgICAgICBwYW5lbF9saWJyYXJ5ID0gJ3BhbmVsJwogICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ25jdXJzZXN3JykpOgogICAgICAgICAgICAgY3Vyc2VzX2xpYnMgPSBbJ25jdXJzZXN3J10KKyAgICAgICAgICAgICMgQnVnIDE0NjQwNTY6IElmIF9jdXJzZXMuc28gbGlua3Mgd2l0aCBuY3Vyc2VzdywKKyAgICAgICAgICAgICMgX2N1cnNlc19wYW5lbC5zbyBtdXN0IGxpbmsgd2l0aCBwYW5lbHcuCisgICAgICAgICAgICBwYW5lbF9saWJyYXJ5ID0gJ3BhbmVsdycKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ19jdXJzZXMnLCBbJ19jdXJzZXNtb2R1bGUuYyddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBjdXJzZXNfbGlicykgKQogICAgICAgICBlbGlmIChzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAnbmN1cnNlcycpKToKQEAgLTkwOCw5ICs5MzAsOSBAQAogCiAgICAgICAgICMgSWYgdGhlIGN1cnNlcyBtb2R1bGUgaXMgZW5hYmxlZCwgY2hlY2sgZm9yIHRoZSBwYW5lbCBtb2R1bGUKICAgICAgICAgaWYgKG1vZHVsZV9lbmFibGVkKGV4dHMsICdfY3Vyc2VzJykgYW5kCi0gICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCAncGFuZWwnKSk6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyLmZpbmRfbGlicmFyeV9maWxlKGxpYl9kaXJzLCBwYW5lbF9saWJyYXJ5KSk6CiAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCdfY3Vyc2VzX3BhbmVsJywgWydfY3Vyc2VzX3BhbmVsLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gWydwYW5lbCddICsgY3Vyc2VzX2xpYnMpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gW3BhbmVsX2xpYnJhcnldICsgY3Vyc2VzX2xpYnMpICkKIAogCiAgICAgICAgICMgQW5kcmV3IEt1Y2hsaW5nJ3MgemxpYiBtb2R1bGUuICBOb3RlIHRoYXQgc29tZSB2ZXJzaW9ucyBvZiB6bGliCkBAIC05NDAsMTMgKzk2MiwyMyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgaWYgdmVyc2lvbiA+PSB2ZXJzaW9uX3JlcToKICAgICAgICAgICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ3onKSk6CisgICAgICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHpsaWJfZXh0cmFfbGlua19hcmdzID0gKCctV2wsLXNlYXJjaF9wYXRoc19maXJzdCcsKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgemxpYl9leHRyYV9saW5rX2FyZ3MgPSAoKQogICAgICAgICAgICAgICAgICAgICBleHRzLmFwcGVuZCggRXh0ZW5zaW9uKCd6bGliJywgWyd6bGlibW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbJ3onXSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcyA9IFsneiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncyA9IHpsaWJfZXh0cmFfbGlua19hcmdzKSkKIAogICAgICAgICAjIEd1c3Rhdm8gTmllbWV5ZXIncyBiejIgbW9kdWxlLgogICAgICAgICBpZiAoc2VsZi5jb21waWxlci5maW5kX2xpYnJhcnlfZmlsZShsaWJfZGlycywgJ2J6MicpKToKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICBiejJfZXh0cmFfbGlua19hcmdzID0gKCctV2wsLXNlYXJjaF9wYXRoc19maXJzdCcsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBiejJfZXh0cmFfbGlua19hcmdzID0gKCkKICAgICAgICAgICAgIGV4dHMuYXBwZW5kKCBFeHRlbnNpb24oJ2J6MicsIFsnYnoybW9kdWxlLmMnXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyaWVzID0gWydiejInXSkgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJpZXMgPSBbJ2J6MiddLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3MgPSBiejJfZXh0cmFfbGlua19hcmdzKSApCiAKICAgICAgICAgIyBJbnRlcmZhY2UgdG8gdGhlIEV4cGF0IFhNTCBwYXJzZXIKICAgICAgICAgIwpAQCAtMTMyMSw2ICsxMzUzLDcgQEAKICAgICAgICAgc2VsZi51c2Vfc3lzdGVtX2xpYmZmaSA9IEZhbHNlCiAgICAgICAgIGluY2x1ZGVfZGlycyA9IFtdCiAgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncyA9IFtdCisgICAgICAgIGV4dHJhX2xpbmtfYXJncyA9IFtdCiAgICAgICAgIHNvdXJjZXMgPSBbJ19jdHlwZXMvX2N0eXBlcy5jJywKICAgICAgICAgICAgICAgICAgICAnX2N0eXBlcy9jYWxsYmFja3MuYycsCiAgICAgICAgICAgICAgICAgICAgJ19jdHlwZXMvY2FsbHByb2MuYycsCkBAIC0xMzM1LDkgKzEzNjgsMjEgQEAKICMgWFhYIElzIHRoaXMgc3RpbGwgbmVlZGVkPwogIyMgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3MuZXh0ZW5kKFsnLXJlYWRfb25seV9yZWxvY3MnLCAnd2FybmluZyddKQogCisgICAgICAgIGVsaWYgc3lzLnBsYXRmb3JtID09ICdzdW5vczUnOgorICAgICAgICAgICAgIyBYWFggVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5OyBpdCBhcHBlYXJzIHRoYXQgc29tZQorICAgICAgICAgICAgIyBvZiB0aGUgYXNzZW1ibGVyIGNvZGUgaXMgbm9uLVBJQyAoaS5lLiBpdCBoYXMgcmVsb2NhdGlvbnMKKyAgICAgICAgICAgICMgd2hlbiBpdCBzaG91bGRuJ3QuIFRoZSBwcm9wZXIgZml4IHdvdWxkIGJlIHRvIHJld3JpdGUKKyAgICAgICAgICAgICMgdGhlIGFzc2VtYmxlciBjb2RlIHRvIGJlIFBJQy4KKyAgICAgICAgICAgICMgVGhpcyBvbmx5IHdvcmtzIHdpdGggR0NDOyB0aGUgU3VuIGNvbXBpbGVyIGxpa2VseSByZWZ1c2VzCisgICAgICAgICAgICAjIHRoaXMgb3B0aW9uLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGN0eXBlcyB3aXRoIHRoZSBTdW4KKyAgICAgICAgICAgICMgY29tcGlsZXIsIHBsZWFzZSByZXNlYXJjaCBhIHByb3BlciBzb2x1dGlvbiwgaW5zdGVhZCBvZgorICAgICAgICAgICAgIyBmaW5kaW5nIHNvbWUgLXogb3B0aW9uIGZvciB0aGUgU3VuIGNvbXBpbGVyLgorICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzLmFwcGVuZCgnLW1pbXB1cmUtdGV4dCcpCisKICAgICAgICAgZXh0ID0gRXh0ZW5zaW9uKCdfY3R5cGVzJywKICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfZGlycz1pbmNsdWRlX2RpcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9jb21waWxlX2FyZ3M9ZXh0cmFfY29tcGlsZV9hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFfbGlua19hcmdzPWV4dHJhX2xpbmtfYXJncywKICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1bXSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9c291cmNlcywKICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZHM9ZGVwZW5kcykK