ZGlmZiAtLWdpdCBhL2NvcmUvZnBkZmFwaS9lZGl0L2ZwZGZfZWRpdF9jcmVhdGUuY3BwIGIvY29yZS9mcGRmYXBpL2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKaW5kZXggZjY0M2QzZi4uNGJkYjYzYyAxMDA2NDQKLS0tIGEvY29yZS9mcGRmYXBpL2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKKysrIGIvY29yZS9mcGRmYXBpL2VkaXQvZnBkZl9lZGl0X2NyZWF0ZS5jcHAKQEAgLTE4MiwxMiArMTgyLDE1IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICAgIH0KICAgICAgIG9mZnNldCArPSA4OwotICAgICAgYXV0byBwQWNjID0gcGRmaXVtOjpNYWtlUmV0YWluPENQREZfU3RyZWFtQWNjPihwKTsKLSAgICAgIHBBY2MtPkxvYWRBbGxEYXRhKHRydWUpOwotICAgICAgaWYgKHBGaWxlLT5BcHBlbmRCbG9jayhwQWNjLT5HZXREYXRhKCksIHBBY2MtPkdldFNpemUoKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgIGlmIChwLT5HZXRSYXdTaXplKCkgPiAwKSB7CisgICAgICAgIGF1dG8gcEFjYyA9IHBkZml1bTo6TWFrZVJldGFpbjxDUERGX1N0cmVhbUFjYz4ocCk7CisgICAgICAgIHBBY2MtPkxvYWRBbGxEYXRhKHRydWUpOworCisgICAgICAgIGlmIChwRmlsZS0+QXBwZW5kQmxvY2socEFjYy0+R2V0RGF0YSgpLCBwQWNjLT5HZXRTaXplKCkpIDwgMCkgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBvZmZzZXQgKz0gcEFjYy0+R2V0U2l6ZSgpOwogICAgICAgfQotICAgICAgb2Zmc2V0ICs9IHBBY2MtPkdldFNpemUoKTsKICAgICAgIGlmICgobGVuID0gcEZpbGUtPkFwcGVuZFN0cmluZygiXHJcbmVuZHN0cmVhbSIpKSA8IDApIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuY3BwIGIvY29yZS9mcGRmYXBpL3BhcnNlci9jcGRmX3N5bnRheF9wYXJzZXIuY3BwCmluZGV4IGVjZjJjZjYuLjdiNzQ5NWQgMTAwNjQ0Ci0tLSBhL2NvcmUvZnBkZmFwaS9wYXJzZXIvY3BkZl9zeW50YXhfcGFyc2VyLmNwcAorKysgYi9jb3JlL2ZwZGZhcGkvcGFyc2VyL2NwZGZfc3ludGF4X3BhcnNlci5jcHAKQEAgLTcyNCwxMCArNzI0LDExIEBACiAgICAgfQogICAgIG1fUG9zID0gc3RyZWFtU3RhcnRQb3M7CiAgIH0KLQotICAvLyBSZWFkIHVwIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgLy8gUmVhZCB1cCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuIE5vdGUsIHdlIGFsbG93IHplcm8gbGVuZ3RoIHN0cmVhbXMgYXMKKyAgLy8gd2UgbmVlZCB0byBwYXNzIHRoZW0gdGhyb3VnaCB3aGVuIHdlIGFyZSBpbXBvcnRpbmcgcGFnZXMgaW50byBhIG5ldworICAvLyBkb2N1bWVudC4KICAgbGVuID0gc3RkOjptaW4obGVuLCBtX0ZpbGVMZW4gLSBtX1BvcyAtIG1fSGVhZGVyT2Zmc2V0KTsKLSAgaWYgKGxlbiA8PSAwKQorICBpZiAobGVuIDwgMCkKICAgICByZXR1cm4gbnVsbHB0cjsKIAogICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdCwgRnhGcmVlRGVsZXRlcj4gcERhdGE7CkBAIC03NDUsNyArNzQ2LDYgQEAKICAgICAgIHBEYXRhID0gZGVzdF9idWYuRGV0YWNoQnVmZmVyKCk7CiAgICAgfQogICB9Ci0KICAgYXV0byBwU3RyZWFtID0KICAgICAgIHBkZml1bTo6TWFrZVVuaXF1ZTxDUERGX1N0cmVhbT4oc3RkOjptb3ZlKHBEYXRhKSwgbGVuLCBzdGQ6Om1vdmUocERpY3QpKTsKICAgc3RyZWFtU3RhcnRQb3MgPSBtX1BvczsKZGlmZiAtLWdpdCBhL2ZwZGZzZGsvZnBkZnBwb19lbWJlZGRlcnRlc3QuY3BwIGIvZnBkZnNkay9mcGRmcHBvX2VtYmVkZGVydGVzdC5jcHAKaW5kZXggZGIzOTcwMC4uN2U2ZmYzMyAxMDA2NDQKLS0tIGEvZnBkZnNkay9mcGRmcHBvX2VtYmVkZGVydGVzdC5jcHAKKysrIGIvZnBkZnNkay9mcGRmcHBvX2VtYmVkZGVydGVzdC5jcHAKQEAgLTEsMTEgKzEsMTEgQEAKIC8vIENvcHlyaWdodCAyMDE2IFBERml1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQotI2luY2x1ZGUgInB1YmxpYy9mcGRmX3Bwby5oIgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImNvcmUvZnhjcnQvZnhfYmFzaWMuaCIKICNpbmNsdWRlICJwdWJsaWMvZnBkZl9lZGl0LmgiCisjaW5jbHVkZSAicHVibGljL2ZwZGZfcHBvLmgiCiAjaW5jbHVkZSAicHVibGljL2ZwZGZ2aWV3LmgiCiAjaW5jbHVkZSAidGVzdGluZy9lbWJlZGRlcl90ZXN0LmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCkBAIC0xMzEsNyArMTMxLDcgQEAKICAgRVhQRUNUX1RSVUUoT3BlbkRvY3VtZW50KCJidWdfNjY0Mjg0LnBkZiIpKTsKIAogICBGUERGX1BBR0UgcGFnZSA9IExvYWRQYWdlKDApOwotICBFWFBFQ1RfVFJVRShwYWdlKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHBhZ2UpOwogCiAgIEZQREZfRE9DVU1FTlQgb3V0cHV0X2RvYyA9IEZQREZfQ3JlYXRlTmV3RG9jdW1lbnQoKTsKICAgRVhQRUNUX1RSVUUob3V0cHV0X2RvYyk7CkBAIC0xNDAsMyArMTQwLDM3IEBACiAKICAgVW5sb2FkUGFnZShwYWdlKTsKIH0KKworVEVTVF9GKEZQREZQUE9FbWJlZGRlcnRlc3QsIEltcG9ydFdpdGhaZXJvTGVuZ3RoU3RyZWFtKSB7CisgIEVYUEVDVF9UUlVFKE9wZW5Eb2N1bWVudCgiemVyb19sZW5ndGhfc3RyZWFtLnBkZiIpKTsKKyAgRlBERl9QQUdFIHBhZ2UgPSBMb2FkUGFnZSgwKTsKKyAgQVNTRVJUX05FKG51bGxwdHIsIHBhZ2UpOworCisgIEZQREZfQklUTUFQIGJpdG1hcCA9IFJlbmRlclBhZ2UocGFnZSk7CisgIEFTU0VSVF9FUSgyMDAsIEZQREZCaXRtYXBfR2V0V2lkdGgoYml0bWFwKSk7CisgIEFTU0VSVF9FUSgyMDAsIEZQREZCaXRtYXBfR2V0SGVpZ2h0KGJpdG1hcCkpOworICBBU1NFUlRfRVEoODAwLCBGUERGQml0bWFwX0dldFN0cmlkZShiaXRtYXApKTsKKworICBzdGQ6OnN0cmluZyBkaWdlc3QgPSBIYXNoQml0bWFwKGJpdG1hcCwgMjAwLCAyMDApOworICBGUERGQml0bWFwX0Rlc3Ryb3koYml0bWFwKTsKKyAgRlBERl9DbG9zZVBhZ2UocGFnZSk7CisKKyAgRlBERl9ET0NVTUVOVCBuZXdfZG9jID0gRlBERl9DcmVhdGVOZXdEb2N1bWVudCgpOworICBFWFBFQ1RfVFJVRShuZXdfZG9jKTsKKyAgRVhQRUNUX1RSVUUoRlBERl9JbXBvcnRQYWdlcyhuZXdfZG9jLCBkb2N1bWVudCgpLCAiMSIsIDApKTsKKworICBFWFBFQ1RfRVEoMSwgRlBERl9HZXRQYWdlQ291bnQobmV3X2RvYykpOworICBGUERGX1BBR0UgbmV3X3BhZ2UgPSBGUERGX0xvYWRQYWdlKG5ld19kb2MsIDApOworICBBU1NFUlRfTkUobnVsbHB0ciwgbmV3X3BhZ2UpOworICBGUERGX0JJVE1BUCBuZXdfYml0bWFwID0gUmVuZGVyUGFnZShuZXdfcGFnZSk7CisgIEFTU0VSVF9FUSgyMDAsIEZQREZCaXRtYXBfR2V0V2lkdGgobmV3X2JpdG1hcCkpOworICBBU1NFUlRfRVEoMjAwLCBGUERGQml0bWFwX0dldEhlaWdodChuZXdfYml0bWFwKSk7CisgIEFTU0VSVF9FUSg4MDAsIEZQREZCaXRtYXBfR2V0U3RyaWRlKG5ld19iaXRtYXApKTsKKworICBzdGQ6OnN0cmluZyBuZXdfZGlnZXN0ID0gSGFzaEJpdG1hcChuZXdfYml0bWFwLCAyMDAsIDIwMCk7CisgIEZQREZCaXRtYXBfRGVzdHJveShuZXdfYml0bWFwKTsKKyAgRlBERl9DbG9zZVBhZ2UobmV3X3BhZ2UpOworICBGUERGX0Nsb3NlRG9jdW1lbnQobmV3X2RvYyk7CisKKyAgRVhQRUNUX0VRKGRpZ2VzdCwgbmV3X2RpZ2VzdCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwIGIvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmNwcAppbmRleCA3OTA3NDE1Li5mMmEyNzAwIDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuY3BwCisrKyBiL3Rlc3RpbmcvZW1iZWRkZXJfdGVzdC5jcHAKQEAgLTMzNiw2ICszMzYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZV9pbmRleCk7CiB9CiAKK3N0ZDo6c3RyaW5nIEVtYmVkZGVyVGVzdDo6SGFzaEJpdG1hcChGUERGX0JJVE1BUCBiaXRtYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHBlY3RlZF9oZWlnaHQpIHsKKyAgdWludDhfdCBkaWdlc3RbMTZdOworICBDUllQVF9NRDVHZW5lcmF0ZShzdGF0aWNfY2FzdDx1aW50OF90Kj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3dpZHRoICogNCAqIGV4cGVjdGVkX2hlaWdodCwgZGlnZXN0KTsKKyAgcmV0dXJuIENSWVBUX1RvQmFzZTE2KGRpZ2VzdCk7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBFbWJlZGRlclRlc3Q6OkNvbXBhcmVCaXRtYXAoRlBERl9CSVRNQVAgYml0bWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX3dpZHRoLApAQCAtMzQ5LDEwICszNTgsOCBAQAogICBpZiAoIWV4cGVjdGVkX21kNXN1bSkKICAgICByZXR1cm47CiAKLSAgdWludDhfdCBkaWdlc3RbMTZdOwotICBDUllQVF9NRDVHZW5lcmF0ZShzdGF0aWNfY2FzdDx1aW50OF90Kj4oRlBERkJpdG1hcF9HZXRCdWZmZXIoYml0bWFwKSksCi0gICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3N0cmlkZSAqIGV4cGVjdGVkX2hlaWdodCwgZGlnZXN0KTsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX21kNXN1bSwgQ1JZUFRfVG9CYXNlMTYoZGlnZXN0KSk7CisgIEVYUEVDVF9FUShleHBlY3RlZF9tZDVzdW0sCisgICAgICAgICAgICBIYXNoQml0bWFwKGJpdG1hcCwgZXhwZWN0ZWRfd2lkdGgsIGV4cGVjdGVkX2hlaWdodCkpOwogfQogCiAvLyBDYW4ndCB1c2UgZ3Rlc3QtcHJvdmlkZWQgbWFpbiBzaW5jZSB3ZSBuZWVkIHRvIHN0YXNoIHRoZSBwYXRoIHRvIHRoZQpkaWZmIC0tZ2l0IGEvdGVzdGluZy9lbWJlZGRlcl90ZXN0LmggYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaAppbmRleCA2MTlmYzVkLi4yYmI3OTZkIDEwMDY0NAotLS0gYS90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaAorKysgYi90ZXN0aW5nL2VtYmVkZGVyX3Rlc3QuaApAQCAtMTA4LDYgKzEwOCwxMSBAQAogIHByb3RlY3RlZDoKICAgdm9pZCBTZXR1cEZvcm1GaWxsRW52aXJvbm1lbnQoKTsKIAorICAvLyBSZXR1cm4gdGhlIGhhc2ggb2YgfGJpdG1hcHwuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBIYXNoQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4cGVjdGVkX3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfaGVpZ2h0KTsKKwogICAvLyBDaGVjayB8Yml0bWFwfCB0byBtYWtlIHN1cmUgaXQgaGFzIHRoZSByaWdodCBkaW1lbnNpb25zIGFuZCBjb250ZW50LgogICBzdGF0aWMgdm9pZCBDb21wYXJlQml0bWFwKEZQREZfQklUTUFQIGJpdG1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXhwZWN0ZWRfd2lkdGgsCmRpZmYgLS1naXQgYS90ZXN0aW5nL3Jlc291cmNlcy96ZXJvX2xlbmd0aF9zdHJlYW0uaW4gYi90ZXN0aW5nL3Jlc291cmNlcy96ZXJvX2xlbmd0aF9zdHJlYW0uaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyNThkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RpbmcvcmVzb3VyY2VzL3plcm9fbGVuZ3RoX3N0cmVhbS5pbgpAQCAtMCwwICsxLDYzIEBACit7e2hlYWRlcn19Cit7e29iamVjdCAxIDB9fSA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+Cit7e29iamVjdCAyIDB9fSA8PAorICAvVHlwZSAvUGFnZXMKKyAgL01lZGlhQm94IFsgMCAwIDIwMCAyMDAgXQorICAvQ291bnQgMQorICAvS2lkcyBbIDMgMCBSIF0KKz4+CitlbmRvYmoKK3t7b2JqZWN0IDMgMH19IDw8CisgIC9UeXBlIC9QYWdlCisgIC9QYXJlbnQgMiAwIFIKKyAgL1Jlc291cmNlcyA8PAorICAgIC9Gb250IDw8CisgICAgICAvRjEgNCAwIFIKKyAgICAgIC9GMiA1IDAgUgorICAgID4+CisgID4+CisgIC9Db250ZW50cyBbNiAwIFIgNyAwIFJdCis+PgorZW5kb2JqCit7e29iamVjdCA0IDB9fSA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagore3tvYmplY3QgNSAwfX0gPDwKKyAgL1R5cGUgL0ZvbnQKKyAgL1N1YnR5cGUgL1R5cGUxCisgIC9CYXNlRm9udCAvSGVsdmV0aWNhCis+PgorZW5kb2JqCit7e29iamVjdCA2IDB9fSA8PAorICAvRmlsdGVyIC9GbGF0ZURlY29kZQorICAvTGVuZ3RoIDAKKz4+CitzdHJlYW0KK2VuZHN0cmVhbQorZW5kb2JqCit7e29iamVjdCA3IDB9fSA8PAorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit7e3hyZWZ9fQordHJhaWxlciA8PAorICAvU2l6ZSA2CisgIC9Sb290IDEgMCBSCis+Pgore3tzdGFydHhyZWZ9fQorJSVFT0YKZGlmZiAtLWdpdCBhL3Rlc3RpbmcvcmVzb3VyY2VzL3plcm9fbGVuZ3RoX3N0cmVhbS5wZGYgYi90ZXN0aW5nL3Jlc291cmNlcy96ZXJvX2xlbmd0aF9zdHJlYW0ucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZmFlNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0aW5nL3Jlc291cmNlcy96ZXJvX2xlbmd0aF9zdHJlYW0ucGRmCkBAIC0wLDAgKzEsNzQgQEAKKyVQREYtMS43CisloPKk9AorMSAwIG9iaiA8PAorICAvVHlwZSAvQ2F0YWxvZworICAvUGFnZXMgMiAwIFIKKz4+CisyIDAgb2JqIDw8CisgIC9UeXBlIC9QYWdlcworICAvTWVkaWFCb3ggWyAwIDAgMjAwIDIwMCBdCisgIC9Db3VudCAxCisgIC9LaWRzIFsgMyAwIFIgXQorPj4KK2VuZG9iagorMyAwIG9iaiA8PAorICAvVHlwZSAvUGFnZQorICAvUGFyZW50IDIgMCBSCisgIC9SZXNvdXJjZXMgPDwKKyAgICAvRm9udCA8PAorICAgICAgL0YxIDQgMCBSCisgICAgICAvRjIgNSAwIFIKKyAgICA+PgorICA+PgorICAvQ29udGVudHMgWzYgMCBSIDcgMCBSXQorPj4KK2VuZG9iagorNCAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9UaW1lcy1Sb21hbgorPj4KK2VuZG9iagorNSAwIG9iaiA8PAorICAvVHlwZSAvRm9udAorICAvU3VidHlwZSAvVHlwZTEKKyAgL0Jhc2VGb250IC9IZWx2ZXRpY2EKKz4+CitlbmRvYmoKKzYgMCBvYmogPDwKKyAgL0ZpbHRlciAvRmxhdGVEZWNvZGUKKyAgL0xlbmd0aCAwCis+Pgorc3RyZWFtCitlbmRzdHJlYW0KK2VuZG9iagorNyAwIG9iaiA8PAorPj4KK3N0cmVhbQorQlQKKzIwIDUwIFRkCisvRjEgMTIgVGYKKyhIZWxsbywgd29ybGQhKSBUagorMCA1MCBUZAorL0YyIDE2IFRmCisoR29vZGJ5ZSwgd29ybGQhKSBUagorRVQKK2VuZHN0cmVhbQorZW5kb2JqCit4cmVmCiswIDgKKzAwMDAwMDAwMDAgNjU1MzUgZiAKKzAwMDAwMDAwMTUgMDAwMDAgbiAKKzAwMDAwMDAwNjEgMDAwMDAgbiAKKzAwMDAwMDAxNTQgMDAwMDAgbiAKKzAwMDAwMDAzMDQgMDAwMDAgbiAKKzAwMDAwMDAzODIgMDAwMDAgbiAKKzAwMDAwMDA0NTggMDAwMDAgbiAKKzAwMDAwMDA1MzEgMDAwMDAgbiAKK3RyYWlsZXIgPDwKKyAgL1NpemUgNgorICAvUm9vdCAxIDAgUgorPj4KK3N0YXJ0eHJlZgorNjUyCislJUVPRgo=