LyoKICogIEhUTUwgRW50aXR5ICYgRW5jb2Rpbmcgbm9ybWFsaXphdGlvbi4KICoKICogIENvcHlyaWdodCAoQykgMjAwNiBU9nL2ayBFZHZpbiA8ZWR3aW5AY2xhbWF2Lm5ldD4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogKiAgTUEgMDIxMTAtMTMwMSwgVVNBLgogKgogKi8KI2luY2x1ZGUgImNsYW1hdi1jb25maWcuaCIKCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCgojaWZkZWYgQ0xfVEhSRUFEX1NBRkUKI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2VuZGlmCgojaW5jbHVkZSAiY2xhbWF2LmgiCiNpbmNsdWRlICJvdGhlcnMuaCIKI2luY2x1ZGUgImh0bWxub3JtLmgiCiNpbmNsdWRlICJoYXNodGFiLmgiCiNpbmNsdWRlICJlbnRjb252LmgiCiNpbmNsdWRlICJlbnRpdHlsaXN0LmgiCiNpbmNsdWRlICJjbHR5cGVzLmgiCgojaWZkZWYgSEFWRV9JQ09OVl9ICiNpbmNsdWRlIDxpY29udi5oPgojZW5kaWYKI2luY2x1ZGUgImVuY29kaW5nX2FsaWFzZXMuaCIKCgojZGVmaW5lIE1BWF9MSU5FIDEwMjQKCiNpZm5kZWYgRUlMU0VRCiNkZWZpbmUgRUlMU0VRIDg0CiNlbmRpZgoKdW5zaWduZWQgY2hhciogZW50aXR5X25vcm0oY29uc3Qgc3RydWN0IGVudGl0eV9jb252KiBjb252LGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVudGl0eSkKewoJc3RydWN0IGVsZW1lbnQqIGUgPSBoYXNodGFiX2ZpbmQoY29udi0+aHQsZW50aXR5LHN0cmxlbigoY29uc3QgY2hhciopZW50aXR5KSk7CglpZihlICYmIGUtPmtleSkgewoJCWNvbnN0IGludCB2YWwgPSBlLT5kYXRhOwoJCWlmKHZhbCA9PSAnPCcpLyogdGhpcyB3YXMgYW4gZXNjYXBlZCA8LCBzbyBvdXRwdXQgaXQgZXNjYXBlZCovCgkJCXJldHVybiAodW5zaWduZWQgY2hhciopY2xpX3N0cmR1cCgiJmx0OyIpOwoJCWVsc2UgaWYodmFsID09ICc+JykvKiBzZWUgYWJvdmUgKi8KCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKiljbGlfc3RyZHVwKCImZ3Q7Iik7CgkJZWxzZSBpZih2YWw8MTI3KSB7CgkJCXVuc2lnbmVkIGNoYXIgKmVfb3V0ID0gY2xpX21hbGxvYygyKTsKCgkJCWlmKCFlX291dCkKCQkJICAgIHJldHVybiBOVUxMOwoKCQkJZV9vdXRbMF0gPSAodW5zaWduZWQgY2hhcil2YWw7CgkJCWVfb3V0WzFdID0gJ1wwJzsKCQkJcmV0dXJuIGVfb3V0OwoJCX0KCQllbHNlIGlmKHZhbD09MTYwKQoJCQlyZXR1cm4gKHVuc2lnbmVkIGNoYXIqKWNsaV9zdHJkdXAoIiAiKTsKCQllbHNlIHsKCQkJdW5zaWduZWQgY2hhciAqZW50X291dCA9IGNsaV9tYWxsb2MoMTApOwoKCQkJaWYoIWVudF9vdXQpCgkJCSAgICByZXR1cm4gTlVMTDsKCgkJCXNucHJpbnRmKChjaGFyKillbnRfb3V0LDksIiYjJWQ7Iix2YWwpOwoJCQllbnRfb3V0WzldID0gJ1wwJzsKCQkJcmV0dXJuIGVudF9vdXQ7CgkJfQoJfQoJZWxzZQoJCXJldHVybiBOVUxMOwp9CgovKiBzYW5lIGRlZmF1bHQsIG11c3QgYmUgbGFyZ2VyLCB0aGFuIHRoZSBsb25nZXN0IHBvc3NpYmxlIHJldHVybiBzdHJpbmcsCiAqIHdoaWNoIGlzCiAqICYjeHh4OyovCiNkZWZpbmUgTUlOX0JVRkZFUl9TSVpFIDMyCgppbnQgaW5pdF9lbnRpdHlfY29udmVydGVyKHN0cnVjdCBlbnRpdHlfY29udiogY29udixjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmNvZGluZyxzaXplX3QgYnVmZmVyX3NpemUpCnsKCWlmKGJ1ZmZlcl9zaXplIDwgTUlOX0JVRkZFUl9TSVpFKSB7CgkJY2xpX3dhcm5tc2coIkVudGl0eSBjb252ZXJ0ZXI6IFN1cHBsaWVkIGJ1ZmZlciBzaXplOiVsdSwgc21hbGxlciB0aGFuIG1pbmltdW0gcmVxdWlyZWQ6ICVkXG4iLCh1bnNpZ25lZCBsb25nKWJ1ZmZlcl9zaXplLE1JTl9CVUZGRVJfU0laRSk7CgkJcmV0dXJuIENMX0VOVUxMQVJHOwoJfQoJaWYoY29udikgewoJCWNvbnYtPmVuY29kaW5nID0gKHVuc2lnbmVkIGNoYXIqKSBjbGlfc3RyZHVwKCJJU08tODg1OS0xIik7CgkJY29udi0+YXV0b2RldGVjdGVkID0gT1RIRVI7CgkJY29udi0+Ym9tX2NudCA9IDA7CgkJY29udi0+YnVmZmVyX2NudCA9IDA7CgkJY29udi0+Ynl0ZXNfcmVhZCA9IDA7CgkJY29udi0+cGFydGlhbCA9IDA7CgkJY29udi0+ZW50aXR5X2J1ZmZjbnQgPSAwOwoJCWNvbnYtPmJ1ZmZlcl9zaXplID0gYnVmZmVyX3NpemU7CgkJY29udi0+cHJpb3JpdHkgPSBOT1BSSU87CgoJCWNvbnYtPnRtcF9hcmVhLm9mZnNldCA9IDA7CgkJY29udi0+dG1wX2FyZWEubGVuZ3RoID0gMDsKCQljb252LT50bXBfYXJlYS5idWZmZXIgID0gIGNsaV9tYWxsb2MoYnVmZmVyX3NpemUpOwoJCWlmKCFjb252LT50bXBfYXJlYS5idWZmZXIpIHsKCQkJcmV0dXJuIENMX0VNRU07CgkJfQoKCQljb252LT5vdXRfYXJlYS5vZmZzZXQgPSAwOwoJCWNvbnYtPm91dF9hcmVhLmxlbmd0aCA9IDA7CgkJY29udi0+b3V0X2FyZWEuYnVmZmVyID0gY2xpX21hbGxvYyhidWZmZXJfc2l6ZSk7CgkJaWYoIWNvbnYtPm91dF9hcmVhLmJ1ZmZlcikgewoJCQlmcmVlKGNvbnYtPnRtcF9hcmVhLmJ1ZmZlcik7CgkJCXJldHVybiBDTF9FTUVNOwoJCX0KCgkJY29udi0+bm9ybV9hcmVhLm9mZnNldCA9IDA7CgkJY29udi0+bm9ybV9hcmVhLmxlbmd0aCA9IDA7CgkJY29udi0+bm9ybV9hcmVhLmJ1ZmZlciA9IGNsaV9tYWxsb2MoYnVmZmVyX3NpemUpOwoJCWlmKCFjb252LT5ub3JtX2FyZWEuYnVmZmVyKSB7CgkJCWZyZWUoY29udi0+dG1wX2FyZWEuYnVmZmVyKTsKCQkJZnJlZShjb252LT5vdXRfYXJlYS5idWZmZXIpOwoJCQlyZXR1cm4gQ0xfRU1FTTsKCQl9CgoJCWNvbnYtPmh0ID0gJmVudGl0aWVzX2h0YWJsZTsKCQljb252LT5tc2dfemVyb19zaG93biA9IDA7CgoJCXJldHVybiAwOwoJfQoJZWxzZSAKCQlyZXR1cm4gQ0xfRU5VTExBUkc7Cn0KCnN0YXRpYyBzaXplX3QgZW5jb2RpbmdfYnl0ZXMoY29uc3QgdW5zaWduZWQgY2hhciogZnJvbWNvZGUsIGVudW0gZW5jb2RpbmdzKiBlbmNvZGluZykKewoJY29uc3QgdW5zaWduZWQgY2hhciogZnJvbSA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikgZnJvbWNvZGU7CgkvKiBzcGVjaWFsIGNhc2UgZm9yIHRoZXNlIHVudXN1YWwgYnl0ZW9yZGVycyAqLwoJKmVuY29kaW5nPUVfT1RIRVI7CglpZihmcm9tID09IFVDUzRfMjE0MykKCQkqZW5jb2RpbmcgPSBFX1VDUzRfMjEzNDsKCWVsc2UgaWYgKGZyb20gPT0gVUNTNF8zNDEyKQoJCSplbmNvZGluZyA9IEVfVUNTNF8zNDEyOwoJZWxzZSB7CgkJc3RydWN0IGVsZW1lbnQgKiBlID0gaGFzaHRhYl9maW5kKCZhbGlhc2VzX2h0YWJsZSxmcm9tLHN0cmxlbigoY29uc3QgY2hhciopZnJvbWNvZGUpKTsKCQlpZihlICYmIGUtPmtleSkgewoJCQkqZW5jb2RpbmcgPSBlLT5kYXRhOwoJCX0KCX0KCglzd2l0Y2goKmVuY29kaW5nKSB7CgkJY2FzZSBFX1VDUzQ6CgkJY2FzZSBFX1VDUzRfMTIzNDoKCQljYXNlIEVfVUNTNF80MzIxOgoJCWNhc2UgRV9VQ1M0XzIxMzQ6CgkJY2FzZSBFX1VDUzRfMzQxMjoKCQkJcmV0dXJuIDQ7CgkJY2FzZSBFX1VURjE2OgoJCWNhc2UgRV9VVEYxNl9CRToKCQljYXNlIEVfVVRGMTZfTEU6CgkJCXJldHVybiAyOwoJCWNhc2UgRV9VVEY4OgoJCWNhc2UgRV9VTktOT1dOOgoJCWNhc2UgRV9PVEhFUjoKCQlkZWZhdWx0OgoJCQlyZXR1cm4gMTsKCX0KCX0KCiNpZm5kZWYgSEFWRV9JQ09OVl9ICnR5cGVkZWYgc3RydWN0IHsKCWVudW0gZW5jb2RpbmdzIGVuY29kaW5nOwoJc2l6ZV90IHNpemU7Cn0gKiBpY29udl90OwoKc3RhdGljIGljb252X3QgaWNvbnZfb3Blbihjb25zdCBjaGFyICp0b2NvZGUsIGNvbnN0IGNoYXIqIGZyb21jb2RlKQp7CglpY29udl90IGljb252ID0gY2xpX21hbGxvYyhzaXplb2YoKmljb252KSk7CglpZighaWNvbnYpCgkJcmV0dXJuIE5VTEw7CgkvKiBUT0RPOiBjaGVjayB0aGF0IHRvY29kZSBpcyBVVEYxNkJFICovCglpY29udi0+c2l6ZSA9IGVuY29kaW5nX2J5dGVzKGZyb21jb2RlLCZpY29udi0+ZW5jb2RpbmcpOwoJcmV0dXJuIGljb252Owp9CgpzdGF0aWMgaW50IGljb252X2Nsb3NlKGljb252X3QgY2QpCnsKCWlmKGNkKQoJCWZyZWUoY2QpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGljb252KGljb252X3QgaWNvbnZfc3RydWN0LGNoYXIgKippbmJ1Ziwgc2l6ZV90ICppbmJ5dGVzbGVmdCwKCQljaGFyKiogb3V0YnVmLCBzaXplX3QgKm91dGJ5dGVzbGVmdCkKewoJY29uc3Qgc2l6ZV90IG1heGNvcHkgPSAoKmluYnl0ZXNsZWZ0ID4gKm91dGJ5dGVzbGVmdCA/ICpvdXRieXRlc2xlZnQgIDogKmluYnl0ZXNsZWZ0KSAmIH4oaWNvbnZfc3RydWN0LT5zaXplIC0gMSk7Cgljb25zdCB1aW50OF90KiBpbnB1dCA9IChjb25zdCB1aW50OF90KikqaW5idWY7Cgl1aW50OF90KiBvdXRwdXQgPSAodWludDhfdCopKm91dGJ1ZjsKCXNpemVfdCBpOwoKCS8qLG1heGNvcHkgaXMgYWxpZ25lZCB0byBkYXRhIHNpemUgKi8KCS8qIG91dHB1dCBpcyBhbHdheXMgdXRmMTZiZSAhKi8KCXN3aXRjaChpY29udl9zdHJ1Y3QtPmVuY29kaW5nKSB7CgkJY2FzZSBFX1VDUzQ6CgkJY2FzZSBFX1VDUzRfMTIzNDoJCQkKCQkJewoJCQkJZm9yKGk9MDtpIDwgbWF4Y29weTsgaSArPSA0KSB7CgkJCQkJaWYoIWlucHV0W2krMl0gJiYgIWlucHV0W2krM10pIHsKCQkJCQkJb3V0cHV0W2kvMl0gPSBpbnB1dFtpKzFdOyAvKiBpcyBjb21waWxlciBzbWFydCBlbm91Z2ggdG8gcmVwbGFjZSAvMiwgd2l0aCA+PjEgPyAqLwoJCQkJCQlvdXRwdXRbaS8yKzFdID0gaW5wdXRbaV07CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQljbGlfZGJnbXNnKCJXYXJuaW5nOiB1bmljb2RlIGNoYXJhY3RlciBvdXQgb2YgdXRmMTYgcmFuZ2UhXG4iKTsKCQkJCQkJb3V0cHV0W2kvMl0gPSAweGZmOwoJCQkJCQlvdXRwdXRbaS8yKzFdID0gMHhmZjsKCQkJCQl9CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCWNhc2UgRV9VQ1M0XzQzMjE6CgkJCXsKCQkJCWNvbnN0IHVpbnQxNl90ICppbiA9IChjb25zdCB1aW50MTZfdCopaW5wdXQ7LypVQ1M0XzQzMjEsIGFuZCBVVEYxNl9CRSBoYXZlIHNhbWUgZW5kaWFubmVzcywgbm8gbmVlZCBmb3IgYnl0ZXN3YXAgaGVyZSovCgkJCQl1aW50MTZfdCAqb3V0ID0gKHVpbnQxNl90KilvdXRwdXQ7CgkJCQlmb3IoaT0wO2k8bWF4Y29weS8yOyBpKz0yKSB7CgkJCQkJaWYoIWluW2ldKSB7CgkJCQkJCW91dFtpLzJdID0gaW5baSsxXTsKCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCW91dFtpLzJdID0gMHhmZmZmOwoJCQkJCX0KCQkJCX0KCQkJCWJyZWFrOwoJCQl9CgkJY2FzZSBFX1VDUzRfMjEzNDogCgkJCXsKCQkJCWNvbnN0IHVpbnQxNl90ICppbiA9IChjb25zdCB1aW50MTZfdCopaW5wdXQ7CgkJCQl1aW50MTZfdCogb3V0ID0gKHVpbnQxNl90KilvdXRwdXQ7CgkJCQlmb3IoaT0wO2k8bWF4Y29weS8yO2krPTIpIHsKCQkJCQlpZighaW5baSsxXSkKCQkJCQkJb3V0W2kvMl0gPSBpbltpXTsKCQkJCQllbHNlCgkJCQkJCW91dFtpLzJdID0gMHhmZmZmOwoJCQkJfQoJCQkJYnJlYWs7CgkJCX0KCQljYXNlIEVfVUNTNF8zNDEyOgoJCQl7CgkJCQlmb3IoaT0wO2kgPCBtYXhjb3B5O2kgKz0gNCkgewoJCQkJCWlmKCFpbnB1dFtpXSAmJiAhaW5wdXRbaSsxXSkgewoJCQkJCQlvdXRwdXRbaS8yXSA9IGlucHV0W2krM107CgkJCQkJCW91dHB1dFtpLzIrMV0gPSBpbnB1dFtpKzJdOwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJb3V0cHV0W2kvMl0gPSAweGZmOwoJCQkJCQlvdXRwdXRbaS8yKzFdID0gMHhmZjsKCQkJCQl9CgkJCQl9CgkJCQlicmVhazsKCQkJfQoJCWNhc2UgRV9VVEYxNjoKCQljYXNlIEVfVVRGMTZfTEU6CgkJCXsKCQkJCWZvcihpPTA7aSA8IG1heGNvcHk7aSArPSAyKSB7CgkJCQkJb3V0cHV0W2ldID0gaW5wdXRbaSsxXTsKCQkJCQlvdXRwdXRbaSsxXSA9IGlucHV0W2ldOwoJCQkJfQoJCQkJYnJlYWs7CgkJCX0KCQljYXNlIEVfVVRGMTZfQkU6CgkJCW1lbWNweShvdXRwdXQsaW5wdXQsbWF4Y29weSk7CgkJCWJyZWFrOwoJCWNhc2UgRV9VTktOT1dOOgoJCWNhc2UgRV9PVEhFUjoKCQkJewoJCQkJY29uc3Qgc2l6ZV90IG1heF9jb3B5ID0gKmluYnl0ZXNsZWZ0ID4gKCpvdXRieXRlc2xlZnQvMikgPyAoKm91dGJ5dGVzbGVmdC8yKSA6ICppbmJ5dGVzbGVmdDsKCQkJCWZvcihpPTA7aTxtYXhfY29weTtpKyspIHsKCQkJCQlvdXRwdXRbaSoyXSAgID0gMDsKCQkJCQlvdXRwdXRbaSoyKzFdID0gaW5wdXRbaV07CgkJCQl9CgkJCQkqb3V0Ynl0ZXNsZWZ0IC09IG1heF9jb3B5KjI7CgkJCQkqaW5ieXRlc2xlZnQgIC09IG1heF9jb3B5OwoJCQkJKmluYnVmICs9IG1heF9jb3B5OwoJCQkJKm91dGJ1ZiArPSBtYXhfY29weSoyOwoJCQkJaWYoKmluYnl0ZXNsZWZ0KQoJCQkJCXJldHVybiBFMkJJRzsKCQkJCXJldHVybiAwOwoJCQl9CgkJY2FzZSBFX1VURjg6CgkJCXsKCQkJCWNvbnN0IHNpemVfdCBtYXhyZWFkICA9ICppbmJ5dGVzbGVmdDsKCQkJCWNvbnN0IHNpemVfdCBtYXh3cml0ZSA9ICpvdXRieXRlc2xlZnQ7CgkJCQlzaXplX3QgajsKCQkJCWZvcihpPTAsaj0wIDsgaSA8IG1heHJlYWQgJiYgaiA8IG1heHdyaXRlOykgewoJCQkJCWlmKGlucHV0W2ldIDwgMHg3RikgIHsKCQkJCQkJb3V0cHV0W2orK10gPSAwOwoJCQkJCQlvdXRwdXRbaisrXSA9IGlucHV0W2krK107CgkJCQkJCQl9CgkJCQkJZWxzZSBpZiggKGlucHV0W2ldJjB4RTApID09IDB4QzAgKSB7CgkJCQkJCWlmICgoaW5wdXRbaSsxXSYweEMwKSA9PSAweDgwKSB7CgkJCQkJCQkvKiAyIGJ5dGVzIGxvbmcgMTEweXl5eXkgenp6enp6enogLT4gMDAwMDB5eXkgeXl6enp6enoqLwoJCQkJCQkJb3V0cHV0W2orK10gPSAoKGlucHV0W2ldICYgMHgxRikgPj4gMikgJiAweDA3OwoJCQkJCQkJb3V0cHV0W2orK10gPSAoKGlucHV0W2ldICYgMHgxRikgPDwgNikgfCAoaW5wdXRbaSsxXSAmIDB4M0YpOwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJY2xpX2RiZ21zZygiaW52YWxpZCBVVEY4IGNoYXJhY3RlciBlbmNvdW50ZXJlZFxuIik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlpKz0yOwoJCQkJCX0KCQkJCQllbHNlIGlmKCAoaW5wdXRbaV0mMHhFMCkgPT0gMHhFMCkgewoJCQkJCQlpZiggKGlucHV0W2krMV0mMHhDMCkgPT0gMHg4MCAmJiAoaW5wdXRbaSsyXSYweEMwKSA9PSAweDgwKSB7CgkJCQkJCQkvKiAzIGJ5dGVzIGxvbmcgMTExMHh4eHggMTB5eXl5eXkgMTB6enp6enp6eiAtPiB4eHh4eXl5eSB5eXp6enp6eiovCgkJCQkJCQlvdXRwdXRbaisrXSA9IChpbnB1dFtpXSA8PCA0KSB8ICgoaW5wdXRbaSsxXSA+PiAyKSAmIDB4MEYpOwoJCQkJCQkJb3V0cHV0W2orK10gPSAoaW5wdXRbaSsxXSA8PCA2KSB8IChpbnB1dFtpKzJdICYgMHgzRik7CgkJCQkJCX0KCQkJCQkJZWxzZSB7CgkJCQkJCQljbGlfZGJnbXNnKCJpbnZhbGlkIFVURjggY2hhcmFjdGVyIGVuY291bnRlcmVkXG4iKTsKCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJCWkrPTM7CgkJCQkJfQoJCQkJCWVsc2UgaWYoIChpbnB1dFtpXSYweEY4KSA9PSAweEYwKSB7CgkJCQkJCWlmKChpbnB1dFtpKzFdJjB4QzApID09IDB4ODAgJiYgKGlucHV0W2krMl0mMHhDMCkgPT0gMHg4MCAmJiAoaW5wdXRbaSszXSYweEMwKSA9PSAweDgwKSB7CgkJCQkJCQkvKiA0IGJ5dGVzIGxvbmcgMTExMTB3d3cgMTB4eHh4eHggMTB5eXl5eXkgMTB6enp6enogLT4gMDAwd3d3eHggeHh4eHl5eXkgeXl6enp6enoqLwoJCQkJCQkJY2xpX2RiZ21zZygiVVRGOCBjaGFyYWN0ZXIgb3V0IG9mIFVURjE2IHJhbmdlIGVuY291bnRlcmVkIik7CgkJCQkJCQlvdXRwdXRbaisrXSA9IDB4ZmY7CgkJCQkJCQlvdXRwdXRbaisrXSA9IDB4ZmY7CgoJCQkJCQkJLypvdXRbaisrXSA9ICgoaW5wdXRbaV0gJiAweDA3KSA8PCAyKSB8ICgoaW5wdXRbaSsxXSA+PiA0KSAmIDB4Myk7CgkJCQkJCQlvdXRbaisrXSA9IChpbnB1dFtpKzFdIDw8IDQpIHwgKChpbnB1dFtpKzJdID4+IDIpICYgMHgwRik7CgkJCQkJCQlvdXRbaisrXSA9IChpbnB1dFtpKzJdIDw8IDYpIHwgKGlucHV0W2krMl0gJiAweDNGKTsqLwoJCQkJCQl9CgkJCQkJCWVsc2UgewoJCQkJCQkJY2xpX2RiZ21zZygiaW52YWxpZCBVVEY4IGNoYXJhY3RlciBlbmNvdW50ZXJlZFxuIik7CgkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCQlpKz00OwoJCQkJCX0KCQkJCQllbHNlIHsKCQkJCQkJY2xpX2RiZ21zZygiaW52YWxpZCBVVEY4IGNoYXJhY3RlciBlbmNvdW50ZXJlZFxuIik7CgkJCQkJCWJyZWFrOwoJCQkJCX0JCQkJCQkJCgkJCQl9CgkJCQkqaW5ieXRlc2xlZnQgLT0gaTsKCQkJCSpvdXRieXRlc2xlZnQgLT0gajsKCQkJCSppbmJ1ZiArPSBpOwoJCQkJKm91dGJ1ZiArPSBqOwoJCQkJaWYoKmluYnl0ZXNsZWZ0ICYmICpvdXRieXRlc2xlZnQpIHsKCQkJCQllcnJubyA9IEVJTFNFUTsvKiB3ZSBoYWQgYW4gZWFybHkgZXhpdCAqLwoJCQkJCXJldHVybiAtMTsKCQkJCX0KCQkJCWlmKCppbmJ5dGVzbGVmdCkgewoJCQkJCWVycm5vID0gRTJCSUc7CgkJCQkJcmV0dXJuIC0xOwoJCQkJfQoJCQkJcmV0dXJuIDA7CgkJCX0KCX0KCQoJKm91dGJ5dGVzbGVmdCAtPSBtYXhjb3B5OwoJKmluYnl0ZXNsZWZ0ICAtPSBtYXhjb3B5OwoJKmluYnVmICs9IG1heGNvcHk7Cgkqb3V0YnVmICs9IG1heGNvcHk7CglpZigqaW5ieXRlc2xlZnQpIHsKCQllcnJubyA9IEUyQklHOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAgMDsKfQoKI2Vsc2UKCgoKI2VuZGlmCgovKiBuZXcgaWNvbnYoKSB2ZXJzaW9uICovCnN0YXRpYyBpbmxpbmUgdm9pZCBwcm9jZXNzX2JvbShzdHJ1Y3QgZW50aXR5X2NvbnYqIGNvbnYpCnsKCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGJvbSA9IGNvbnYtPmJvbTsKCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuY29kaW5nID0gT1RIRVI7CglpbnQgaGFzX2JvbSA9IDA7Cgl1aW50OF90IGVuY19ieXRlcyA9IDQ7LyogZGVmYXVsdCBpcyBVVEY4LCB3aGljaCBoYXMgYSBtYXhpbXVtIG9mIDQgYnl0ZXMqLwoKCXN3aXRjaChib21bMF0pIHsKCQljYXNlIDB4MDA6CgkJCWlmKGJvbVsxXSA9PSAweDAwKSB7CgkJCQlpZihib21bMl0gPT0gMHhGRSAmJiBib21bM10gPT0gMHhGRikgewoJCQkJCWVuY29kaW5nID0gVUNTNF8xMjM0Oy8qIFVDUy00IGJpZy1lbmRpYW4qLwoJCQkJCWhhc19ib20gPSAxOwoJCQkJfQoJCQkJZWxzZSBpZihib21bMl0gPT0gMHhGRiAmJiBib21bM10gPT0gMHhGRSkgewoJCQkJCWVuY29kaW5nID0gVUNTNF8yMTQzOy8qIFVDUy00IHVudXN1YWwgb3JkZXIgMjE0MyAqLwoJCQkJCWhhc19ib20gPSAxOwoJCQkJfQoJCQkJZWxzZSBpZihib21bMl0gPT0gMHgwMCAmJiBib21bM10gPT0gMHgzQykgewoJCQkJCWVuY29kaW5nID0gVU5ERUNJREVEXzMyXzEyMzQ7CgkJCQl9IAoJCQkJZWxzZSBpZihib21bMl0gPT0gMHgzQyAmJiBib21bM10gPT0gMHgwMCkgewoJCQkJCWVuY29kaW5nID0gVU5ERUNJREVEXzMyXzIxNDM7CgkJCQl9CgkJCX0vKiAweDAwIDB4MDAgKi8KCQkJZWxzZSBpZihib21bMV0gPT0gMHgzQykgewoJCQkJaWYoYm9tWzJdID09IDB4MDApIHsKCQkJCQlpZihib21bM10gPT0gMHgwMCkgewoJCQkJCQllbmNvZGluZyA9IFVOREVDSURFRF8zMl8zNDEyOwoJCQkJCX0KCQkJCQllbHNlIGlmKGJvbVszXSA9PSAweDNGKSB7CgkJCQkJCWVuY29kaW5nID0gVU5ERUNJREVEXzE2X0JFOwoJCQkJCQllbmNfYnl0ZXMgPSAyOwoJCQkJCX0KCQkJCX0vKjB4MDAgMHgzQyAweDAwKi8KCQkJfS8qMHgwMCAweDNDKi8KCQkJYnJlYWs7CgkJY2FzZSAweEZGOgoJCQlpZihib21bMV0gPT0gMHhGRSkgewoJCQkJaWYoYm9tWzJdID09IDB4MDAgJiYgYm9tWzNdID09IDB4MDApIHsKCQkJCQllbmNvZGluZyA9IFVDUzRfNDMyMTsKCQkJCQloYXNfYm9tID0gMTsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCWVuY29kaW5nID0gVVRGMTZfTEU7CgkJCQkJaGFzX2JvbSA9IDE7CgkJCQkJZW5jX2J5dGVzID0gMjsKCQkJCX0KCQkJfS8qMHhGRiAweEZFKi8KCQkJYnJlYWs7CgkJY2FzZSAweEZFOiAKCQkJaWYoYm9tWzFdID09IDB4RkYpIHsKCQkJCQlpZihib21bMl0gPT0gMHgwMCAmJiBib21bM10gPT0gMHgwMCkgewoJCQkJCQllbmNvZGluZyA9IFVDUzRfMzQxMjsKCQkJCQkJaGFzX2JvbSA9IDE7CgkJCQkJfQoJCQkJCWVsc2UgewoJCQkJCQllbmNvZGluZyA9IFVURjE2X0JFOwoJCQkJCQloYXNfYm9tID0gMTsKCQkJCQkJZW5jX2J5dGVzID0gMjsKCQkJCQl9CQkJCQkKCQkJfS8qMHhGRSAweEZGKi8KCQkJYnJlYWs7CgkJY2FzZSAweEVGOiAKCQkJaWYoYm9tWzFdID09IDB4QkIgJiYgYm9tWzJdID09IDB4QkYpICB7CgkJCQkJZW5jb2RpbmcgPSBVVEY4OwoJCQkJCWhhc19ib20gPSAxOwoJCQkJCS8qZW5jX2J5dGVzID0gNDstIGRlZmF1bHQsIG1heGltdW0gNCBieXRlcyovCgkJCX0vKjB4RUYgMHhCQiAweEJGKi8JCQkJCgkJCWJyZWFrOwoJCWNhc2UgMHgzQzogCgkJCQlpZihib21bMV0gPT0gMHgwMCkgewoJCQkJCWlmKGJvbVsyXSA9PSAweDAwICYmIGJvbVszXSA9PSAweDAwKSB7CgkJCQkJCWVuY29kaW5nID0gVU5ERUNJREVEXzMyXzQzMjE7CgkJCQkJfQoJCQkJCWVsc2UgaWYoYm9tWzJdID09IDB4M0YgJiYgYm9tWzNdID09IDB4MDApIHsKCQkJCQkJZW5jb2RpbmcgPSBVTkRFQ0lERURfMTZfTEU7CgkJCQkJCWVuY19ieXRlcyA9IDI7CgkJCQkJfQoJCQkJfS8qMHgzQyAweDAwKi8KCQkJCWVsc2UgaWYoYm9tWzFdID09IDB4M0YgJiYgYm9tWzJdID09IDB4NzggJiYgYm9tWzNdPT0weDZEKSB7CgkJCQkJZW5jb2RpbmcgPSBVTkRFQ0lERURfODsKCQkJCQllbmNfYnl0ZXMgPSAxOwoJCQkJfS8qMHgzQyAzRiA3OCA2RCovCgkJCQlicmVhazsKCQljYXNlIDB4NEM6IAoJCQkJaWYoYm9tWzFdID09IDB4NkYgJiYgYm9tWzJdID09IDB4QTcgJiYgYm9tWzNdID09IDB4OTQpIHsKCQkJCQllbmNvZGluZyA9IEVCQ0RJQzsKCQkJCQllbmNfYnl0ZXMgPSAxOwoJCQkJfS8qNEMgNkYgQTcgOTQqLwoJCQkJYnJlYWs7Cgl9Lypzd2l0Y2gqLwoJY29udi0+YXV0b2RldGVjdGVkID0gZW5jb2Rpbmc7Cgljb252LT5lbmNfYnl0ZXMgPSBlbmNfYnl0ZXM7Cgljb252LT5oYXNfYm9tID0gaGFzX2JvbTsKfQoKc3RhdGljIHVuc2lnbmVkIGNoYXIqIG5vcm1hbGl6ZV9lbmNvZGluZyhjb25zdCB1bnNpZ25lZCBjaGFyKiBlbmMpCnsKCXVuc2lnbmVkIGNoYXIqIG5vcm07IAoJc2l6ZV90IGk7Cgljb25zdCBzaXplX3QgbGVuID0gc3RybGVuKChjb25zdCBjaGFyKillbmMpOwoJbm9ybSA9IGNsaV9tYWxsb2MoIGxlbisxKTsKCWlmKCFub3JtKQoJCXJldHVybiBOVUxMOwoJaWYoZW5jID09IE9USEVSKQoJCWVuYyA9IChjb25zdCB1bnNpZ25lZCBjaGFyKikiSVNPLTg4NTktMSI7Cglmb3IoaT0wO2kgPCBzdHJsZW4oKGNvbnN0IGNoYXIqKWVuYyk7IGkrKykKCQlub3JtW2ldID0gdG91cHBlcihlbmNbaV0pOwoJbm9ybVtsZW5dPSdcMCc7CglyZXR1cm4gbm9ybTsKfQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuY29kaW5nX25hbWUodW5zaWduZWQgY2hhciogZW5jb2RpbmcpCnsKCWlmKCFlbmNvZGluZykKCQlyZXR1cm4gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKSJJU08tODg1OS0xIjsKCWVsc2UKCQlyZXR1cm4gZW5jb2Rpbmc7Cn0KCnZvaWQgcHJvY2Vzc19lbmNvZGluZ19zZXQoc3RydWN0IGVudGl0eV9jb252KiBjb252LGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuY29kaW5nLGVudW0gZW5jb2RpbmdfcHJpb3JpdHkgcHJpbykKewoJdW5zaWduZWQgY2hhciAqdG1wX2VuY29kaW5nOwoJZW51bSBlbmNvZGluZ3MgdG1wOwoJc2l6ZV90IG5ld19zaXplLG9sZF9zaXplOwoKCWNsaV9kYmdtc2coIlNldHRpbmcgZW5jb2RpbmcgZm9yICVwICB0byAlcywgcHJpb3JpdHk6ICVkXG4iLCh2b2lkKiljb252LCBlbmNvZGluZywgcHJpbyk7CglpZihlbmNvZGluZyA9PSBPVEhFUikKCQlyZXR1cm47CglpZihjb252LT5wcmlvcml0eSA9PSBDT05URU5UX1RZUEUpCgkJcmV0dXJuOy8qIENvbnRlbnQtdHlwZSBpbiBoZWFkZXIgaXMgaGlnaGVzdCBwcmlvcml0eSwgbm8gb3ZlcnJpZGVzIHBvc3NpYmxlKi8KCWlmKGNvbnYtPnByaW9yaXR5ID09ICBCT00gJiYgcHJpbyA9PSBOT0JPTV9BVVRPREVURUNUKQoJCXJldHVybjsKCgl0bXBfZW5jb2RpbmcgPSBub3JtYWxpemVfZW5jb2RpbmcoZW5jb2RpbmcpOy8qIEZJWE1FOiBiZXR0ZXIgb2JleSBwcmlvcml0aWVzKi8KCWlmKHByaW8gPT0gTUVUQSkgewoJb2xkX3NpemUgPSBlbmNvZGluZ19ieXRlcyhjb252LT5lbmNvZGluZywmdG1wKTsKCW5ld19zaXplID0gZW5jb2RpbmdfYnl0ZXModG1wX2VuY29kaW5nLCZ0bXApOwoJaWYob2xkX3NpemUgIT0gbmV3X3NpemUpICB7CgkJLyogb24geDg2IGdjYyB3YW50cyAldSBmb3Igc2l6ZV90LCBvbiB4ODZfNjQgaXQgd2FudHMgJWx1IGZvciBzaXplX3QuIFNvIGp1c3QgY2FzdCB0byB1bnNpZ25lZCBsb25nIHRvIG1ha2Ugd2FybmluZ3MgZ28gYXdheS4gKi8KCQljbGlfZGJnbXNnKCJwcm9jZXNzX2VuY29kaW5nX3NldDogcmVmdXNpbmcgdG8gb3ZlcnJpZGUgZW5jb2RpbmcgLSBuZXcgZW5jb2Rpbmcgc2l6ZSBkaWZmZXJzOiAlcyglbHUpICE9ICVzKCVsdSlcbiIsY29udi0+ZW5jb2RpbmcsKHVuc2lnbmVkIGxvbmcpb2xkX3NpemUsdG1wX2VuY29kaW5nLCh1bnNpZ25lZCBsb25nKW5ld19zaXplKTsKCQlmcmVlKHRtcF9lbmNvZGluZyk7CgkJcmV0dXJuOwoJfQoJfQoJZnJlZShjb252LT5lbmNvZGluZyk7Cgljb252LT5lbmNvZGluZyA9IHRtcF9lbmNvZGluZzsKCWNsaV9kYmdtc2coIk5ldyBlbmNvZGluZyBmb3IgJXA6JXNcbiIsKHZvaWQqKWNvbnYsY29udi0+ZW5jb2RpbmcpOwoJLyogcmVzZXQgc3RyZWFtICovCn0KCnN0YXRpYyBpbnQgZW5jb2Rpbmdfbm9ybV9kb25lKHN0cnVjdCBlbnRpdHlfY29udiogY29udikKewoJaWYoY29udi0+ZW5jb2RpbmcpIHsKCQlmcmVlKGNvbnYtPmVuY29kaW5nKTsKCQljb252LT5lbmNvZGluZyA9IE5VTEw7Cgl9Cgljb252LT5idWZmZXJfc2l6ZSA9IDA7CglpZihjb252LT50bXBfYXJlYS5idWZmZXIpIHsKCQlmcmVlKGNvbnYtPnRtcF9hcmVhLmJ1ZmZlcik7CgkJY29udi0+dG1wX2FyZWEuYnVmZmVyID0gTlVMTDsKCX0KCWlmKGNvbnYtPm91dF9hcmVhLmJ1ZmZlcikgewoJCWZyZWUoY29udi0+b3V0X2FyZWEuYnVmZmVyKTsKCQljb252LT5vdXRfYXJlYS5idWZmZXIgPSBOVUxMOwoJfQoJaWYoY29udi0+bm9ybV9hcmVhLmJ1ZmZlcikgewoJCWZyZWUoY29udi0+bm9ybV9hcmVhLmJ1ZmZlcik7CgkJY29udi0+bm9ybV9hcmVhLmJ1ZmZlciA9IE5VTEw7Cgl9CglyZXR1cm4gMDsKfQoKaW50IGVudGl0eV9ub3JtX2RvbmUoc3RydWN0IGVudGl0eV9jb252KiBjb252KQp7CglyZXR1cm4gZW5jb2Rpbmdfbm9ybV9kb25lKGNvbnYpOwp9CgpzdGF0aWMgc2l6ZV90IHJlYWRfcmF3KEZJTEUgKnN0cmVhbSwgbV9hcmVhX3QgKm1fYXJlYSwgaW50IG1heF9sZW4sIHVuc2lnbmVkIGNoYXIqIG91dGJ1ZmYpCnsKCgkvKiBUcnkgYW5kIHVzZSB0aGUgbWVtb3J5IGJ1ZmZlciBmaXJzdCAqLwoJaWYgKG1fYXJlYSkgewoJCXNpemVfdCBhcmVhX21heGNvcHk7CgkJY29uc3QgdW5zaWduZWQgY2hhciogc3JjOwoJCXNpemVfdCBjb3BpZWQ7CgkJaWYobV9hcmVhLT5vZmZzZXQgPj0gbV9hcmVhLT5sZW5ndGgpCgkJCXJldHVybiAwOwoJCWFyZWFfbWF4Y29weSA9IChtX2FyZWEtPmxlbmd0aCA+IG1fYXJlYS0+b2Zmc2V0ICsgbWF4X2xlbikgPyBtYXhfbGVuIDogbV9hcmVhLT5sZW5ndGggLSBtX2FyZWEtPm9mZnNldDsKCQlzcmMgPSBtX2FyZWEtPmJ1ZmZlciArIG1fYXJlYS0+b2Zmc2V0OwoJCW1fYXJlYS0+b2Zmc2V0ICs9IGFyZWFfbWF4Y29weTsKCQljb3BpZWQgPSBhcmVhX21heGNvcHk7CgkJd2hpbGUoYXJlYV9tYXhjb3B5ICYmICpzcmMgIT0gJ1xuJykgewoJCQkqb3V0YnVmZisrID0gKnNyYysrOwoJCQlhcmVhX21heGNvcHktLTsKCQl9CgkJaWYoYXJlYV9tYXhjb3B5ID4gMykgewoJCQkvKmNvcHkgMyBtb3JlIGJ5dGVzLCBqdXN0IGluIGNhc2UgaXRzIHVjczQgKi8KCQkJKm91dGJ1ZmYrKyA9ICpzcmMrKzsKCQkJKm91dGJ1ZmYrKyA9ICpzcmMrKzsKCQkJKm91dGJ1ZmYrKyA9ICpzcmMrKzsKCQkJYXJlYV9tYXhjb3B5IC09IDM7CgkJfQoJCW1fYXJlYS0+b2Zmc2V0IC09IGFyZWFfbWF4Y29weTsKCQljb3BpZWQgLT0gYXJlYV9tYXhjb3B5OwoJCXJldHVybiBjb3BpZWQ7Cgl9IGVsc2UgewoJCWlmICghc3RyZWFtKSB7CgkJCWNsaV9kYmdtc2coIk5vIEhUTUwgc3RyZWFtXG4iKTsKCQkJcmV0dXJuIDA7CgkJfQoJCWVsc2UgewoJCQljb25zdCBzaXplX3QgaXJlYWQgPSBmcmVhZChvdXRidWZmLCAxLCBtYXhfbGVuLCBzdHJlYW0pOwoJCQlzaXplX3QgaTsKCQkJaWYoZmVycm9yKHN0cmVhbSkpIHsKCQkJCWNsaV9lcnJtc2coIkVycm9yIHdoaWxlIHJlYWRpbmcgSFRNTCBzdHJlYW1cbiIpOwoJCQl9CgkJCWZvcihpPTA7IGkgPCBpcmVhZDsgaSsrKQoJCQkJaWYob3V0YnVmZltpXSA9PSAnXG4nKSB7CgkJCQkJcmV0dXJuIGkrMyA+IGlyZWFkID8gIGlyZWFkIDogaSszOwoJCQkJfQoJCQlyZXR1cm4gaXJlYWQ7CgkJfQoJfQp9CgpzdGF0aWMgdm9pZCBvdXRwdXRfZmlyc3Qoc3RydWN0IGVudGl0eV9jb252KiBjb252LHVuc2lnbmVkIGNoYXIqKiBvdXQsIHVuc2lnbmVkIGNoYXIqKiBpbixzaXplX3QqIGlubGVmdCkKewoJaWYoY29udi0+aGFzX2JvbSkgewoJCXN3aXRjaChjb252LT5lbmNfYnl0ZXMpIHsKCQkJY2FzZSAxOgoJCQkJaWYoY29udi0+YXV0b2RldGVjdGVkID09IFVURjgpIHsKCQkJCQkqaW4gKz0gMzsKCQkJCQkqaW5sZWZ0IC09IDM7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJKmluICs9IDI7CgkJCQkqaW5sZWZ0IC09IDI7CgkJCQlicmVhazsKCQkJY2FzZSA0OgoJCQkJKmluICs9IDQ7CgkJCQkqaW5sZWZ0IC09IDQ7CgkJCQlicmVhazsKCQl9Cgl9Cn0KCi8qIHNhcmdlIGxlYWtzIG9uIGljb252X29wZW4vaWNvbnZfY2xvc2UsIHNvIGxldHMgbm90IG9wZW4vY2xvc2Ugc28gbWFueSB0aW1lcywKICoganVzdCBrZWVwIG9uIGVhY2ggdGhyZWFkIGl0cyBvd24gcG9vbCBvZiBpY29udnMqLwoKc3RydWN0IGljb252X2NhY2hlIHsKCWljb252X3QqIHRhYjsKCXNpemVfdCAgICAgbGVuOwoJc2l6ZV90ICAgbGFzdDsKCXN0cnVjdCAgIGhhc2h0YWJsZSBoYXNodGFiOwp9OwoKc3RhdGljIHZvaWQgaWNvbnZfY2FjaGVfaW5pdChzdHJ1Y3QgaWNvbnZfY2FjaGUqIGNhY2hlKQp7Ci8qCWNhY2hlLT50YWIgPSBOVUxMOwoJY2FjaGUtPmxlbiA9IDA7CgljYWNoZS0+dXNlZCA9IDA7IC0gYWxyZWFkeSBkb25lIGJ5IG1lbXNldCovCgljbGlfZGJnbXNnKCJJbml0aWFsaXppbmcgaWNvbnYgcG9vbDolcFxuIiwodm9pZCopY2FjaGUpOwoJaGFzaHRhYl9pbml0KCZjYWNoZS0+aGFzaHRhYiwgMzIpOwp9CgpzdGF0aWMgdm9pZCBpY29udl9jYWNoZV9kZXN0cm95KHN0cnVjdCBpY29udl9jYWNoZSogY2FjaGUpCnsKCXNpemVfdCBpOwoJY2xpX2RiZ21zZygiRGVzdHJveWluZyBpY29udiBwb29sOiVwXG4iLCh2b2lkKiljYWNoZSk7Cglmb3IoaT0wO2kgPCBjYWNoZS0+bGFzdDtpKyspIHsKCQljbGlfZGJnbXNnKCJjbG9zaW5nIGljb252OiVwXG4iLGNhY2hlLT50YWJbaV0pOwoJCWljb252X2Nsb3NlKGNhY2hlLT50YWJbaV0pOwoJfQoJaGFzaHRhYl9jbGVhcigmY2FjaGUtPmhhc2h0YWIpOwoJZnJlZShjYWNoZS0+aGFzaHRhYi5odGFibGUpOwoJZnJlZShjYWNoZS0+dGFiKTsKCWZyZWUoY2FjaGUpOwp9CgoKI2lmZGVmIENMX1RIUkVBRF9TQUZFCnN0YXRpYyBwdGhyZWFkX2tleV90IGljb252X3Bvb2xfdGxzX2tleTsKc3RhdGljIHB0aHJlYWRfb25jZV90IGljb252X3Bvb2xfdGxzX2tleV9vbmNlID0gUFRIUkVBRF9PTkNFX0lOSVQ7CgovKiBkZXN0cnVjdG9yIGNhbGxlZCBmb3IgYWxsIHRocmVhZHMgdGhhdCBleGl0IHZpYSBwdGhyZWFkX2V4aXQsIG9yIGNhbmNlbGxhdGlvbi4gVW5mb3J0dW5hdGVseSB0aGF0IGRvZXNuJ3QgaW5jbHVkZQogKiB0aGUgbWFpbiB0aHJlYWQsIHNvIHdlIGhhdmUgdG8gY2FsbCB0aGlzIG1hbnVhbGx5IGZvciB0aGUgbWFpbiB0aHJlYWQuKi8KCnN0YXRpYyBpbnQgY2FjaGVfYXRleGl0X3JlZ2lzdGVyZWQgPSAwOwoKc3RhdGljIHZvaWQgaWNvbnZfcG9vbF90bHNfaW5zdGFuY2VfZGVzdHJveSh2b2lkKiBwdHIpCnsKCWlmKHB0cikgewoJCWljb252X2NhY2hlX2Rlc3Ryb3kocHRyKTsKCX0KfQoKc3RhdGljIHZvaWQgaWNvbnZfY2FjaGVfY2xlYW51cF9tYWluKHZvaWQpCnsKCXN0cnVjdCBpY29udl9jYWNoZSogY2FjaGUgPSBwdGhyZWFkX2dldHNwZWNpZmljKGljb252X3Bvb2xfdGxzX2tleSk7CglpZihjYWNoZSkgewoJCWljb252X3Bvb2xfdGxzX2luc3RhbmNlX2Rlc3Ryb3koY2FjaGUpOwoJCXB0aHJlYWRfc2V0c3BlY2lmaWMoaWNvbnZfcG9vbF90bHNfa2V5LE5VTEwpOwoJfQoJcHRocmVhZF9rZXlfZGVsZXRlKGljb252X3Bvb2xfdGxzX2tleSk7Cn0KCnN0YXRpYyB2b2lkIGljb252X3Bvb2xfdGxzX2tleV9hbGxvYyh2b2lkKQp7CglwdGhyZWFkX2tleV9jcmVhdGUoJmljb252X3Bvb2xfdGxzX2tleSwgaWNvbnZfcG9vbF90bHNfaW5zdGFuY2VfZGVzdHJveSk7CglpZighY2FjaGVfYXRleGl0X3JlZ2lzdGVyZWQpIHsKCQljbGlfZGJnbXNnKCJpY29udjpyZWdpc3RlcmluZyBhdGV4aXRcbiIpOwoJCWlmKGF0ZXhpdChpY29udl9jYWNoZV9jbGVhbnVwX21haW4pKSB7CgkJCWNsaV9kYmdtc2coImZhaWxlZCB0byByZWdpc3RlciBhdGV4aXRcbiIpOwoJCX0KCQljYWNoZV9hdGV4aXRfcmVnaXN0ZXJlZCA9IDE7Cgl9Cn0KCnN0YXRpYyB2b2lkIGluaXRfaWNvbnZfcG9vbF9pZm5lZWRlZCh2b2lkKQp7CglwdGhyZWFkX29uY2UoJmljb252X3Bvb2xfdGxzX2tleV9vbmNlLCBpY29udl9wb29sX3Rsc19rZXlfYWxsb2MpOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBpY29udl9jYWNoZSogY2FjaGVfZ2V0X3Rsc19pbnN0YW5jZSh2b2lkKQp7CglzdHJ1Y3QgaWNvbnZfY2FjaGUqIGNhY2hlID0gcHRocmVhZF9nZXRzcGVjaWZpYyhpY29udl9wb29sX3Rsc19rZXkpOwoJaWYoIWNhY2hlKSB7CgkJY2FjaGUgPSBjbGlfY2FsbG9jKDEsc2l6ZW9mKCpjYWNoZSkpOwoJCWlmKCFjYWNoZSkgewoJCQljbGlfZGJnbXNnKCIhT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIFRMUyBpY29udiBpbnN0YW5jZVxuIik7CgkJCXJldHVybiBOVUxMOwoJCX0KCQlpY29udl9jYWNoZV9pbml0KGNhY2hlKTsKCQlwdGhyZWFkX3NldHNwZWNpZmljKGljb252X3Bvb2xfdGxzX2tleSwgY2FjaGUpOwoJfQoJcmV0dXJuIGNhY2hlOwp9CgojZWxzZQoKc3RhdGljIHN0cnVjdCBpY29udl9jYWNoZSogZ2xvYmFsX2ljb252X2NhY2hlID0gTlVMTDsKc3RhdGljIGludCAgICBpY29udl9nbG9iYWxfaW5pdGVkID0gMDsKCgpzdGF0aWMgdm9pZCBpY29udl9jYWNoZV9jbGVhbnVwX21haW4odm9pZCkKewoJaWNvbnZfY2FjaGVfZGVzdHJveShnbG9iYWxfaWNvbnZfY2FjaGUpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgaW5pdF9pY29udl9wb29sX2lmbmVlZGVkKCkgCnsKCWlmKCFpY29udl9nbG9iYWxfaW5pdGVkKSB7CgkJZ2xvYmFsX2ljb252X2NhY2hlID0gY2xpX2NhbGxvYygxLHNpemVvZigqZ2xvYmFsX2ljb252X2NhY2hlKSk7CgkJaWYoZ2xvYmFsX2ljb252X2NhY2hlKSB7CgkJCWljb252X2NhY2hlX2luaXQoZ2xvYmFsX2ljb252X2NhY2hlKTsKCQkJYXRleGl0KGljb252X2NhY2hlX2NsZWFudXBfbWFpbik7CgkJCWljb252X2dsb2JhbF9pbml0ZWQgPSAxOwoJCX0KCX0KfQoKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGljb252X2NhY2hlKiBjYWNoZV9nZXRfdGxzX2luc3RhbmNlKHZvaWQpCnsKCXJldHVybiBnbG9iYWxfaWNvbnZfY2FjaGU7Cn0KCiNlbmRpZgoKc3RhdGljIGljb252X3QgaWNvbnZfb3Blbl9jYWNoZWQoY29uc3QgdW5zaWduZWQgY2hhciogZnJvbWNvZGUpCnsKCXN0cnVjdCBpY29udl9jYWNoZSAqIGNhY2hlOwoJc2l6ZV90IGlkeDsKCWNvbnN0IHNpemVfdCBmcm9tY29kZV9sZW4gPSBzdHJsZW4oKGNvbnN0IGNoYXIqKWZyb21jb2RlKTsKCXN0cnVjdCBlbGVtZW50ICogZTsKCWljb252X3QgIGljb252X3N0cnVjdDsKCglpbml0X2ljb252X3Bvb2xfaWZuZWVkZWQoKTsKCWNhY2hlID0gY2FjaGVfZ2V0X3Rsc19pbnN0YW5jZSgpOy8qIGdldHMgVExTIGljb252IHBvb2wgKi8KCWlmKCFjYWNoZSkgewoJCWNsaV9kYmdtc2coIiFVbmFibGUgdG8gZ2V0IFRMUyBpY29udiBjYWNoZSFcbiIpOwoJCWVycm5vID0gRUlOVkFMOwoJCXJldHVybiAoaWNvbnZfdCktMTsKCX0KCgllID0gaGFzaHRhYl9maW5kKCZjYWNoZS0+aGFzaHRhYiwgZnJvbWNvZGUsIGZyb21jb2RlX2xlbik7CglpZihlICYmIChlLT5kYXRhIDwgMCB8fCAoc2l6ZV90KWUtPmRhdGEgPiBjYWNoZS0+bGVuKSkgewoJCWUgPSBOVUxMOwoJfQoJaWYoZSkgewoJCXJldHVybiBjYWNoZS0+dGFiW2UtPmRhdGFdOwoJfQoJY2xpX2RiZ21zZygiaWNvbnYgbm90IGZvdW5kIGluIGNhY2hlLCBmb3IgZW5jb2Rpbmc6JXNcbiIsZnJvbWNvZGUpOwoJaWNvbnZfc3RydWN0ID0gaWNvbnZfb3BlbigiVVRGLTE2QkUiLChjb25zdCBjaGFyKilmcm9tY29kZSk7CglpZihpY29udl9zdHJ1Y3QgIT0gKGljb252X3QpLTEpIHsKCWlkeCA9IGNhY2hlLT5sYXN0Kys7CglpZihpZHggPj0gY2FjaGUtPmxlbikgewoJCWNhY2hlLT5sZW4gKz0gMTY7CgkJY2FjaGUtPnRhYiA9IGNsaV9yZWFsbG9jMihjYWNoZS0+dGFiLCBjYWNoZS0+bGVuKnNpemVvZihjYWNoZS0+dGFiWzBdKSk7CgkJaWYoIWNhY2hlLT50YWIpIHsKCQkJY2xpX2RiZ21zZygiIU91dCBvZiBtZW0gaW4gaWNvbnYtcG9vbFxuIik7CgkJCWVycm5vID0gRU5PTUVNOwoJCQlyZXR1cm4gKGljb252X3QpLTE7CgkJfQoJfQoKCWhhc2h0YWJfaW5zZXJ0KCZjYWNoZS0+aGFzaHRhYiwgZnJvbWNvZGUsIGZyb21jb2RlX2xlbiwgaWR4KTsKCQljYWNoZS0+dGFiW2lkeF0gPSBpY29udl9zdHJ1Y3Q7CgljbGlfZGJnbXNnKCJpY29udl9vcGVuKCksZm9yOiVzIC0+ICVwXG4iLGZyb21jb2RlLCh2b2lkKiljYWNoZS0+dGFiW2lkeF0pOwoJcmV0dXJuIGNhY2hlLT50YWJbaWR4XTsKfQoJcmV0dXJuIChpY29udl90KS0xOwp9CgoKLyogdG1wX21fYXJlYSBhbmQgY29udi0+b3V0X2FyZWEgYXJlIG9mIHNpemUgbWF4bGVuICovCnVuc2lnbmVkIGNoYXIqIGVuY29kaW5nX25vcm1fcmVhZGxpbmUoc3RydWN0IGVudGl0eV9jb252KiBjb252LCBGSUxFKiBzdHJlYW1faW4sIG1fYXJlYV90KiBpbl9tX2FyZWEsIGNvbnN0IHNpemVfdCBtYXhsZW4pCnsKCWlmKCFjb252IHx8ICFjb252LT5vdXRfYXJlYS5idWZmZXIgfHwgIWNvbnYtPnRtcF9hcmVhLmJ1ZmZlciB8fCBtYXhsZW48MiApCgkJcmV0dXJuIE5VTEw7CgllbHNlIHsKCQkvKiBzdHJlYW1faW58aW5fbV9hcmVhIC0+KHJlYWRfcmF3KSBjb252LT50bXBfYXJlYSAtPiAoaWNvbnYpIGNvbnYtPm91dF9hcmVhIC0+IChub3JtYWxpemUpIGNvbnYtPm5vcm1fYXJlYSAtPiAoY2xpX3JlYWRsaW5lKSByZXR1cm4gdmFsdWUqLwoJCWNvbnN0IHNpemVfdCB0bXBfbW92ZSA9IGNvbnYtPnRtcF9hcmVhLmxlbmd0aCAtIGNvbnYtPnRtcF9hcmVhLm9mZnNldDsKCQljb25zdCBzaXplX3QgdG1wX2F2YWlsYWJsZSA9IGNvbnYtPmJ1ZmZlcl9zaXplIC0gdG1wX21vdmU7CgkJY29uc3Qgc2l6ZV90IG1heF9yZWFkID0gbWF4bGVuIDwgdG1wX2F2YWlsYWJsZSA/IG1heGxlbiA6IHRtcF9hdmFpbGFibGU7CgkJdW5zaWduZWQgY2hhciogdG1wYnVmZiA9ICZjb252LT50bXBfYXJlYS5idWZmZXJbdG1wX21vdmVdOwoJCgkJY29uc3Qgc2l6ZV90IG91dF9tb3ZlID0gY29udi0+b3V0X2FyZWEubGVuZ3RoIDwgY29udi0+b3V0X2FyZWEub2Zmc2V0ID8gMCA6IGNvbnYtPm91dF9hcmVhLmxlbmd0aCAtIGNvbnYtPm91dF9hcmVhLm9mZnNldDsKCQlzaXplX3Qgb3V0bGVmdCA9IGNvbnYtPmJ1ZmZlcl9zaXplIC0gb3V0X21vdmU7CgkJdW5zaWduZWQgY2hhciogb3V0ID0gJmNvbnYtPm91dF9hcmVhLmJ1ZmZlcltvdXRfbW92ZV07CgoJCWNvbnN0IHNpemVfdCBub3JtX21vdmUgPSBjb252LT5ub3JtX2FyZWEubGVuZ3RoIC0gY29udi0+bm9ybV9hcmVhLm9mZnNldDsKCgkJdW5zaWduZWQgY2hhciogbm9ybTsKCQljb25zdCB1bnNpZ25lZCBjaGFyKiBub3JtX2VuZDsKCQlpY29udl90IGljb252X3N0cnVjdDsKCgkJc2l6ZV90IHJjLCBpbmxlZnQ7CgkJc3NpemVfdCBpOwoKCQlzaWduZWQgY2hhciBhbGlnbmZpeDsKCgkJLyogbW92ZSB3aGF0ZXZlciBsZWZ0IGluIGNvbnYtPnRtcF9hcmVhIHRvIGJlZ2lubmluZyAqLwoJCWlmKHRtcF9tb3ZlKQoJCQltZW1tb3ZlKGNvbnYtPnRtcF9hcmVhLmJ1ZmZlciwgY29udi0+dG1wX2FyZWEuYnVmZmVyICsgY29udi0+dG1wX2FyZWEub2Zmc2V0LCB0bXBfbW92ZSk7CgkJY29udi0+dG1wX2FyZWEub2Zmc2V0ID0gMDsKCgkJLyogcmVhZCByYXcgZGF0YSBmcm9tIHN0cmVhbSwgb3IgaW5fbV9hcmVhIGludG8gY29udi0+dG1wX2FyZWEqLwoJCWNvbnYtPnRtcF9hcmVhLmxlbmd0aCA9IHRtcF9tb3ZlICsgcmVhZF9yYXcoc3RyZWFtX2luLCBpbl9tX2FyZWEsIG1heF9yZWFkLCB0bXBidWZmKTsKCgkJLyogbW92ZSB3aGF0ZXZlciBsZWZ0IGluIGNvbnYtPm91dF9hcmVhIHRvIGJlZ2lubmluZyAqLwoJCWlmKG91dF9tb3ZlKQoJCQltZW1tb3ZlKGNvbnYtPm91dF9hcmVhLmJ1ZmZlciwgY29udi0+b3V0X2FyZWEuYnVmZmVyICsgY29udi0+b3V0X2FyZWEub2Zmc2V0LCBvdXRfbW92ZSk7CgkJY29udi0+b3V0X2FyZWEub2Zmc2V0ID0gMDsKCgkJdG1wYnVmZiA9IGNvbnYtPnRtcF9hcmVhLmJ1ZmZlcjsKCQlpbmxlZnQgPSBjb252LT50bXBfYXJlYS5sZW5ndGg7CgkJaWYoIWNvbnYtPmJvbV9jbnQgJiYgY29udi0+dG1wX2FyZWEubGVuZ3RoID49IDQpIHsvKiBkZXRlY3QgQnl0ZSBPcmRlciBNYXJrICovCgkJCW1lbWNweSggY29udi0+Ym9tLCB0bXBidWZmLCA0KTsKCQkJcHJvY2Vzc19ib20oY29udik7CgkJCXByb2Nlc3NfZW5jb2Rpbmdfc2V0KGNvbnYsY29udi0+YXV0b2RldGVjdGVkLGNvbnYtPmhhc19ib20gPyBCT00gOiBOT0JPTV9BVVRPREVURUNUKTsKCQkJb3V0cHV0X2ZpcnN0KGNvbnYsJm91dCwmdG1wYnVmZiwmaW5sZWZ0KTsKCQkJY29udi0+Ym9tX2NudCsrOwoJCX0KCgkJLyogY29udmVydCBlbmNvZGluZyBjb252LT50bXBfYXJlYS4gY29udi0+b3V0X2FyZWEgKi8KCQlhbGlnbmZpeCA9IGlubGVmdCU0Oy8qIGljb252IGdpdmVzIGFuIGVycm9yIGlmIHdlIGdpdmUgaGltIDMgYnl0ZXMgdG8gY29udmVydCwgCgkJCQkgICAgICAgYW5kIHdlIGFyZSB1c2luZyB1Y3M0LCBkaXR0byBmb3IgdXRmMTYsIGFuZCAxIGJ5dGUqLwoJCWlubGVmdCAtPSBhbGlnbmZpeDsKCgkJaWYoIWlubGVmdCAmJiBhbGlnbmZpeCkgewoJCQlzaXplX3QgazsKCQkJZm9yKGs9MDtrK2FsaWduZml4IDwgNDtrKyspCgkJCQl0bXBidWZmW2FsaWduZml4K2tdID0gJ1wwJzsKCQkJaW5sZWZ0ID0gNDsKCQkJYWxpZ25maXggPSAtaW5sZWZ0OwoJCX0KCgkJaWNvbnZfc3RydWN0ID0gaWNvbnZfb3Blbl9jYWNoZWQoZW5jb2RpbmdfbmFtZShjb252LT5lbmNvZGluZykpOwoKCQlpZihpY29udl9zdHJ1Y3QgPT0gKGljb252X3QpLTEpIHsKCQkJY2xpX2RiZ21zZygiSWNvbnYgaW5pdCBwcm9ibGVtIGZvciBlbmNvZGluZzolcywgZmFsbGluZyBiYWNrIHRvIGlzbyBlbmNvZGluZyFcbiIsZW5jb2RpbmdfbmFtZShjb252LT5lbmNvZGluZykpOwoJCQkvKiBtZXNzYWdlIHNob3duIG9ubHkgb25jZS9maWxlICovCgkJCS8qIHdoYXQgY2FuIHdlIGRvPyBqdXN0IGZhbGwgYmFjayBmb3IgaXQgYmVpbmcgYW4gSVNPLTg4NTktMSAqLwoJCSAgICAgICAgZnJlZShjb252LT5lbmNvZGluZyk7CgkJCWNvbnYtPmVuY29kaW5nID0gKHVuc2lnbmVkIGNoYXIqKSBjbGlfc3RyZHVwKCJJU08tODg1OS0xIik7CgkJCWljb252X3N0cnVjdCA9IGljb252X29wZW5fY2FjaGVkKGNvbnYtPmVuY29kaW5nKTsKCQkJaWYoaWNvbnZfc3RydWN0ID09IChpY29udl90KS0xKSB7CgkJCQljbGlfZGJnbXNnKCJmYWxsYmFjayBmYWlsZWQuLi4gYmFpbCBvdXRcbiIpOwoJCQkJcmV0dXJuIGNsaV9yZWFkbGluZShOVUxMLCZjb252LT50bXBfYXJlYSxtYXhsZW4pOwoJCQl9CgkJfQoKCQlpZihpbmxlZnQgJiYgb3V0bGVmdCA+IGNvbnYtPmJ1ZmZlcl9zaXplLzIgKSAvKiBpY29udiBkb2Vzbid0IGxpa2UgaW5sZWZ0IHRvIGJlIDAgKi8gewoJCQlyYyA9IGljb252KGljb252X3N0cnVjdCwgKGNoYXIqKikgJnRtcGJ1ZmYsICAmaW5sZWZ0LCAoY2hhcioqKSAmb3V0LCAmb3V0bGVmdCk7CQoJCX0KCQllbHNlCgkJCXJjID0gMDsKCiNpZiAwCgkJIGljb252X2Nsb3NlKGljb252X3N0cnVjdCk7LyogLSBkb24ndCBjbG9zZSwgd2UgYXJlIHVzaW5nIGEgY2FjaGVkIGluc3RhbmNlICovCiNlbmRpZgoKCQlpZihyYz09KHNpemVfdCktMSAmJiBlcnJubyAhPSBFMkJJRykgewoJCQkJY2xpX2RiZ21zZygiaWNvbnYgZXJyb3I6JXMsIHNpbGVudGx5IHJlc3VtaW5nICglbGQsJWxkLCVsdSwlbHUpXG4iLHN0cmVycm9yKGVycm5vKSwobG9uZykob3V0LWNvbnYtPm91dF9hcmVhLmJ1ZmZlciksKGxvbmcpKHRtcGJ1ZmYtY29udi0+dG1wX2FyZWEuYnVmZmVyKSwodW5zaWduZWQgbG9uZylpbmxlZnQsKHVuc2lnbmVkIGxvbmcpb3V0bGVmdCk7CgkJCQkvKiBvdXRwdXQgcmF3IGJ5dGUsIGFuZCByZXN1bWUgYXQgbmV4dCBieXRlICovCgkJCQkqb3V0KysgPSAwOwoJCQkJKm91dCsrID0gKnRtcGJ1ZmYrKzsKCQkJCWlubGVmdC0tOwovKgkJCQlyZXR1cm4gY2xpX3JlYWRsaW5lKE5VTEwsICZjb252LT5ub3JtX2FyZWEsIG1heGxlbik7Ki8KCQl9CgoJCWNvbnYtPnRtcF9hcmVhLmxlbmd0aCA9IGlubGVmdCArIChhbGlnbmZpeCA+IDAgPyBhbGlnbmZpeCA6IDApOwoJCWNvbnYtPm91dF9hcmVhLmxlbmd0aCA9IG91dCAtIGNvbnYtPm91dF9hcmVhLmJ1ZmZlciAtIG91dF9tb3ZlOwoKCQljb252LT50bXBfYXJlYS5vZmZzZXQgPSB0bXBidWZmIC0gY29udi0+dG1wX2FyZWEuYnVmZmVyOwoJCWNvbnYtPnRtcF9hcmVhLmxlbmd0aCArPSBjb252LT50bXBfYXJlYS5vZmZzZXQ7CgoKCQkvKiBtb3ZlIHdoYXRldmVyIGxlZnQgaW4gY29udi0+bm9ybV9hcmVhIHRvIGJlZ2lubmluZyAqLwoJCWlmKG5vcm1fbW92ZSkgewoJCQlpZihub3JtX21vdmUgPCBjb252LT5idWZmZXJfc2l6ZS8yKSB7CgkJCW1lbW1vdmUoY29udi0+bm9ybV9hcmVhLmJ1ZmZlciwgY29udi0+bm9ybV9hcmVhLmJ1ZmZlciArIGNvbnYtPm5vcm1fYXJlYS5vZmZzZXQsIG5vcm1fbW92ZSk7CgkJY29udi0+bm9ybV9hcmVhLm9mZnNldCA9IDA7CgkJCQlub3JtID0gY29udi0+bm9ybV9hcmVhLmJ1ZmZlciArIG5vcm1fbW92ZTsKCQkJfQoJCQllbHNlIHsKCQkJCS8qIGRvbid0IG1vZGlmeSBvZmZzZXQgaGVyZSAqLwoJCQkJbm9ybSA9IGNvbnYtPm5vcm1fYXJlYS5idWZmZXIgKyBjb252LT5ub3JtX2FyZWEubGVuZ3RoOwoJCQl9CgkJfQoJCWVsc2UgewoJCQljb252LT5ub3JtX2FyZWEub2Zmc2V0ID0gMDsKCQkJbm9ybSA9IGNvbnYtPm5vcm1fYXJlYS5idWZmZXI7CQoJCX0KCgkJLyogbm93IGRvIHRoZSByZWFsIG5vcm1hbGl6YXRpb24gKi8KCQlvdXQgPSBjb252LT5vdXRfYXJlYS5idWZmZXI7Lyogc2tpcCBvdmVyIHV0ZjE2IGJvbSwgRklYTUU6IGNoZWNrIGlmIGljb252IHJlYWxseSBvdXRwdXR0ZWQgYSBCT00gKi8KCQlub3JtX2VuZCA9IGNvbnYtPm5vcm1fYXJlYS5idWZmZXIgKyBjb252LT5idWZmZXJfc2l6ZTsKCQlpZihjb252LT5vdXRfYXJlYS5sZW5ndGg+MCAmJiBvdXRbMF0gPT0gMHhGRiAmJiBvdXRbMV0gPT0gMHhGRSkKCQkJaSA9IDI7CgkJZWxzZQoJCQlpID0gMDsKCQlmb3IoOyBpIDwgY29udi0+b3V0X2FyZWEubGVuZ3RoOyBpICs9IDIpIHsKCQkJdWludDE2X3QgdTE2ID0gKCAoKHVpbnQxNl90KW91dFtpXSkgPDwgOCApIHwgb3V0W2krMV07CgkJCWlmKCF1MTYpIHsKCQkJCWlmKGFsaWduZml4ID49IDAgJiYgIWNvbnYtPm1zZ196ZXJvX3Nob3duKSAvKiBpZiBhbGlnbmZpeCBpcyBuZWdhdGl2ZSwgdGhpcyAwIGJ5dGUgaXMgb24tcHVycG9zZSwgaXRzIHBhZGRpbmcgKi8gewoJCQkJCWNvbnYtPm1zZ196ZXJvX3Nob3duID0gMTsKCQkJCQljbGlfZGJnbXNnKCJTa2lwcGluZyBudWxsIGNoYXJhY3RlciBpbiBodG1sIHN0cmVhbVxuIik7CgkJCX0KCQkJfQoJCQllbHNlIGlmKHUxNiA8IDB4ODApIHsKCQkJCWlmKG5vcm0gPj0gbm9ybV9lbmQpCgkJCQkJYnJlYWs7CgkJCQlpZigodW5zaWduZWQgY2hhcil1MTYgPT0wKQoJCQkJCWNsaV9kYmdtc2coIkltcG9zc2libGVcbiIpOwoJCQkJKm5vcm0rKyA9ICh1bnNpZ25lZCBjaGFyKXUxNjsKCQkJfQoJCQllbHNlIGlmICh1MTYgPT0gMTYwKSAgey8qbmJzcCovCgkJCQlpZihub3JtID49IG5vcm1fZW5kKQoJCQkJCWJyZWFrOwoJCQkJKm5vcm0rKyA9IDB4MjA7CgkJCX0KCQkJZWxzZSB7CgkJCQljaGFyIGJ1ZmZbMTBdOwoJCQkJaW50IGxlbjsKCgkJCQlzbnByaW50ZihidWZmLDksIiYjJWQ7Iix1MTYpOwoJCQkJYnVmZls5XSA9ICdcMCc7CgkJCQlsZW4gPSBzdHJsZW4oYnVmZik7CgkJCQlpZigobm9ybV9lbmQgLSBub3JtKSA8PSBsZW4pCgkJCQkJLyogcHJldmVudCBidWZmZXIgb3ZlcmZsb3cgKi8KCQkJCQlicmVhazsKCQkJCW1lbWNweSgoY2hhciopbm9ybSwgYnVmZiwgbGVuKTsKCQkJCW5vcm0gKz0gbGVuOwoJCQl9CQoJCX0KCQljb252LT5vdXRfYXJlYS5vZmZzZXQgPSBpOyAvKiBzbyB0aGF0IHdlIGNhbiByZXN1bWUgbmV4dCB0aW1lIGZyb20gaGVyZSAqLwoKCQljb252LT5ub3JtX2FyZWEubGVuZ3RoID0gbm9ybSAtIGNvbnYtPm5vcm1fYXJlYS5idWZmZXI7Ci8qCgkJY29udi0+bm9ybV9hcmVhLmJ1ZmZlcltjb252LT5idWZmZXJfc2l6ZS0xXT0wO0RPTlQgRE8gVEhJUwoJCWlmKCAobyA9c3Ryc3RyKGNvbnYtPm5vcm1fYXJlYS5idWZmZXIsIkNvbnRlbnQiKSkgJiYgc3Ryc3RyKGNvbnYtPm5vcm1fYXJlYS5idWZmZXIsInRleHQveC0iKSkKCQkJcHJpbnRmKCIlc1xuIixvKTsqLwoJCS8qIGZpbmFsIGNsaV9yZWFkbGluZSBmcm9tIGNvbnYtPm5vcm1fYXJlYSAqLwoJCXJldHVybiBjbGlfcmVhZGxpbmUoTlVMTCwgJmNvbnYtPm5vcm1fYXJlYSwgbWF4bGVuKTsKCX0KfQoK