LyoKICogSTJPIENvbmZpZ3VyYXRpb24gSW50ZXJmYWNlIERyaXZlcgogKgogKiAoQykgQ29weXJpZ2h0IDE5OTktMjAwMiAgUmVkIEhhdAogKgogKiBXcml0dGVuIGJ5IEFsYW4gQ294LCBCdWlsZGluZyBOdW1iZXIgVGhyZWUgTHRkCiAqCiAqIEZpeGVzL2FkZGl0aW9uczoKICoJRGVlcGFrIFNheGVuYSAoMDQvMjAvMTk5OSk6CiAqCQlBZGRlZCBiYXNpYyBpb2N0bCgpIHN1cHBvcnQKICoJRGVlcGFrIFNheGVuYSAoMDYvMDcvMTk5OSk6CiAqCQlBZGRlZCBzb2Z0d2FyZSBkb3dubG9hZCBpb2N0bCAoc3RpbGwgdGVzdGluZykKICoJQXV2byBI5GtraW5lbiAoMDkvMTAvMTk5OSk6CiAqCQlDaGFuZ2VzIHRvIGkyb19jZmdfcmVwbHkoKSwgaW9jdGxfcGFybXMoKQogKgkJQWRkZWQgaW9jdF92YWxpZGF0ZSgpCiAqCVRhbmVsaSBW5Gjka2FuZ2FzICgwOS8zMC8xOTk5KToKICoJCUZpeGVkIGlvY3RsX3N3ZGwoKQogKglUYW5lbGkgVuRo5GthbmdhcyAoMTAvMDQvMTk5OSk6CiAqCQlDaGFuZ2VkIGlvY3RsX3N3ZGwoKSwgaW1wbGVtZW50ZWQgaW9jdGxfc3d1bCgpIGFuZCBpb2N0bF9zd2RlbCgpCiAqCURlZXBhayBTYXhlbmEgKDExLzE4LzE5OTkpOgogKgkJQWRkZWQgZXZlbnQgbWFuYWdtZW5ldCBzdXBwb3J0CiAqCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+OgogKgkJMi40IHJld3JpdGUgcG9ydGVkIHRvIDIuNQogKglNYXJrdXMgTGlkZWwgPE1hcmt1cy5MaWRlbEBzaGFkb3djb25uZWN0LmNvbT46CiAqCQlBZGRlZCBwYXNzLXRocnUgc3VwcG9ydCBmb3IgQWRhcHRlYydzIHJhaWR1dGlscwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvcGNpLmg+CiNpbmNsdWRlIDxsaW51eC9pMm8uaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CiNpbmNsdWRlIDxsaW51eC9pb2N0bDMyLmg+CiNpbmNsdWRlIDxsaW51eC9jb21wYXQuaD4KI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKI2RlZmluZSBPU01fTkFNRQkiY29uZmlnLW9zbSIKI2RlZmluZSBPU01fVkVSU0lPTgkiJFJldiQiCiNkZWZpbmUgT1NNX0RFU0NSSVBUSU9OCSJJMk8gQ29uZmlndXJhdGlvbiBPU00iCgpleHRlcm4gaW50IGkyb19wYXJtX2lzc3VlKHN0cnVjdCBpMm9fZGV2aWNlICosIGludCwgdm9pZCAqLCBpbnQsIHZvaWQgKiwgaW50KTsKCnN0YXRpYyBpbnQgaTJvX2NmZ19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCgkJCSB1bnNpZ25lZCBsb25nIGFyZyk7CgpzdGF0aWMgc3BpbmxvY2tfdCBpMm9fY29uZmlnX2xvY2s7CgojZGVmaW5lIE1PRElOQyh4LHkpICgoeCkgPSAoKHgpICsgMSkgJSAoeSkpCgpzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgewoJdTMyIGZsYWdfY291bnQ7Cgl1MzIgYWRkcl9idXM7Cn07CgpzdHJ1Y3QgaTJvX2NmZ19pbmZvIHsKCXN0cnVjdCBmaWxlICpmcDsKCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpmYXN5bmM7CglzdHJ1Y3QgaTJvX2V2dF9pbmZvIGV2ZW50X3FbSTJPX0VWVF9RX0xFTl07Cgl1MTYgcV9pbjsJCS8vIFF1ZXVlIGhlYWQgaW5kZXgKCXUxNiBxX291dDsJCS8vIFF1ZXVlIHRhaWwgaW5kZXgKCXUxNiBxX2xlbjsJCS8vIFF1ZXVlIGxlbmd0aAoJdTE2IHFfbG9zdDsJCS8vIE51bWJlciBvZiBsb3N0IGV2ZW50cwoJdWxvbmcgcV9pZDsJCS8vIEV2ZW50IHF1ZXVlIElELi4udXNlZCBhcyB0eF9jb250ZXh0CglzdHJ1Y3QgaTJvX2NmZ19pbmZvICpuZXh0Owp9OwpzdGF0aWMgc3RydWN0IGkyb19jZmdfaW5mbyAqb3Blbl9maWxlcyA9IE5VTEw7CnN0YXRpYyB1bG9uZyBpMm9fY2ZnX2luZm9faWQgPSAwOwoKLyoKICoJRWFjaCBvZiB0aGVzZSBkZXNjcmliZXMgYW4gaTJvIG1lc3NhZ2UgaGFuZGxlci4gVGhleSBhcmUKICoJbXVsdGlwbGV4ZWQgYnkgdGhlIGkyb19jb3JlIGNvZGUKICovCgpzdGF0aWMgc3RydWN0IGkyb19kcml2ZXIgaTJvX2NvbmZpZ19kcml2ZXIgPSB7CgkubmFtZSA9IE9TTV9OQU1FCn07CgpzdGF0aWMgaW50IGkyb19jZmdfZ2V0aW9wcyh1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwoJdTggX191c2VyICp1c2VyX2lvcF90YWJsZSA9ICh2b2lkIF9fdXNlciAqKWFyZzsKCXU4IHRtcFtNQVhfSTJPX0NPTlRST0xMRVJTXTsKCWludCByZXQgPSAwOwoKCW1lbXNldCh0bXAsIDAsIE1BWF9JMk9fQ09OVFJPTExFUlMpOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoYywgJmkyb19jb250cm9sbGVycywgbGlzdCkKCSAgICB0bXBbYy0+dW5pdF0gPSAxOwoKCWlmIChjb3B5X3RvX3VzZXIodXNlcl9pb3BfdGFibGUsIHRtcCwgTUFYX0kyT19DT05UUk9MTEVSUykpCgkJcmV0ID0gLUVGQVVMVDsKCglyZXR1cm4gcmV0Owp9OwoKc3RhdGljIGludCBpMm9fY2ZnX2dldGhydCh1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwoJc3RydWN0IGkyb19jbWRfaHJ0bGN0IF9fdXNlciAqY21kID0gKHN0cnVjdCBpMm9fY21kX2hydGxjdCBfX3VzZXIgKilhcmc7CglzdHJ1Y3QgaTJvX2NtZF9ocnRsY3Qga2NtZDsKCWkyb19ocnQgKmhydDsKCWludCBsZW47Cgl1MzIgcmVzbGVuOwoJaW50IHJldCA9IDA7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZrY21kLCBjbWQsIHNpemVvZihzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikgPCAwKQoJCXJldHVybiAtRUZBVUxUOwoKCWlmIChrY21kLnJlc2J1ZiA9PSBOVUxMKQoJCXJldHVybiAtRUZBVUxUOwoKCWMgPSBpMm9fZmluZF9pb3Aoa2NtZC5pb3ApOwoJaWYgKCFjKQoJCXJldHVybiAtRU5YSU87CgoJaHJ0ID0gKGkyb19ocnQgKikgYy0+aHJ0LnZpcnQ7CgoJbGVuID0gOCArICgoaHJ0LT5lbnRyeV9sZW4gKiBocnQtPm51bV9lbnRyaWVzKSA8PCAyKTsKCgkvKiBXZSBkaWQgYSBnZXQgdXNlci4uLnNvIGFzc3VtaW5nIG1lbSBpcyBvay4uLmlzIHRoaXMgYmFkPyAqLwoJcHV0X3VzZXIobGVuLCBrY21kLnJlc2xlbik7CglpZiAobGVuID4gcmVzbGVuKQoJCXJldCA9IC1FTk9CVUZTOwoJaWYgKGNvcHlfdG9fdXNlcihrY21kLnJlc2J1ZiwgKHZvaWQgKilocnQsIGxlbikpCgkJcmV0ID0gLUVGQVVMVDsKCglyZXR1cm4gcmV0Owp9OwoKc3RhdGljIGludCBpMm9fY2ZnX2dldGxjdCh1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwoJc3RydWN0IGkyb19jbWRfaHJ0bGN0IF9fdXNlciAqY21kID0gKHN0cnVjdCBpMm9fY21kX2hydGxjdCBfX3VzZXIgKilhcmc7CglzdHJ1Y3QgaTJvX2NtZF9ocnRsY3Qga2NtZDsKCWkyb19sY3QgKmxjdDsKCWludCBsZW47CglpbnQgcmV0ID0gMDsKCXUzMiByZXNsZW47CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZrY21kLCBjbWQsIHNpemVvZihzdHJ1Y3QgaTJvX2NtZF9ocnRsY3QpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikgPCAwKQoJCXJldHVybiAtRUZBVUxUOwoKCWlmIChrY21kLnJlc2J1ZiA9PSBOVUxMKQoJCXJldHVybiAtRUZBVUxUOwoKCWMgPSBpMm9fZmluZF9pb3Aoa2NtZC5pb3ApOwoJaWYgKCFjKQoJCXJldHVybiAtRU5YSU87CgoJbGN0ID0gKGkyb19sY3QgKikgYy0+bGN0OwoKCWxlbiA9ICh1bnNpZ25lZCBpbnQpbGN0LT50YWJsZV9zaXplIDw8IDI7CglwdXRfdXNlcihsZW4sIGtjbWQucmVzbGVuKTsKCWlmIChsZW4gPiByZXNsZW4pCgkJcmV0ID0gLUVOT0JVRlM7CgllbHNlIGlmIChjb3B5X3RvX3VzZXIoa2NtZC5yZXNidWYsIGxjdCwgbGVuKSkKCQlyZXQgPSAtRUZBVUxUOwoKCXJldHVybiByZXQ7Cn07CgpzdGF0aWMgaW50IGkyb19jZmdfcGFybXModW5zaWduZWQgbG9uZyBhcmcsIHVuc2lnbmVkIGludCB0eXBlKQp7CglpbnQgcmV0ID0gMDsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKCXN0cnVjdCBpMm9fZGV2aWNlICpkZXY7CglzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IF9fdXNlciAqY21kID0KCSAgICAoc3RydWN0IGkyb19jbWRfcHNldGdldCBfX3VzZXIgKilhcmc7CglzdHJ1Y3QgaTJvX2NtZF9wc2V0Z2V0IGtjbWQ7Cgl1MzIgcmVzbGVuOwoJdTggKm9wczsKCXU4ICpyZXM7CglpbnQgbGVuID0gMDsKCgl1MzIgaTJvX2NtZCA9ICh0eXBlID09IEkyT1BBUk1HRVQgPwoJCSAgICAgICBJMk9fQ01EX1VUSUxfUEFSQU1TX0dFVCA6IEkyT19DTURfVVRJTF9QQVJBTVNfU0VUKTsKCglpZiAoY29weV9mcm9tX3VzZXIoJmtjbWQsIGNtZCwgc2l6ZW9mKHN0cnVjdCBpMm9fY21kX3BzZXRnZXQpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAoZ2V0X3VzZXIocmVzbGVuLCBrY21kLnJlc2xlbikpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJYyA9IGkyb19maW5kX2lvcChrY21kLmlvcCk7CglpZiAoIWMpCgkJcmV0dXJuIC1FTlhJTzsKCglkZXYgPSBpMm9faW9wX2ZpbmRfZGV2aWNlKGMsIGtjbWQudGlkKTsKCWlmICghZGV2KQoJCXJldHVybiAtRU5YSU87CgoJb3BzID0gKHU4ICopIGttYWxsb2Moa2NtZC5vcGxlbiwgR0ZQX0tFUk5FTCk7CglpZiAoIW9wcykKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAoY29weV9mcm9tX3VzZXIob3BzLCBrY21kLm9wYnVmLCBrY21kLm9wbGVuKSkgewoJCWtmcmVlKG9wcyk7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJLyoKCSAqIEl0J3MgcG9zc2libGUgdG8gaGF2ZSBhIF92ZXJ5XyBsYXJnZSB0YWJsZQoJICogYW5kIHRoYXQgdGhlIHVzZXIgYXNrcyBmb3IgYWxsIG9mIGl0IGF0IG9uY2UuLi4KCSAqLwoJcmVzID0gKHU4ICopIGttYWxsb2MoNjU1MzYsIEdGUF9LRVJORUwpOwoJaWYgKCFyZXMpIHsKCQlrZnJlZShvcHMpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCWxlbiA9IGkyb19wYXJtX2lzc3VlKGRldiwgaTJvX2NtZCwgb3BzLCBrY21kLm9wbGVuLCByZXMsIDY1NTM2KTsKCWtmcmVlKG9wcyk7CgoJaWYgKGxlbiA8IDApIHsKCQlrZnJlZShyZXMpOwoJCXJldHVybiAtRUFHQUlOOwoJfQoKCXB1dF91c2VyKGxlbiwga2NtZC5yZXNsZW4pOwoJaWYgKGxlbiA+IHJlc2xlbikKCQlyZXQgPSAtRU5PQlVGUzsKCWVsc2UgaWYgKGNvcHlfdG9fdXNlcihrY21kLnJlc2J1ZiwgcmVzLCBsZW4pKQoJCXJldCA9IC1FRkFVTFQ7CgoJa2ZyZWUocmVzKTsKCglyZXR1cm4gcmV0Owp9OwoKc3RhdGljIGludCBpMm9fY2ZnX3N3ZGwodW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBpMm9fc3dfeGZlciBreGZlcjsKCXN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKnB4ZmVyID0gKHN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKilhcmc7Cgl1bnNpZ25lZCBjaGFyIG1heGZyYWcgPSAwLCBjdXJmcmFnID0gMTsKCXN0cnVjdCBpMm9fZG1hIGJ1ZmZlcjsKCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7Cgl1MzIgbTsKCXVuc2lnbmVkIGludCBzdGF0dXMgPSAwLCBzd2xlbiA9IDAsIGZyYWdzaXplID0gODE5MjsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKCglpZiAoY29weV9mcm9tX3VzZXIoJmt4ZmVyLCBweGZlciwgc2l6ZW9mKHN0cnVjdCBpMm9fc3dfeGZlcikpKQoJCXJldHVybiAtRUZBVUxUOwoKCWlmIChnZXRfdXNlcihzd2xlbiwga3hmZXIuc3dsZW4pIDwgMCkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAoZ2V0X3VzZXIobWF4ZnJhZywga3hmZXIubWF4ZnJhZykgPCAwKQoJCXJldHVybiAtRUZBVUxUOwoKCWlmIChnZXRfdXNlcihjdXJmcmFnLCBreGZlci5jdXJmcmFnKSA8IDApCgkJcmV0dXJuIC1FRkFVTFQ7CgoJaWYgKGN1cmZyYWcgPT0gbWF4ZnJhZykKCQlmcmFnc2l6ZSA9IHN3bGVuIC0gKG1heGZyYWcgLSAxKSAqIDgxOTI7CgoJaWYgKCFreGZlci5idWYgfHwgIWFjY2Vzc19vayhWRVJJRllfUkVBRCwga3hmZXIuYnVmLCBmcmFnc2l6ZSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJYyA9IGkyb19maW5kX2lvcChreGZlci5pb3ApOwoJaWYgKCFjKQoJCXJldHVybiAtRU5YSU87CgoJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQoJCXJldHVybiAtRUJVU1k7CgoJaWYgKGkyb19kbWFfYWxsb2MoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlciwgZnJhZ3NpemUsIEdGUF9LRVJORUwpKSB7CgkJaTJvX21zZ19ub3AoYywgbSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgoJX19jb3B5X2Zyb21fdXNlcihidWZmZXIudmlydCwga3hmZXIuYnVmLCBmcmFnc2l6ZSk7CgoJd3JpdGVsKE5JTkVfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfNywgJm1zZy0+dS5oZWFkWzBdKTsKCXdyaXRlbChJMk9fQ01EX1NXX0RPV05MT0FEIDw8IDI0IHwgSE9TVF9USUQgPDwgMTIgfCBBREFQVEVSX1RJRCwKCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOwoJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7Cgl3cml0ZWwoMCwgJm1zZy0+dS5oZWFkWzNdKTsKCXdyaXRlbCgoKCh1MzIpIGt4ZmVyLmZsYWdzKSA8PCAyNCkgfCAoKCh1MzIpIGt4ZmVyLnN3X3R5cGUpIDw8IDE2KSB8CgkgICAgICAgKCgodTMyKSBtYXhmcmFnKSA8PCA4KSB8ICgoKHUzMikgY3VyZnJhZykpLCAmbXNnLT5ib2R5WzBdKTsKCXdyaXRlbChzd2xlbiwgJm1zZy0+Ym9keVsxXSk7Cgl3cml0ZWwoa3hmZXIuc3dfaWQsICZtc2ctPmJvZHlbMl0pOwoJd3JpdGVsKDB4RDAwMDAwMDAgfCBmcmFnc2l6ZSwgJm1zZy0+Ym9keVszXSk7Cgl3cml0ZWwoYnVmZmVyLnBoeXMsICZtc2ctPmJvZHlbNF0pOwoKCW9zbV9kZWJ1Zygic3dkbCBmcmFnICVkLyVkIChzaXplICVkKVxuIiwgY3VyZnJhZywgbWF4ZnJhZywgZnJhZ3NpemUpOwoJc3RhdHVzID0gaTJvX21zZ19wb3N0X3dhaXRfbWVtKGMsIG0sIDYwLCAmYnVmZmVyKTsKCglpZiAoc3RhdHVzICE9IC1FVElNRURPVVQpCgkJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOwoKCWlmIChzdGF0dXMgIT0gSTJPX1BPU1RfV0FJVF9PSykgewoJCS8vIGl0IGZhaWxzIGlmIHlvdSB0cnkgYW5kIHNlbmQgZnJhZ3Mgb3V0IG9mIG9yZGVyCgkJLy8gYW5kIGZvciBzb21lIHlldCB1bmtub3duIHJlYXNvbnMgdG9vCgkJb3NtX2luZm8oInN3ZGwgZmFpbGVkLCBEZXRhaWxlZFN0YXR1cyA9ICVkXG4iLCBzdGF0dXMpOwoJCXJldHVybiBzdGF0dXM7Cgl9CgoJcmV0dXJuIDA7Cn07CgpzdGF0aWMgaW50IGkyb19jZmdfc3d1bCh1bnNpZ25lZCBsb25nIGFyZykKewoJc3RydWN0IGkyb19zd194ZmVyIGt4ZmVyOwoJc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqcHhmZXIgPSAoc3RydWN0IGkyb19zd194ZmVyIF9fdXNlciAqKWFyZzsKCXVuc2lnbmVkIGNoYXIgbWF4ZnJhZyA9IDAsIGN1cmZyYWcgPSAxOwoJc3RydWN0IGkyb19kbWEgYnVmZmVyOwoJc3RydWN0IGkyb19tZXNzYWdlIF9faW9tZW0gKm1zZzsKCXUzMiBtOwoJdW5zaWduZWQgaW50IHN0YXR1cyA9IDAsIHN3bGVuID0gMCwgZnJhZ3NpemUgPSA4MTkyOwoJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwoJaW50IHJldCA9IDA7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZreGZlciwgcHhmZXIsIHNpemVvZihzdHJ1Y3QgaTJvX3N3X3hmZXIpKSkKCQlnb3RvIHJldHVybl9mYXVsdDsKCglpZiAoZ2V0X3VzZXIoc3dsZW4sIGt4ZmVyLnN3bGVuKSA8IDApCgkJZ290byByZXR1cm5fZmF1bHQ7CgoJaWYgKGdldF91c2VyKG1heGZyYWcsIGt4ZmVyLm1heGZyYWcpIDwgMCkKCQlnb3RvIHJldHVybl9mYXVsdDsKCglpZiAoZ2V0X3VzZXIoY3VyZnJhZywga3hmZXIuY3VyZnJhZykgPCAwKQoJCWdvdG8gcmV0dXJuX2ZhdWx0OwoKCWlmIChjdXJmcmFnID09IG1heGZyYWcpCgkJZnJhZ3NpemUgPSBzd2xlbiAtIChtYXhmcmFnIC0gMSkgKiA4MTkyOwoKCWlmICgha3hmZXIuYnVmKQoJCWdvdG8gcmV0dXJuX2ZhdWx0OwoKCWMgPSBpMm9fZmluZF9pb3Aoa3hmZXIuaW9wKTsKCWlmICghYykKCQlyZXR1cm4gLUVOWElPOwoKCW0gPSBpMm9fbXNnX2dldF93YWl0KGMsICZtc2csIEkyT19USU1FT1VUX01FU1NBR0VfR0VUKTsKCWlmIChtID09IEkyT19RVUVVRV9FTVBUWSkKCQlyZXR1cm4gLUVCVVNZOwoKCWlmIChpMm9fZG1hX2FsbG9jKCZjLT5wZGV2LT5kZXYsICZidWZmZXIsIGZyYWdzaXplLCBHRlBfS0VSTkVMKSkgewoJCWkyb19tc2dfbm9wKGMsIG0pOwoJCXJldHVybiAtRU5PTUVNOwoJfQoKCXdyaXRlbChOSU5FX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzcsICZtc2ctPnUuaGVhZFswXSk7Cgl3cml0ZWwoSTJPX0NNRF9TV19VUExPQUQgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAoJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7Cgl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOwoJd3JpdGVsKCh1MzIpIGt4ZmVyLmZsYWdzIDw8IDI0IHwgKHUzMikga3hmZXIuCgkgICAgICAgc3dfdHlwZSA8PCAxNiB8ICh1MzIpIG1heGZyYWcgPDwgOCB8ICh1MzIpIGN1cmZyYWcsCgkgICAgICAgJm1zZy0+Ym9keVswXSk7Cgl3cml0ZWwoc3dsZW4sICZtc2ctPmJvZHlbMV0pOwoJd3JpdGVsKGt4ZmVyLnN3X2lkLCAmbXNnLT5ib2R5WzJdKTsKCXdyaXRlbCgweEQwMDAwMDAwIHwgZnJhZ3NpemUsICZtc2ctPmJvZHlbM10pOwoJd3JpdGVsKGJ1ZmZlci5waHlzLCAmbXNnLT5ib2R5WzRdKTsKCglvc21fZGVidWcoInN3dWwgZnJhZyAlZC8lZCAoc2l6ZSAlZClcbiIsIGN1cmZyYWcsIG1heGZyYWcsIGZyYWdzaXplKTsKCXN0YXR1cyA9IGkyb19tc2dfcG9zdF93YWl0X21lbShjLCBtLCA2MCwgJmJ1ZmZlcik7CgoJaWYgKHN0YXR1cyAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CgkJaWYgKHN0YXR1cyAhPSAtRVRJTUVET1VUKQoJCQlpMm9fZG1hX2ZyZWUoJmMtPnBkZXYtPmRldiwgJmJ1ZmZlcik7CgoJCW9zbV9pbmZvKCJzd3VsIGZhaWxlZCwgRGV0YWlsZWRTdGF0dXMgPSAlZFxuIiwgc3RhdHVzKTsKCQlyZXR1cm4gc3RhdHVzOwoJfQoKCWlmIChjb3B5X3RvX3VzZXIoa3hmZXIuYnVmLCBidWZmZXIudmlydCwgZnJhZ3NpemUpKQoJCXJldCA9IC1FRkFVTFQ7CgoJaTJvX2RtYV9mcmVlKCZjLT5wZGV2LT5kZXYsICZidWZmZXIpOwoKcmV0dXJuX3JldDoKCXJldHVybiByZXQ7CnJldHVybl9mYXVsdDoKCXJldCA9IC1FRkFVTFQ7Cglnb3RvIHJldHVybl9yZXQ7Cn07CgpzdGF0aWMgaW50IGkyb19jZmdfc3dkZWwodW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKCXN0cnVjdCBpMm9fc3dfeGZlciBreGZlcjsKCXN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKnB4ZmVyID0gKHN0cnVjdCBpMm9fc3dfeGZlciBfX3VzZXIgKilhcmc7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwoJdTMyIG07Cgl1bnNpZ25lZCBpbnQgc3dsZW47CglpbnQgdG9rZW47CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZreGZlciwgcHhmZXIsIHNpemVvZihzdHJ1Y3QgaTJvX3N3X3hmZXIpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCglpZiAoZ2V0X3VzZXIoc3dsZW4sIGt4ZmVyLnN3bGVuKSA8IDApCgkJcmV0dXJuIC1FRkFVTFQ7CgoJYyA9IGkyb19maW5kX2lvcChreGZlci5pb3ApOwoJaWYgKCFjKQoJCXJldHVybiAtRU5YSU87CgoJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQoJCXJldHVybiAtRUJVU1k7CgoJd3JpdGVsKFNFVkVOX1dPUkRfTVNHX1NJWkUgfCBTR0xfT0ZGU0VUXzAsICZtc2ctPnUuaGVhZFswXSk7Cgl3cml0ZWwoSTJPX0NNRF9TV19SRU1PVkUgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IEFEQVBURVJfVElELAoJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7Cgl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOwoJd3JpdGVsKCh1MzIpIGt4ZmVyLmZsYWdzIDw8IDI0IHwgKHUzMikga3hmZXIuc3dfdHlwZSA8PCAxNiwKCSAgICAgICAmbXNnLT5ib2R5WzBdKTsKCXdyaXRlbChzd2xlbiwgJm1zZy0+Ym9keVsxXSk7Cgl3cml0ZWwoa3hmZXIuc3dfaWQsICZtc2ctPmJvZHlbMl0pOwoKCXRva2VuID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgMTApOwoKCWlmICh0b2tlbiAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CgkJb3NtX2luZm8oInN3ZGVsIGZhaWxlZCwgRGV0YWlsZWRTdGF0dXMgPSAlZFxuIiwgdG9rZW4pOwoJCXJldHVybiAtRVRJTUVET1VUOwoJfQoKCXJldHVybiAwOwp9OwoKc3RhdGljIGludCBpMm9fY2ZnX3ZhbGlkYXRlKHVuc2lnbmVkIGxvbmcgYXJnKQp7CglpbnQgdG9rZW47CglpbnQgaW9wID0gKGludClhcmc7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwoJdTMyIG07CglzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7CgoJYyA9IGkyb19maW5kX2lvcChpb3ApOwoJaWYgKCFjKQoJCXJldHVybiAtRU5YSU87CgoJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoJaWYgKG0gPT0gSTJPX1FVRVVFX0VNUFRZKQoJCXJldHVybiAtRUJVU1k7CgoJd3JpdGVsKEZPVVJfV09SRF9NU0dfU0laRSB8IFNHTF9PRkZTRVRfMCwgJm1zZy0+dS5oZWFkWzBdKTsKCXdyaXRlbChJMk9fQ01EX0NPTkZJR19WQUxJREFURSA8PCAyNCB8IEhPU1RfVElEIDw8IDEyIHwgaW9wLAoJICAgICAgICZtc2ctPnUuaGVhZFsxXSk7Cgl3cml0ZWwoaTJvX2NvbmZpZ19kcml2ZXIuY29udGV4dCwgJm1zZy0+dS5oZWFkWzJdKTsKCXdyaXRlbCgwLCAmbXNnLT51LmhlYWRbM10pOwoKCXRva2VuID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgMTApOwoKCWlmICh0b2tlbiAhPSBJMk9fUE9TVF9XQUlUX09LKSB7CgkJb3NtX2luZm8oIkNhbid0IHZhbGlkYXRlIGNvbmZpZ3VyYXRpb24sIEVycm9yU3RhdHVzID0gJWRcbiIsCgkJCSB0b2tlbik7CgkJcmV0dXJuIC1FVElNRURPVVQ7Cgl9CgoJcmV0dXJuIDA7Cn07CgpzdGF0aWMgaW50IGkyb19jZmdfZXZ0X3JlZyh1bnNpZ25lZCBsb25nIGFyZywgc3RydWN0IGZpbGUgKmZwKQp7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgX19pb21lbSAqbXNnOwoJdTMyIG07CglzdHJ1Y3QgaTJvX2V2dF9pZCBfX3VzZXIgKnBkZXNjID0gKHN0cnVjdCBpMm9fZXZ0X2lkIF9fdXNlciAqKWFyZzsKCXN0cnVjdCBpMm9fZXZ0X2lkIGtkZXNjOwoJc3RydWN0IGkyb19jb250cm9sbGVyICpjOwoJc3RydWN0IGkyb19kZXZpY2UgKmQ7CgoJaWYgKGNvcHlfZnJvbV91c2VyKCZrZGVzYywgcGRlc2MsIHNpemVvZihzdHJ1Y3QgaTJvX2V2dF9pZCkpKQoJCXJldHVybiAtRUZBVUxUOwoKCS8qIElPUCBleGlzdHM/ICovCgljID0gaTJvX2ZpbmRfaW9wKGtkZXNjLmlvcCk7CglpZiAoIWMpCgkJcmV0dXJuIC1FTlhJTzsKCgkvKiBEZXZpY2UgZXhpc3RzPyAqLwoJZCA9IGkyb19pb3BfZmluZF9kZXZpY2UoYywga2Rlc2MudGlkKTsKCWlmICghZCkKCQlyZXR1cm4gLUVOT0RFVjsKCgltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CglpZiAobSA9PSBJMk9fUVVFVUVfRU1QVFkpCgkJcmV0dXJuIC1FQlVTWTsKCgl3cml0ZWwoRk9VUl9XT1JEX01TR19TSVpFIHwgU0dMX09GRlNFVF8wLCAmbXNnLT51LmhlYWRbMF0pOwoJd3JpdGVsKEkyT19DTURfVVRJTF9FVlRfUkVHSVNURVIgPDwgMjQgfCBIT1NUX1RJRCA8PCAxMiB8IGtkZXNjLnRpZCwKCSAgICAgICAmbXNnLT51LmhlYWRbMV0pOwoJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUuaGVhZFsyXSk7Cgl3cml0ZWwoaTJvX2NudHh0X2xpc3RfYWRkKGMsIGZwLT5wcml2YXRlX2RhdGEpLCAmbXNnLT51LmhlYWRbM10pOwoJd3JpdGVsKGtkZXNjLmV2dF9tYXNrLCAmbXNnLT5ib2R5WzBdKTsKCglpMm9fbXNnX3Bvc3QoYywgbSk7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgaTJvX2NmZ19ldnRfZ2V0KHVuc2lnbmVkIGxvbmcgYXJnLCBzdHJ1Y3QgZmlsZSAqZnApCnsKCXN0cnVjdCBpMm9fY2ZnX2luZm8gKnAgPSBOVUxMOwoJc3RydWN0IGkyb19ldnRfZ2V0IF9fdXNlciAqdWdldCA9IChzdHJ1Y3QgaTJvX2V2dF9nZXQgX191c2VyICopYXJnOwoJc3RydWN0IGkyb19ldnRfZ2V0IGtnZXQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWZvciAocCA9IG9wZW5fZmlsZXM7IHA7IHAgPSBwLT5uZXh0KQoJCWlmIChwLT5xX2lkID09ICh1bG9uZykgZnAtPnByaXZhdGVfZGF0YSkKCQkJYnJlYWs7CgoJaWYgKCFwLT5xX2xlbikKCQlyZXR1cm4gLUVOT0VOVDsKCgltZW1jcHkoJmtnZXQuaW5mbywgJnAtPmV2ZW50X3FbcC0+cV9vdXRdLCBzaXplb2Yoc3RydWN0IGkyb19ldnRfaW5mbykpOwoJTU9ESU5DKHAtPnFfb3V0LCBJMk9fRVZUX1FfTEVOKTsKCXNwaW5fbG9ja19pcnFzYXZlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKCXAtPnFfbGVuLS07CglrZ2V0LnBlbmRpbmcgPSBwLT5xX2xlbjsKCWtnZXQubG9zdCA9IHAtPnFfbG9zdDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOwoKCWlmIChjb3B5X3RvX3VzZXIodWdldCwgJmtnZXQsIHNpemVvZihzdHJ1Y3QgaTJvX2V2dF9nZXQpKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX0NPTVBBVApzdGF0aWMgaW50IGkyb19jZmdfcGFzc3RocnUzMihzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21uZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1MzIgX191c2VyICpjbWQ7CglzdHJ1Y3QgaTJvX2NvbnRyb2xsZXIgKmM7Cgl1MzIgX191c2VyICp1c2VyX21zZzsKCXUzMiAqcmVwbHkgPSBOVUxMOwoJdTMyIF9fdXNlciAqdXNlcl9yZXBseSA9IE5VTEw7Cgl1MzIgc2l6ZSA9IDA7Cgl1MzIgcmVwbHlfc2l6ZSA9IDA7Cgl1MzIgcmNvZGUgPSAwOwoJc3RydWN0IGkyb19kbWEgc2dfbGlzdFtTR19UQUJMRVNJWkVdOwoJdTMyIHNnX29mZnNldCA9IDA7Cgl1MzIgc2dfY291bnQgPSAwOwoJdTMyIGkgPSAwOwoJaTJvX3N0YXR1c19ibG9jayAqc2I7CglzdHJ1Y3QgaTJvX21lc3NhZ2UgKm1zZzsKCXUzMiBtOwoJdW5zaWduZWQgaW50IGlvcDsKCgljbWQgPSAoc3RydWN0IGkyb19jbWRfcGFzc3RocnUzMiBfX3VzZXIgKilhcmc7CgoJaWYgKGdldF91c2VyKGlvcCwgJmNtZC0+aW9wKSB8fCBnZXRfdXNlcihpLCAmY21kLT5tc2cpKQoJCXJldHVybiAtRUZBVUxUOwoKCXVzZXJfbXNnID0gY29tcGF0X3B0cihpKTsKCgljID0gaTJvX2ZpbmRfaW9wKGlvcCk7CglpZiAoIWMpIHsKCQlvc21fZGVidWcoImNvbnRyb2xsZXIgJWQgbm90IGZvdW5kXG4iLCBpb3ApOwoJCXJldHVybiAtRU5YSU87Cgl9CgoJbSA9IGkyb19tc2dfZ2V0X3dhaXQoYywgJm1zZywgSTJPX1RJTUVPVVRfTUVTU0FHRV9HRVQpOwoKCXNiID0gYy0+c3RhdHVzX2Jsb2NrLnZpcnQ7CgoJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKCQlvc21fd2FybigidW5hYmxlIHRvIGdldCBzaXplIVxuIik7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CglzaXplID0gc2l6ZSA+PiAxNjsKCglpZiAoc2l6ZSA+IHNiLT5pbmJvdW5kX2ZyYW1lX3NpemUpIHsKCQlvc21fd2Fybigic2l6ZSBvZiBtZXNzYWdlID4gaW5ib3VuZF9mcmFtZV9zaXplIik7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CgoJdXNlcl9yZXBseSA9ICZ1c2VyX21zZ1tzaXplXTsKCglzaXplIDw8PSAyOwkJLy8gQ29udmVydCB0byBieXRlcwoKCS8qIENvcHkgaW4gdGhlIHVzZXIncyBJMk8gY29tbWFuZCAqLwoJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CgkJb3NtX3dhcm4oInVuYWJsZSB0byBjb3B5IHVzZXIgbWVzc2FnZVxuIik7CgkJcmV0dXJuIC1FRkFVTFQ7Cgl9CglpMm9fZHVtcF9tZXNzYWdlKG1zZyk7CgoJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCgkJcmV0dXJuIC1FRkFVTFQ7CgoJcmVwbHlfc2l6ZSA+Pj0gMTY7CglyZXBseV9zaXplIDw8PSAyOwoKCXJlcGx5ID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfS0VSTkVMKTsKCWlmICghcmVwbHkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIiwKCQkgICAgICAgYy0+bmFtZSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocmVwbHksIDAsIHJlcGx5X3NpemUpOwoKCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CgoJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOwoJd3JpdGVsKGkyb19jbnR4dF9saXN0X2FkZChjLCByZXBseSksICZtc2ctPnUucy50Y250eHQpOwoKCW1lbXNldChzZ19saXN0LCAwLCBzaXplb2Yoc2dfbGlzdFswXSkgKiBTR19UQUJMRVNJWkUpOwoJaWYgKHNnX29mZnNldCkgewoJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CgoJCWlmIChzZ19vZmZzZXQgKiA0ID49IHNpemUpIHsKCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQlnb3RvIGNsZWFudXA7CgkJfQoJCS8vIFRPRE8gNjRiaXQgZml4CgkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKCgmbXNnLT51LmhlYWRbMF0pICsKCQkJCQkJICBzZ19vZmZzZXQpOwoJCXNnX2NvdW50ID0KCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwoJCWlmIChzZ19jb3VudCA+IFNHX1RBQkxFU0laRSkgewoJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SU9DVEwgU0cgTGlzdCB0b28gbGFyZ2UgKCV1KVxuIiwKCQkJICAgICAgIGMtPm5hbWUsIHNnX2NvdW50KTsKCQkJa2ZyZWUocmVwbHkpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgoJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CgkJCWludCBzZ19zaXplOwoJCQlzdHJ1Y3QgaTJvX2RtYSAqcDsKCgkJCWlmICghKHNnW2ldLmZsYWdfY291bnQgJiAweDEwMDAwMDAwCgkJCSAgICAgIC8qSTJPX1NHTF9GTEFHU19TSU1QTEVfQUREUkVTU19FTEVNRU5UICovICkpIHsKCQkJCXByaW50ayhLRVJOX0RFQlVHCgkJCQkgICAgICAgIiVzOkJhZCBTRyBlbGVtZW50ICVkIC0gbm90IHNpbXBsZSAoJXgpXG4iLAoJCQkJICAgICAgIGMtPm5hbWUsIGksIHNnW2ldLmZsYWdfY291bnQpOwoJCQkJcmNvZGUgPSAtRUlOVkFMOwoJCQkJZ290byBjbGVhbnVwOwoJCQl9CgkJCXNnX3NpemUgPSBzZ1tpXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CgkJCXAgPSAmKHNnX2xpc3RbaV0pOwoJCQkvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIHRoZSB0cmFuc2ZlciAqLwoJCQlpZiAoaTJvX2RtYV9hbGxvYwoJCQkgICAgKCZjLT5wZGV2LT5kZXYsIHAsIHNnX3NpemUsCgkJCSAgICAgUENJX0RNQV9CSURJUkVDVElPTkFMKSkgewoJCQkJcHJpbnRrKEtFUk5fREVCVUcKCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKCQkJCSAgICAgICBjLT5uYW1lLCBzZ19zaXplLCBpLCBzZ19jb3VudCk7CgkJCQlyY29kZSA9IC1FTk9NRU07CgkJCQlnb3RvIGNsZWFudXA7CgkJCX0KCQkJLyogQ29weSBpbiB0aGUgdXNlcidzIFNHIGJ1ZmZlciBpZiBuZWNlc3NhcnkgKi8KCQkJaWYgKHNnW2ldLgoJCQkgICAgZmxhZ19jb3VudCAmIDB4MDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApIHsKCQkJCS8vIFRPRE8gNjRiaXQgZml4CgkJCQlpZiAoY29weV9mcm9tX3VzZXIKCQkJCSAgICAocC0+dmlydCwgKHZvaWQgX191c2VyICopKHVuc2lnbmVkIGxvbmcpc2dbaV0uYWRkcl9idXMsCgkJCQkgICAgIHNnX3NpemUpKSB7CgkJCQkJcHJpbnRrKEtFUk5fREVCVUcKCQkJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgY29weSBTRyBidWYgJWQgRlJPTSB1c2VyXG4iLAoJCQkJCSAgICAgICBjLT5uYW1lLCBpKTsKCQkJCQlyY29kZSA9IC1FRkFVTFQ7CgkJCQkJZ290byBjbGVhbnVwOwoJCQkJfQoJCQl9CgkJCS8vVE9ETyA2NGJpdCBmaXgKCQkJc2dbaV0uYWRkcl9idXMgPSAodTMyKSBwLT5waHlzOwoJCX0KCX0KCglyY29kZSA9IGkyb19tc2dfcG9zdF93YWl0KGMsIG0sIDYwKTsKCWlmIChyY29kZSkKCQlnb3RvIGNsZWFudXA7CgoJaWYgKHNnX29mZnNldCkgewoJCXUzMiBtc2dbMTI4XTsKCQkvKiBDb3B5IGJhY2sgdGhlIFNjYXR0ZXIgR2F0aGVyIGJ1ZmZlcnMgYmFjayB0byB1c2VyIHNwYWNlICovCgkJdTMyIGo7CgkJLy8gVE9ETyA2NGJpdCBmaXgKCQlzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKnNnOwoJCWludCBzZ19zaXplOwoKCQkvLyByZS1hY3F1aXJlIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIGhhbmRsZSBjb3JyZWN0bHkgdGhlIHNnIGNvcHkgb3BlcmF0aW9uCgkJbWVtc2V0KCZtc2csIDAsIE1TR19GUkFNRV9TSVpFICogNCk7CgkJLy8gZ2V0IHVzZXIgbXNnIHNpemUgaW4gdTMycwoJCWlmIChnZXRfdXNlcihzaXplLCAmdXNlcl9tc2dbMF0pKSB7CgkJCXJjb2RlID0gLUVGQVVMVDsKCQkJZ290byBjbGVhbnVwOwoJCX0KCQlzaXplID0gc2l6ZSA+PiAxNjsKCQlzaXplICo9IDQ7CgkJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCgkJaWYgKGNvcHlfZnJvbV91c2VyKG1zZywgdXNlcl9tc2csIHNpemUpKSB7CgkJCXJjb2RlID0gLUVGQVVMVDsKCQkJZ290byBjbGVhbnVwOwoJCX0KCQlzZ19jb3VudCA9CgkJICAgIChzaXplIC0gc2dfb2Zmc2V0ICogNCkgLyBzaXplb2Yoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50KTsKCgkJLy8gVE9ETyA2NGJpdCBmaXgKCQlzZyA9IChzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQgKikobXNnICsgc2dfb2Zmc2V0KTsKCQlmb3IgKGogPSAwOyBqIDwgc2dfY291bnQ7IGorKykgewoJCQkvKiBDb3B5IG91dCB0aGUgU0cgbGlzdCB0byB1c2VyJ3MgYnVmZmVyIGlmIG5lY2Vzc2FyeSAqLwoJCQlpZiAoIQoJCQkgICAgKHNnW2pdLgoJCQkgICAgIGZsYWdfY291bnQgJiAweDQwMDAwMDAgLypJMk9fU0dMX0ZMQUdTX0RJUiAqLyApKSB7CgkJCQlzZ19zaXplID0gc2dbal0uZmxhZ19jb3VudCAmIDB4ZmZmZmZmOwoJCQkJLy8gVE9ETyA2NGJpdCBmaXgKCQkJCWlmIChjb3B5X3RvX3VzZXIKCQkJCSAgICAoKHZvaWQgX191c2VyICopKHU2NCkgc2dbal0uYWRkcl9idXMsCgkJCQkgICAgIHNnX2xpc3Rbal0udmlydCwgc2dfc2l6ZSkpIHsKCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgJXAgVE8gdXNlciAleFxuIiwKCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXS52aXJ0LAoJCQkJCSAgICAgICBzZ1tqXS5hZGRyX2J1cyk7CgkJCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQkJCWdvdG8gY2xlYW51cDsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvKiBDb3B5IGJhY2sgdGhlIHJlcGx5IHRvIHVzZXIgc3BhY2UgKi8KCWlmIChyZXBseV9zaXplKSB7CgkJLy8gd2Ugd3JvdGUgb3VyIG93biB2YWx1ZXMgZm9yIGNvbnRleHQgLSBub3cgcmVzdG9yZSB0aGUgdXNlciBzdXBwbGllZCBvbmVzCgkJaWYgKGNvcHlfZnJvbV91c2VyKHJlcGx5ICsgMiwgdXNlcl9tc2cgKyAyLCBzaXplb2YodTMyKSAqIDIpKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgbWVzc2FnZSBjb250ZXh0IEZST00gdXNlclxuIiwKCQkJICAgICAgIGMtPm5hbWUpOwoJCQlyY29kZSA9IC1FRkFVTFQ7CgkJfQoJCWlmIChjb3B5X3RvX3VzZXIodXNlcl9yZXBseSwgcmVwbHksIHJlcGx5X3NpemUpKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcKCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgcmVwbHkgVE8gdXNlclxuIiwgYy0+bmFtZSk7CgkJCXJjb2RlID0gLUVGQVVMVDsKCQl9Cgl9CgogICAgICBjbGVhbnVwOgoJa2ZyZWUocmVwbHkpOwoJcmV0dXJuIHJjb2RlOwp9CgpzdGF0aWMgbG9uZyBpMm9fY2ZnX2NvbXBhdF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKewoJaW50IHJldDsKCWxvY2tfa2VybmVsKCk7CQkKCXN3aXRjaCAoY21kKSB7IAoJY2FzZSBJMk9HRVRJT1BTOgoJCXJldCA9IGkyb19jZmdfaW9jdGwoTlVMTCwgZmlsZSwgY21kLCBhcmcpOwoJCWJyZWFrOwoJY2FzZSBJMk9QQVNTVEhSVTMyOgoJCXJldCA9IGkyb19jZmdfcGFzc3RocnUzMihmaWxlLCBjbWQsIGFyZyk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldCA9IC1FTk9JT0NUTENNRDsKCQlicmVhazsKCX0KCXVubG9ja19rZXJuZWwoKTsKCXJldHVybiByZXQ7Cn0KCiNlbmRpZgoKc3RhdGljIGludCBpMm9fY2ZnX3Bhc3N0aHJ1KHVuc2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgaTJvX2NtZF9wYXNzdGhydSBfX3VzZXIgKmNtZCA9CgkgICAgKHN0cnVjdCBpMm9fY21kX3Bhc3N0aHJ1IF9fdXNlciAqKWFyZzsKCXN0cnVjdCBpMm9fY29udHJvbGxlciAqYzsKCXUzMiBfX3VzZXIgKnVzZXJfbXNnOwoJdTMyICpyZXBseSA9IE5VTEw7Cgl1MzIgX191c2VyICp1c2VyX3JlcGx5ID0gTlVMTDsKCXUzMiBzaXplID0gMDsKCXUzMiByZXBseV9zaXplID0gMDsKCXUzMiByY29kZSA9IDA7Cgl2b2lkICpzZ19saXN0W1NHX1RBQkxFU0laRV07Cgl1MzIgc2dfb2Zmc2V0ID0gMDsKCXUzMiBzZ19jb3VudCA9IDA7CglpbnQgc2dfaW5kZXggPSAwOwoJdTMyIGkgPSAwOwoJdm9pZCAqcCA9IE5VTEw7CglpMm9fc3RhdHVzX2Jsb2NrICpzYjsKCXN0cnVjdCBpMm9fbWVzc2FnZSBfX2lvbWVtICptc2c7Cgl1MzIgbTsKCXVuc2lnbmVkIGludCBpb3A7CgoJaWYgKGdldF91c2VyKGlvcCwgJmNtZC0+aW9wKSB8fCBnZXRfdXNlcih1c2VyX21zZywgJmNtZC0+bXNnKSkKCQlyZXR1cm4gLUVGQVVMVDsKCgljID0gaTJvX2ZpbmRfaW9wKGlvcCk7CglpZiAoIWMpIHsKCQlvc21fd2FybigiY29udHJvbGxlciAlZCBub3QgZm91bmRcbiIsIGlvcCk7CgkJcmV0dXJuIC1FTlhJTzsKCX0KCgltID0gaTJvX21zZ19nZXRfd2FpdChjLCAmbXNnLCBJMk9fVElNRU9VVF9NRVNTQUdFX0dFVCk7CgoJc2IgPSBjLT5zdGF0dXNfYmxvY2sudmlydDsKCglpZiAoZ2V0X3VzZXIoc2l6ZSwgJnVzZXJfbXNnWzBdKSkKCQlyZXR1cm4gLUVGQVVMVDsKCXNpemUgPSBzaXplID4+IDE2OwoKCWlmIChzaXplID4gc2ItPmluYm91bmRfZnJhbWVfc2l6ZSkgewoJCW9zbV93YXJuKCJzaXplIG9mIG1lc3NhZ2UgPiBpbmJvdW5kX2ZyYW1lX3NpemUiKTsKCQlyZXR1cm4gLUVGQVVMVDsKCX0KCgl1c2VyX3JlcGx5ID0gJnVzZXJfbXNnW3NpemVdOwoKCXNpemUgPDw9IDI7CQkvLyBDb252ZXJ0IHRvIGJ5dGVzCgoJLyogQ29weSBpbiB0aGUgdXNlcidzIEkyTyBjb21tYW5kICovCglpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpCgkJcmV0dXJuIC1FRkFVTFQ7CgoJaWYgKGdldF91c2VyKHJlcGx5X3NpemUsICZ1c2VyX3JlcGx5WzBdKSA8IDApCgkJcmV0dXJuIC1FRkFVTFQ7CgoJcmVwbHlfc2l6ZSA+Pj0gMTY7CglyZXBseV9zaXplIDw8PSAyOwoKCXJlcGx5ID0ga21hbGxvYyhyZXBseV9zaXplLCBHRlBfS0VSTkVMKTsKCWlmICghcmVwbHkpIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogQ291bGQgbm90IGFsbG9jYXRlIHJlcGx5IGJ1ZmZlclxuIiwKCQkgICAgICAgYy0+bmFtZSk7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocmVwbHksIDAsIHJlcGx5X3NpemUpOwoKCXNnX29mZnNldCA9IChtc2ctPnUuaGVhZFswXSA+PiA0KSAmIDB4MGY7CgoJd3JpdGVsKGkyb19jb25maWdfZHJpdmVyLmNvbnRleHQsICZtc2ctPnUucy5pY250eHQpOwoJd3JpdGVsKGkyb19jbnR4dF9saXN0X2FkZChjLCByZXBseSksICZtc2ctPnUucy50Y250eHQpOwoKCW1lbXNldChzZ19saXN0LCAwLCBzaXplb2Yoc2dfbGlzdFswXSkgKiBTR19UQUJMRVNJWkUpOwoJaWYgKHNnX29mZnNldCkgewoJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CgoJCWlmIChzZ19vZmZzZXQgKiA0ID49IHNpemUpIHsKCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQlnb3RvIGNsZWFudXA7CgkJfQoJCS8vIFRPRE8gNjRiaXQgZml4CgkJc2cgPSAoc3RydWN0IHNnX3NpbXBsZV9lbGVtZW50ICopKCgmbXNnLT51LmhlYWRbMF0pICsKCQkJCQkJICBzZ19vZmZzZXQpOwoJCXNnX2NvdW50ID0KCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwoJCWlmIChzZ19jb3VudCA+IFNHX1RBQkxFU0laRSkgewoJCQlwcmludGsoS0VSTl9ERUJVRyAiJXM6SU9DVEwgU0cgTGlzdCB0b28gbGFyZ2UgKCV1KVxuIiwKCQkJICAgICAgIGMtPm5hbWUsIHNnX2NvdW50KTsKCQkJa2ZyZWUocmVwbHkpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgoJCWZvciAoaSA9IDA7IGkgPCBzZ19jb3VudDsgaSsrKSB7CgkJCWludCBzZ19zaXplOwoKCQkJaWYgKCEoc2dbaV0uZmxhZ19jb3VudCAmIDB4MTAwMDAwMDAKCQkJICAgICAgLypJMk9fU0dMX0ZMQUdTX1NJTVBMRV9BRERSRVNTX0VMRU1FTlQgKi8gKSkgewoJCQkJcHJpbnRrKEtFUk5fREVCVUcKCQkJCSAgICAgICAiJXM6QmFkIFNHIGVsZW1lbnQgJWQgLSBub3Qgc2ltcGxlICgleClcbiIsCgkJCQkgICAgICAgYy0+bmFtZSwgaSwgc2dbaV0uZmxhZ19jb3VudCk7CgkJCQlyY29kZSA9IC1FSU5WQUw7CgkJCQlnb3RvIGNsZWFudXA7CgkJCX0KCQkJc2dfc2l6ZSA9IHNnW2ldLmZsYWdfY291bnQgJiAweGZmZmZmZjsKCQkJLyogQWxsb2NhdGUgbWVtb3J5IGZvciB0aGUgdHJhbnNmZXIgKi8KCQkJcCA9IGttYWxsb2Moc2dfc2l6ZSwgR0ZQX0tFUk5FTCk7CgkJCWlmICghcCkgewoJCQkJcHJpbnRrKEtFUk5fREVCVUcKCQkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBhbGxvY2F0ZSBTRyBidWZmZXIgLSBzaXplID0gJWQgYnVmZmVyIG51bWJlciAlZCBvZiAlZFxuIiwKCQkJCSAgICAgICBjLT5uYW1lLCBzZ19zaXplLCBpLCBzZ19jb3VudCk7CgkJCQlyY29kZSA9IC1FTk9NRU07CgkJCQlnb3RvIGNsZWFudXA7CgkJCX0KCQkJc2dfbGlzdFtzZ19pbmRleCsrXSA9IHA7CS8vIHNnbGlzdCBpbmRleGVkIHdpdGggaW5wdXQgZnJhbWUsIG5vdCBvdXIgaW50ZXJuYWwgZnJhbWUuCgkJCS8qIENvcHkgaW4gdGhlIHVzZXIncyBTRyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCgkJCWlmIChzZ1tpXS4KCQkJICAgIGZsYWdfY291bnQgJiAweDA0MDAwMDAwIC8qSTJPX1NHTF9GTEFHU19ESVIgKi8gKSB7CgkJCQkvLyBUT0RPIDY0Yml0IGZpeAoJCQkJaWYgKGNvcHlfZnJvbV91c2VyCgkJCQkgICAgKHAsICh2b2lkIF9fdXNlciAqKXNnW2ldLmFkZHJfYnVzLAoJCQkJICAgICBzZ19zaXplKSkgewoJCQkJCXByaW50ayhLRVJOX0RFQlVHCgkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgU0cgYnVmICVkIEZST00gdXNlclxuIiwKCQkJCQkgICAgICAgYy0+bmFtZSwgaSk7CgkJCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQkJCWdvdG8gY2xlYW51cDsKCQkJCX0KCQkJfQoJCQkvL1RPRE8gNjRiaXQgZml4CgkJCXNnW2ldLmFkZHJfYnVzID0gdmlydF90b19idXMocCk7CgkJfQoJfQoKCXJjb2RlID0gaTJvX21zZ19wb3N0X3dhaXQoYywgbSwgNjApOwoJaWYgKHJjb2RlKQoJCWdvdG8gY2xlYW51cDsKCglpZiAoc2dfb2Zmc2V0KSB7CgkJdTMyIG1zZ1sxMjhdOwoJCS8qIENvcHkgYmFjayB0aGUgU2NhdHRlciBHYXRoZXIgYnVmZmVycyBiYWNrIHRvIHVzZXIgc3BhY2UgKi8KCQl1MzIgajsKCQkvLyBUT0RPIDY0Yml0IGZpeAoJCXN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqc2c7CgkJaW50IHNnX3NpemU7CgoJCS8vIHJlLWFjcXVpcmUgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdG8gaGFuZGxlIGNvcnJlY3RseSB0aGUgc2cgY29weSBvcGVyYXRpb24KCQltZW1zZXQoJm1zZywgMCwgTVNHX0ZSQU1FX1NJWkUgKiA0KTsKCQkvLyBnZXQgdXNlciBtc2cgc2l6ZSBpbiB1MzJzCgkJaWYgKGdldF91c2VyKHNpemUsICZ1c2VyX21zZ1swXSkpIHsKCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQlnb3RvIGNsZWFudXA7CgkJfQoJCXNpemUgPSBzaXplID4+IDE2OwoJCXNpemUgKj0gNDsKCQkvKiBDb3B5IGluIHRoZSB1c2VyJ3MgSTJPIGNvbW1hbmQgKi8KCQlpZiAoY29weV9mcm9tX3VzZXIobXNnLCB1c2VyX21zZywgc2l6ZSkpIHsKCQkJcmNvZGUgPSAtRUZBVUxUOwoJCQlnb3RvIGNsZWFudXA7CgkJfQoJCXNnX2NvdW50ID0KCQkgICAgKHNpemUgLSBzZ19vZmZzZXQgKiA0KSAvIHNpemVvZihzdHJ1Y3Qgc2dfc2ltcGxlX2VsZW1lbnQpOwoKCQkvLyBUT0RPIDY0Yml0IGZpeAoJCXNnID0gKHN0cnVjdCBzZ19zaW1wbGVfZWxlbWVudCAqKShtc2cgKyBzZ19vZmZzZXQpOwoJCWZvciAoaiA9IDA7IGogPCBzZ19jb3VudDsgaisrKSB7CgkJCS8qIENvcHkgb3V0IHRoZSBTRyBsaXN0IHRvIHVzZXIncyBidWZmZXIgaWYgbmVjZXNzYXJ5ICovCgkJCWlmICghCgkJCSAgICAoc2dbal0uCgkJCSAgICAgZmxhZ19jb3VudCAmIDB4NDAwMDAwMCAvKkkyT19TR0xfRkxBR1NfRElSICovICkpIHsKCQkJCXNnX3NpemUgPSBzZ1tqXS5mbGFnX2NvdW50ICYgMHhmZmZmZmY7CgkJCQkvLyBUT0RPIDY0Yml0IGZpeAoJCQkJaWYgKGNvcHlfdG9fdXNlcgoJCQkJICAgICgodm9pZCBfX3VzZXIgKilzZ1tqXS5hZGRyX2J1cywgc2dfbGlzdFtqXSwKCQkJCSAgICAgc2dfc2l6ZSkpIHsKCQkJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCQkJICAgICAgICIlczogQ291bGQgbm90IGNvcHkgJXAgVE8gdXNlciAleFxuIiwKCQkJCQkgICAgICAgYy0+bmFtZSwgc2dfbGlzdFtqXSwKCQkJCQkgICAgICAgc2dbal0uYWRkcl9idXMpOwoJCQkJCXJjb2RlID0gLUVGQVVMVDsKCQkJCQlnb3RvIGNsZWFudXA7CgkJCQl9CgkJCX0KCQl9Cgl9CgoJLyogQ29weSBiYWNrIHRoZSByZXBseSB0byB1c2VyIHNwYWNlICovCglpZiAocmVwbHlfc2l6ZSkgewoJCS8vIHdlIHdyb3RlIG91ciBvd24gdmFsdWVzIGZvciBjb250ZXh0IC0gbm93IHJlc3RvcmUgdGhlIHVzZXIgc3VwcGxpZWQgb25lcwoJCWlmIChjb3B5X2Zyb21fdXNlcihyZXBseSArIDIsIHVzZXJfbXNnICsgMiwgc2l6ZW9mKHUzMikgKiAyKSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IG1lc3NhZ2UgY29udGV4dCBGUk9NIHVzZXJcbiIsCgkJCSAgICAgICBjLT5uYW1lKTsKCQkJcmNvZGUgPSAtRUZBVUxUOwoJCX0KCQlpZiAoY29weV90b191c2VyKHVzZXJfcmVwbHksIHJlcGx5LCByZXBseV9zaXplKSkgewoJCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJCSAgICAgICAiJXM6IENvdWxkIG5vdCBjb3B5IHJlcGx5IFRPIHVzZXJcbiIsIGMtPm5hbWUpOwoJCQlyY29kZSA9IC1FRkFVTFQ7CgkJfQoJfQoKICAgICAgY2xlYW51cDoKCWtmcmVlKHJlcGx5KTsKCXJldHVybiByY29kZTsKfQoKLyoKICogSU9DVEwgSGFuZGxlcgogKi8Kc3RhdGljIGludCBpMm9fY2ZnX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmcCwgdW5zaWduZWQgaW50IGNtZCwKCQkJIHVuc2lnbmVkIGxvbmcgYXJnKQp7CglpbnQgcmV0OwoKCXN3aXRjaCAoY21kKSB7CgljYXNlIEkyT0dFVElPUFM6CgkJcmV0ID0gaTJvX2NmZ19nZXRpb3BzKGFyZyk7CgkJYnJlYWs7CgoJY2FzZSBJMk9IUlRHRVQ6CgkJcmV0ID0gaTJvX2NmZ19nZXRocnQoYXJnKTsKCQlicmVhazsKCgljYXNlIEkyT0xDVEdFVDoKCQlyZXQgPSBpMm9fY2ZnX2dldGxjdChhcmcpOwoJCWJyZWFrOwoKCWNhc2UgSTJPUEFSTVNFVDoKCQlyZXQgPSBpMm9fY2ZnX3Bhcm1zKGFyZywgSTJPUEFSTVNFVCk7CgkJYnJlYWs7CgoJY2FzZSBJMk9QQVJNR0VUOgoJCXJldCA9IGkyb19jZmdfcGFybXMoYXJnLCBJMk9QQVJNR0VUKTsKCQlicmVhazsKCgljYXNlIEkyT1NXREw6CgkJcmV0ID0gaTJvX2NmZ19zd2RsKGFyZyk7CgkJYnJlYWs7CgoJY2FzZSBJMk9TV1VMOgoJCXJldCA9IGkyb19jZmdfc3d1bChhcmcpOwoJCWJyZWFrOwoKCWNhc2UgSTJPU1dERUw6CgkJcmV0ID0gaTJvX2NmZ19zd2RlbChhcmcpOwoJCWJyZWFrOwoKCWNhc2UgSTJPVkFMSURBVEU6CgkJcmV0ID0gaTJvX2NmZ192YWxpZGF0ZShhcmcpOwoJCWJyZWFrOwoKCWNhc2UgSTJPRVZUUkVHOgoJCXJldCA9IGkyb19jZmdfZXZ0X3JlZyhhcmcsIGZwKTsKCQlicmVhazsKCgljYXNlIEkyT0VWVEdFVDoKCQlyZXQgPSBpMm9fY2ZnX2V2dF9nZXQoYXJnLCBmcCk7CgkJYnJlYWs7CgoJY2FzZSBJMk9QQVNTVEhSVToKCQlyZXQgPSBpMm9fY2ZnX3Bhc3N0aHJ1KGFyZyk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlvc21fZGVidWcoInVua25vd24gaW9jdGwgY2FsbGVkIVxuIik7CgkJcmV0ID0gLUVJTlZBTDsKCX0KCglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGNmZ19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQp7CglzdHJ1Y3QgaTJvX2NmZ19pbmZvICp0bXAgPQoJICAgIChzdHJ1Y3QgaTJvX2NmZ19pbmZvICopa21hbGxvYyhzaXplb2Yoc3RydWN0IGkyb19jZmdfaW5mbyksCgkJCQkJICAgR0ZQX0tFUk5FTCk7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWlmICghdG1wKQoJCXJldHVybiAtRU5PTUVNOwoKCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopKGkyb19jZmdfaW5mb19pZCsrKTsKCXRtcC0+ZnAgPSBmaWxlOwoJdG1wLT5mYXN5bmMgPSBOVUxMOwoJdG1wLT5xX2lkID0gKHVsb25nKSBmaWxlLT5wcml2YXRlX2RhdGE7Cgl0bXAtPnFfbGVuID0gMDsKCXRtcC0+cV9pbiA9IDA7Cgl0bXAtPnFfb3V0ID0gMDsKCXRtcC0+cV9sb3N0ID0gMDsKCXRtcC0+bmV4dCA9IG9wZW5fZmlsZXM7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOwoJb3Blbl9maWxlcyA9IHRtcDsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmkyb19jb25maWdfbG9jaywgZmxhZ3MpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGNmZ19mYXN5bmMoaW50IGZkLCBzdHJ1Y3QgZmlsZSAqZnAsIGludCBvbikKewoJdWxvbmcgaWQgPSAodWxvbmcpIGZwLT5wcml2YXRlX2RhdGE7CglzdHJ1Y3QgaTJvX2NmZ19pbmZvICpwOwoKCWZvciAocCA9IG9wZW5fZmlsZXM7IHA7IHAgPSBwLT5uZXh0KQoJCWlmIChwLT5xX2lkID09IGlkKQoJCQlicmVhazsKCglpZiAoIXApCgkJcmV0dXJuIC1FQkFERjsKCglyZXR1cm4gZmFzeW5jX2hlbHBlcihmZCwgZnAsIG9uLCAmcC0+ZmFzeW5jKTsKfQoKc3RhdGljIGludCBjZmdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoJdWxvbmcgaWQgPSAodWxvbmcpIGZpbGUtPnByaXZhdGVfZGF0YTsKCXN0cnVjdCBpMm9fY2ZnX2luZm8gKnAxLCAqcDI7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoKCWxvY2tfa2VybmVsKCk7CglwMSA9IHAyID0gTlVMTDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmaTJvX2NvbmZpZ19sb2NrLCBmbGFncyk7Cglmb3IgKHAxID0gb3Blbl9maWxlczsgcDE7KSB7CgkJaWYgKHAxLT5xX2lkID09IGlkKSB7CgoJCQlpZiAocDEtPmZhc3luYykKCQkJCWNmZ19mYXN5bmMoLTEsIGZpbGUsIDApOwoJCQlpZiAocDIpCgkJCQlwMi0+bmV4dCA9IHAxLT5uZXh0OwoJCQllbHNlCgkJCQlvcGVuX2ZpbGVzID0gcDEtPm5leHQ7CgoJCQlrZnJlZShwMSk7CgkJCWJyZWFrOwoJCX0KCQlwMiA9IHAxOwoJCXAxID0gcDEtPm5leHQ7Cgl9CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpMm9fY29uZmlnX2xvY2ssIGZsYWdzKTsKCXVubG9ja19rZXJuZWwoKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY29uZmlnX2ZvcHMgPSB7Cgkub3duZXIgPSBUSElTX01PRFVMRSwKCS5sbHNlZWsgPSBub19sbHNlZWssCgkuaW9jdGwgPSBpMm9fY2ZnX2lvY3RsLAojaWZkZWYgQ09ORklHX0NPTVBBVAoJLmNvbXBhdF9pb2N0bCA9IGkyb19jZmdfY29tcGF0X2lvY3RsLAojZW5kaWYKCS5vcGVuID0gY2ZnX29wZW4sCgkucmVsZWFzZSA9IGNmZ19yZWxlYXNlLAoJLmZhc3luYyA9IGNmZ19mYXN5bmMsCn07CgpzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgaTJvX21pc2NkZXYgPSB7CglJMk9fTUlOT1IsCgkiaTJvY3RsIiwKCSZjb25maWdfZm9wcwp9OwoKc3RhdGljIGludCBfX2luaXQgaTJvX2NvbmZpZ19pbml0KHZvaWQpCnsKCXByaW50ayhLRVJOX0lORk8gT1NNX0RFU0NSSVBUSU9OICIgdiIgT1NNX1ZFUlNJT04gIlxuIik7CgoJc3Bpbl9sb2NrX2luaXQoJmkyb19jb25maWdfbG9jayk7CgoJaWYgKG1pc2NfcmVnaXN0ZXIoJmkyb19taXNjZGV2KSA8IDApIHsKCQlvc21fZXJyKCJjYW4ndCByZWdpc3RlciBkZXZpY2UuXG4iKTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoJLyoKCSAqICAgICAgSW5zdGFsbCBvdXIgaGFuZGxlcgoJICovCglpZiAoaTJvX2RyaXZlcl9yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpKSB7CgkJb3NtX2VycigiaGFuZGxlciByZWdpc3RlciBmYWlsZWQuXG4iKTsKCQltaXNjX2RlcmVnaXN0ZXIoJmkyb19taXNjZGV2KTsKCQlyZXR1cm4gLUVCVVNZOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGkyb19jb25maWdfZXhpdCh2b2lkKQp7CgltaXNjX2RlcmVnaXN0ZXIoJmkyb19taXNjZGV2KTsKCWkyb19kcml2ZXJfdW5yZWdpc3RlcigmaTJvX2NvbmZpZ19kcml2ZXIpOwp9CgpNT0RVTEVfQVVUSE9SKCJSZWQgSGF0IFNvZnR3YXJlIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKTU9EVUxFX0RFU0NSSVBUSU9OKE9TTV9ERVNDUklQVElPTik7Ck1PRFVMRV9WRVJTSU9OKE9TTV9WRVJTSU9OKTsKCm1vZHVsZV9pbml0KGkyb19jb25maWdfaW5pdCk7Cm1vZHVsZV9leGl0KGkyb19jb25maWdfZXhpdCk7Cg==