ZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZmVkaXRfZW1iZWRkZXJ0ZXN0LmNwcCBiL2ZwZGZzZGsvZnBkZmVkaXRfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA2NDU0YzM0Li45NTI1NjRkIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZlZGl0X2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmZWRpdF9lbWJlZGRlcnRlc3QuY3BwCkBAIC0xNjQsMjIgKzE2NCw2IEBACiAgICAgIjM3OVxyXG4iCiAgICAgIiUlRU9GXHJcbiI7CiAKLWludCBHZXRCbG9ja0Zyb21TdHJpbmcodm9pZCogcGFyYW0sCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkgewotICBzdGQ6OnN0cmluZyogbmV3X2ZpbGUgPSBzdGF0aWNfY2FzdDxzdGQ6OnN0cmluZyo+KHBhcmFtKTsKLSAgaWYgKCFuZXdfZmlsZSB8fCBwb3MgKyBzaXplIDwgcG9zKQotICAgIHJldHVybiAwOwotCi0gIHVuc2lnbmVkIGxvbmcgZmlsZV9zaXplID0gbmV3X2ZpbGUtPnNpemUoKTsKLSAgaWYgKHBvcyArIHNpemUgPiBmaWxlX3NpemUpCi0gICAgcmV0dXJuIDA7Ci0KLSAgbWVtY3B5KGJ1ZiwgbmV3X2ZpbGUtPmRhdGEoKSArIHBvcywgc2l6ZSk7Ci0gIHJldHVybiAxOwotfQotCiB9ICAvLyBuYW1lc3BhY2UKIAogVEVTVF9GKEZQREZFZGl0RW1iZWRkZXJ0ZXN0LCBFbXB0eUNyZWF0aW9uKSB7CmRpZmYgLS1naXQgYS9mcGRmc2RrL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmZm9ybWZpbGxfZW1iZWRkZXJ0ZXN0LmNwcAppbmRleCA0N2YxYTc1Li42MzFhNmEyIDEwMDY0NAotLS0gYS9mcGRmc2RrL2ZwZGZmb3JtZmlsbF9lbWJlZGRlcnRlc3QuY3BwCisrKyBiL2ZwZGZzZGsvZnBkZmZvcm1maWxsX2VtYmVkZGVydGVzdC5jcHAKQEAgLTIsNiArMiwxMSBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjb3JlL2Z4Y3J0L2Z4X3N5c3RlbS5oIgorI2luY2x1ZGUgInB1YmxpYy9jcHAvZnBkZl9kZWxldGVycy5oIgogI2luY2x1ZGUgInB1YmxpYy9mcGRmX2Zvcm1maWxsLmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0X21vY2tfZGVsZWdhdGUuaCIKQEAgLTEyLDcgKzE3LDcgQEAKIHVzaW5nIHRlc3Rpbmc6Ol87CiB1c2luZyB0ZXN0aW5nOjpSZXR1cm47CiAKLWNsYXNzIEZQREZGb3JtRmlsbEVtYmVkZGVydGVzdCA6IHB1YmxpYyBFbWJlZGRlclRlc3Qge307CitjbGFzcyBGUERGRm9ybUZpbGxFbWJlZGRlcnRlc3QgOiBwdWJsaWMgRW1iZWRkZXJUZXN0LCBwdWJsaWMgVGVzdFNhdmVyIHt9OwogCiBURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBGaXJzdFRlc3QpIHsKICAgRW1iZWRkZXJUZXN0TW9ja0RlbGVnYXRlIG1vY2s7CkBAIC0xOTcsMyArMjAyLDY1IEBACiB9CiAKICNlbmRpZiAgLy8gUERGX0VOQUJMRV9WOAorCitURVNUX0YoRlBERkZvcm1GaWxsRW1iZWRkZXJ0ZXN0LCBGb3JtVGV4dCkgeworI2lmIF9GWE1fUExBVEZPUk1fID09IF9GWE1fUExBVEZPUk1fQVBQTEVfCisgIGNvbnN0IGNoYXIgbWQ1XzFbXSA9ICI1ZjExZGJlNTc1ZmUxOTdhMzdjM2ZiNDIyNTU5ZjhmZiI7CisgIGNvbnN0IGNoYXIgbWQ1XzJbXSA9ICIzNWIxYTRiNjc5ZWFmYzc0OWEwYjZmZGE3NTBjMGU4ZCI7CisgIGNvbnN0IGNoYXIgbWQ1XzNbXSA9ICI2NWM2NGE3YzM1NTM4OGY3MTlhNzUyYWExZTIzZjZmZSI7CisjZWxzZQorICBjb25zdCBjaGFyIG1kNV8xW10gPSAiMjNiYWVjYzZlOTRkNGM4Yjg5NGNkMzlhYTA0YzU4NGMiOworICBjb25zdCBjaGFyIG1kNV8yW10gPSAiNDk5ZGY5NWQ0NzdkZmUzNWVlNjViODIzYzY5NzQzYjUiOworICBjb25zdCBjaGFyIG1kNV8zW10gPSAiOGY5MWI2Mjg5NWZjNTA1ZDllMTdmZjJkNjMzNzU2ZDQiOworI2VuZGlmCisgIHsKKyAgICBFWFBFQ1RfVFJVRShPcGVuRG9jdW1lbnQoInRleHRfZm9ybS5wZGYiKSk7CisgICAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgICBBU1NFUlRfVFJVRShwYWdlKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERkJpdG1hcERlbGV0ZXI+IGJpdG1hcDEoUmVuZGVyUGFnZShwYWdlKSk7CisgICAgQ29tcGFyZUJpdG1hcChiaXRtYXAxLmdldCgpLCAzMDAsIDMwMCwgbWQ1XzEpOworCisgICAgLy8gQ2xpY2sgb24gdGhlIHRleHRmaWVsZAorICAgIEVYUEVDVF9FUShGUERGX0ZPUk1GSUVMRF9URVhURklFTEQsCisgICAgICAgICAgICAgIEZQREZQYWdlX0hhc0Zvcm1GaWVsZEF0UG9pbnQoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMTIwLjAsIDEyMC4wKSk7CisgICAgRk9STV9Pbk1vdXNlTW92ZShmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxMjAuMCwgMTIwLjApOworICAgIEZPUk1fT25MQnV0dG9uRG93bihmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxMjAuMCwgMTIwLjApOworICAgIEZPUk1fT25MQnV0dG9uVXAoZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTIwLjAsIDEyMC4wKTsKKworICAgIC8vIFdyaXRlICJBQkMiCisgICAgRk9STV9PbkNoYXIoZm9ybV9oYW5kbGUoKSwgcGFnZSwgNjUsIDApOworICAgIEZPUk1fT25DaGFyKGZvcm1faGFuZGxlKCksIHBhZ2UsIDY2LCAwKTsKKyAgICBGT1JNX09uQ2hhcihmb3JtX2hhbmRsZSgpLCBwYWdlLCA2NywgMCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZCaXRtYXBEZWxldGVyPiBiaXRtYXAyKFJlbmRlclBhZ2UocGFnZSkpOworICAgIENvbXBhcmVCaXRtYXAoYml0bWFwMi5nZXQoKSwgMzAwLCAzMDAsIG1kNV8yKTsKKworICAgIC8vIFRha2Ugb3V0IGZvY3VzIGJ5IGNsaWNraW5nIG91dCBvZiB0aGUgdGV4dGZpZWxkCisgICAgRk9STV9Pbk1vdXNlTW92ZShmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxNS4wLCAxNS4wKTsKKyAgICBGT1JNX09uTEJ1dHRvbkRvd24oZm9ybV9oYW5kbGUoKSwgcGFnZSwgMCwgMTUuMCwgMTUuMCk7CisgICAgRk9STV9PbkxCdXR0b25VcChmb3JtX2hhbmRsZSgpLCBwYWdlLCAwLCAxNS4wLCAxNS4wKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgRlBERkJpdG1hcERlbGV0ZXI+IGJpdG1hcDMoUmVuZGVyUGFnZShwYWdlKSk7CisgICAgQ29tcGFyZUJpdG1hcChiaXRtYXAzLmdldCgpLCAzMDAsIDMwMCwgbWQ1XzMpOworCisgICAgRVhQRUNUX1RSVUUoRlBERl9TYXZlQXNDb3B5KGRvY3VtZW50KCksIHRoaXMsIDApKTsKKworICAgIC8vIENsb3NlIGV2ZXJ5dGhpbmcKKyAgICBVbmxvYWRQYWdlKHBhZ2UpOworICAgIEZQREZET0NfRXhpdEZvcm1GaWxsRW52aXJvbm1lbnQoZm9ybV9oYW5kbGVfKTsKKyAgICBGUERGX0Nsb3NlRG9jdW1lbnQoZG9jdW1lbnRfKTsKKyAgfQorICAvLyBDaGVjayBzYXZlZCBkb2N1bWVudAorICBzdGQ6OnN0cmluZyBuZXdfZmlsZSA9IEdldFN0cmluZygpOworICBGUERGX0ZJTEVBQ0NFU1MgZmlsZV9hY2Nlc3M7CisgIG1lbXNldCgmZmlsZV9hY2Nlc3MsIDAsIHNpemVvZihmaWxlX2FjY2VzcykpOworICBmaWxlX2FjY2Vzcy5tX0ZpbGVMZW4gPSBuZXdfZmlsZS5zaXplKCk7CisgIGZpbGVfYWNjZXNzLm1fR2V0QmxvY2sgPSBHZXRCbG9ja0Zyb21TdHJpbmc7CisgIGZpbGVfYWNjZXNzLm1fUGFyYW0gPSAmbmV3X2ZpbGU7CisgIGRvY3VtZW50XyA9IEZQREZfTG9hZEN1c3RvbURvY3VtZW50KCZmaWxlX2FjY2VzcywgbnVsbHB0cik7CisgIFNldHVwRm9ybUZpbGxFbnZpcm9ubWVudCgpOworICBFWFBFQ1RfRVEoMSwgRlBERl9HZXRQYWdlQ291bnQoZG9jdW1lbnRfKSk7CisgIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBGUERGUGFnZURlbGV0ZXI+IG5ld19wYWdlKEZQREZfTG9hZFBhZ2UoZG9jdW1lbnRfLCAwKSk7CisgIEFTU0VSVF9UUlVFKG5ld19wYWdlLmdldCgpKTsKKyAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIEZQREZCaXRtYXBEZWxldGVyPiBuZXdfYml0bWFwKAorICAgICAgUmVuZGVyUGFnZShuZXdfcGFnZS5nZXQoKSkpOworICBDb21wYXJlQml0bWFwKG5ld19iaXRtYXAuZ2V0KCksIDMwMCwgMzAwLCBtZDVfMyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy90ZXh0X2Zvcm0uaW4gYi90ZXN0aW5nL3Jlc291cmNlcy90ZXh0X2Zvcm0uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3Mjk4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3RleHRfZm9ybS5pbgpAQCAtMCwwICsxLDU3IEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fQorPDwKKyAgL1R5cGUgL0NhdGFsb2cKKyAgL1BhZ2VzIDIgMCBSCisgIC9BY3JvRm9ybSA8PCAvRmllbGRzIFsgNCAwIFIgXSAvRFIgNSAwIFIgPj4KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDIgMH19Cis8PCAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19Cis8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgNSAwIFIKKyAgL01lZGlhQm94IFsgMCAwIDMwMCAzMDAgXQorICAvQ29udGVudHMgOCAwIFIKKyAgL0Fubm90cyBbIDQgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDQgMH19Cis8PAorICAvVHlwZSAvQW5ub3QKKyAgL0ZUIC9UeAorICAvVCAoVGV4dCBCb3gpCisgIC9EQSAoMCAwIDAgcmcgL0YxIDEyIFRmKQorICAvUmVjdCBbIDEwMCAxMDAgMjAwIDEzMCBdCisgIC9TdWJ0eXBlIC9XaWRnZXQKKz4+CitlbmRvYmoKK3t7b2JqZWN0IDUgMH19Cis8PCAvRm9udCA2IDAgUiA+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fQorPDwgL0YxIDcgMCBSID4+CitlbmRvYmoKK3t7b2JqZWN0IDcgMH19IDw8CisgIC9UeXBlIC9Gb250CisgIC9TdWJ0eXBlIC9UeXBlMQorICAvQmFzZUZvbnQgL0hlbHZldGljYQorPj4KK3t7b2JqZWN0IDggMH19Cis8PCAvTGVuZ3RoIDUxID4+CitzdHJlYW0KK0JUCiswIDAgMCByZworL0YxIDEyIFRmCisxMDAgMTUwIFRkCisoVGVzdCBGb3JtKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlcjw8IC9TaXplIDggL1Jvb3QgMSAwIFIgPj4KK3t7c3RhcnR4cmVmfX0KKyUlRU9GCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy90ZXh0X2Zvcm0ucGRmIGIvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtLnBkZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzJhNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdGluZy9yZXNvdXJjZXMvdGV4dF9mb3JtLnBkZgpAQCAtMCwwICsxLDY5IEBACislUERGLTEuNworJaDypPQKKzEgMCBvYmoKKzw8CisgIC9UeXBlIC9DYXRhbG9nCisgIC9QYWdlcyAyIDAgUgorICAvQWNyb0Zvcm0gPDwgL0ZpZWxkcyBbIDQgMCBSIF0gL0RSIDUgMCBSID4+Cis+PgorZW5kb2JqCisyIDAgb2JqCis8PCAvQ291bnQgMSAvS2lkcyBbIDMgMCBSIF0gL1R5cGUgL1BhZ2VzID4+CitlbmRvYmoKKzMgMCBvYmoKKzw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA1IDAgUgorICAvTWVkaWFCb3ggWyAwIDAgMzAwIDMwMCBdCisgIC9Db250ZW50cyA4IDAgUgorICAvQW5ub3RzIFsgNCAwIFIgXQorPj4KK2VuZG9iagorNCAwIG9iagorPDwKKyAgL1R5cGUgL0Fubm90CisgIC9GVCAvVHgKKyAgL1QgKFRleHQgQm94KQorICAvREEgKDAgMCAwIHJnIC9GMSAxMiBUZikKKyAgL1JlY3QgWyAxMDAgMTAwIDIwMCAxMzAgXQorICAvU3VidHlwZSAvV2lkZ2V0Cis+PgorZW5kb2JqCis1IDAgb2JqCis8PCAvRm9udCA2IDAgUiA+PgorZW5kb2JqCis2IDAgb2JqCis8PCAvRjEgNyAwIFIgPj4KK2VuZG9iagorNyAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+Cis4IDAgb2JqCis8PCAvTGVuZ3RoIDUxID4+CitzdHJlYW0KK0JUCiswIDAgMCByZworL0YxIDEyIFRmCisxMDAgMTUwIFRkCisoVGVzdCBGb3JtKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDkKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAxMTQgMDAwMDAgbiAKKzAwMDAwMDAxNzMgMDAwMDAgbiAKKzAwMDAwMDAzMDkgMDAwMDAgbiAKKzAwMDAwMDA0NDUgMDAwMDAgbiAKKzAwMDAwMDA0NzggMDAwMDAgbiAKKzAwMDAwMDA1MDkgMDAwMDAgbiAKKzAwMDAwMDA1NzggMDAwMDAgbiAKK3RyYWlsZXI8PCAvU2l6ZSA4IC9Sb290IDEgMCBSID4+CitzdGFydHhyZWYKKzY3OAorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmNwcCBiL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmNwcAppbmRleCAyMGYxY2FkLi4xZjUyNzgxIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5jcHAKKysrIGIvdGVzdGluZy90ZXN0X3N1cHBvcnQuY3BwCkBAIC0yMTIsNiArMjEyLDIzIEBACiAgIHJldHVybiAxOwogfQogCisvLyBzdGF0aWMKK2ludCBUZXN0U2F2ZXI6OkdldEJsb2NrRnJvbVN0cmluZyh2b2lkKiBwYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBzaXplKSB7CisgIHN0ZDo6c3RyaW5nKiBuZXdfZmlsZSA9IHN0YXRpY19jYXN0PHN0ZDo6c3RyaW5nKj4ocGFyYW0pOworICBpZiAoIW5ld19maWxlIHx8IHBvcyArIHNpemUgPCBwb3MpCisgICAgcmV0dXJuIDA7CisKKyAgdW5zaWduZWQgbG9uZyBmaWxlX3NpemUgPSBuZXdfZmlsZS0+c2l6ZSgpOworICBpZiAocG9zICsgc2l6ZSA+IGZpbGVfc2l6ZSkKKyAgICByZXR1cm4gMDsKKworICBtZW1jcHkoYnVmLCBuZXdfZmlsZS0+ZGF0YSgpICsgcG9zLCBzaXplKTsKKyAgcmV0dXJuIDE7Cit9CisKIG5hbWVzcGFjZSBwZGZpdW0gewogCiB2b2lkIEZQREZfVGVzdDo6U2V0VXAoKSB7CmRpZmYgLS1naXQgYS90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oIGIvdGVzdGluZy90ZXN0X3N1cHBvcnQuaAppbmRleCBiNzM0YmMzLi5mMTc1ODExIDEwMDY0NAotLS0gYS90ZXN0aW5nL3Rlc3Rfc3VwcG9ydC5oCisrKyBiL3Rlc3RpbmcvdGVzdF9zdXBwb3J0LmgKQEAgLTExNSw2ICsxMTUsMTIgQEAKICAgdm9pZCBDbGVhclN0cmluZygpOwogICBjb25zdCBzdGQ6OnN0cmluZyYgR2V0U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gbV9TdHJpbmc7IH0KIAorIHByb3RlY3RlZDoKKyAgc3RhdGljIGludCBHZXRCbG9ja0Zyb21TdHJpbmcodm9pZCogcGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKICBwcml2YXRlOgogICBzdGF0aWMgaW50IFdyaXRlQmxvY2tDYWxsYmFjayhGUERGX0ZJTEVXUklURSogcEZpbGVXcml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGF0YSwK