LyoKICogIGxpbnV4L2RyaXZlcnMvaWRlL2xlZ2FjeS9xNDBpZGUuYyAtLSBRNDAgSS9PIHBvcnQgSURFIERyaXZlcgogKgogKiAgICAgKGMpIFJpY2hhcmQgWmlkbGlja3kKICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZSBmb3IKICogIG1vcmUgZGV0YWlscy4KICoKICoKICovCgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgojaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KCiNpbmNsdWRlIDxsaW51eC9pZGUuaD4KCiAgICAvKgogICAgICogIEJhc2VzIG9mIHRoZSBJREUgaW50ZXJmYWNlcwogICAgICovCgojZGVmaW5lIFE0MElERV9OVU1fSFdJRlMJMgoKI2RlZmluZSBQQ0lERV9CQVNFMQkweDFmMAojZGVmaW5lIFBDSURFX0JBU0UyCTB4MTcwCiNkZWZpbmUgUENJREVfQkFTRTMJMHgxZTgKI2RlZmluZSBQQ0lERV9CQVNFNAkweDE2OAojZGVmaW5lIFBDSURFX0JBU0U1CTB4MWUwCiNkZWZpbmUgUENJREVfQkFTRTYJMHgxNjAKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHBjaWRlX2Jhc2VzW1E0MElERV9OVU1fSFdJRlNdID0gewogICAgUENJREVfQkFTRTEsIFBDSURFX0JBU0UyLCAvKiBQQ0lERV9CQVNFMywgUENJREVfQkFTRTQgICwgUENJREVfQkFTRTUsCiAgICBQQ0lERV9CQVNFNiAqLwp9OwoKCiAgICAvKgogICAgICogIE9mZnNldHMgZnJvbSBvbmUgb2YgdGhlIGFib3ZlIGJhc2VzCiAgICAgKi8KCi8qIHVzZWQgdG8gZG8gYWRkciB0cmFuc2xhdGlvbiBoZXJlIGJ1dCBpdCBpcyBlYXNpZXIgdG8gZG8gaW4gc2V0dXAgcG9ydHMgKi8KLyojZGVmaW5lIElERV9PRkZfQih4KQkoKHVuc2lnbmVkIGxvbmcpUTQwX0lTQV9JT19CKChJREVfIyN4IyNfT0ZGU0VUKSkpKi8KCiNkZWZpbmUgSURFX09GRl9CKHgpCSgodW5zaWduZWQgbG9uZykoKElERV8jI3gjI19PRkZTRVQpKSkKI2RlZmluZSBJREVfT0ZGX1coeCkJKCh1bnNpZ25lZCBsb25nKSgoSURFXyMjeCMjX09GRlNFVCkpKQoKc3RhdGljIGNvbnN0IGludCBwY2lkZV9vZmZzZXRzW0lERV9OUl9QT1JUU10gPSB7CiAgICBJREVfT0ZGX1coREFUQSksIElERV9PRkZfQihFUlJPUiksIElERV9PRkZfQihOU0VDVE9SKSwgSURFX09GRl9CKFNFQ1RPUiksCiAgICBJREVfT0ZGX0IoTENZTCksIElERV9PRkZfQihIQ1lMKSwgNiAvKklERV9PRkZfQihDVVJSRU5UKSovLCBJREVfT0ZGX0IoU1RBVFVTKSwKICAgIDUxOC8qSURFX09GRihDTUQpKi8KfTsKCnN0YXRpYyBpbnQgcTQwaWRlX2RlZmF1bHRfaXJxKHVuc2lnbmVkIGxvbmcgYmFzZSkKewogICAgICAgICAgIHN3aXRjaCAoYmFzZSkgewoJICAgICAgICAgICAgY2FzZSAweDFmMDogcmV0dXJuIDE0OwoJCSAgICBjYXNlIDB4MTcwOiByZXR1cm4gMTU7CgkJICAgIGNhc2UgMHgxZTg6IHJldHVybiAxMTsKCQkgICAgZGVmYXVsdDoKCQkJcmV0dXJuIDA7CgkgICB9Cn0KCgovKgogKiBUaGlzIGlzIHZlcnkgc2ltaWxhciB0byBpZGVfc2V0dXBfcG9ydHMgZXhjZXB0IHRoYXQgYWRkcmVzc2VzCiAqIGFyZSBwcmV0cmFuc2xhdGVkIGZvciBxNDAgSVNBIGFjY2VzcwogKi8Kdm9pZCBxNDBfaWRlX3NldHVwX3BvcnRzICggaHdfcmVnc190ICpodywKCQkJdW5zaWduZWQgbG9uZyBiYXNlLCBpbnQgKm9mZnNldHMsCgkJCXVuc2lnbmVkIGxvbmcgY3RybCwgdW5zaWduZWQgbG9uZyBpbnRyLAoJCQlpZGVfYWNrX2ludHJfdCAqYWNrX2ludHIsCi8qCiAqCQkJaWRlX2lvX29wc190ICppb3BzLAogKi8KCQkJaW50IGlycSkKewoJaW50IGk7CgoJbWVtc2V0KGh3LCAwLCBzaXplb2YoaHdfcmVnc190KSk7Cglmb3IgKGkgPSAwOyBpIDwgSURFX05SX1BPUlRTOyBpKyspIHsKCQkvKiBCSUcgRkFUIFdBUk5JTkc6IAoJCSAgIGFzc3VtcHRpb246IG9ubHkgREFUQSBwb3J0IGlzIGV2ZXIgdXNlZCBpbiAxNiBiaXQgbW9kZSAqLwoJCWlmICggaT09MCApCgkJCWh3LT5pb19wb3J0c1tpXSA9IFE0MF9JU0FfSU9fVyhiYXNlICsgb2Zmc2V0c1tpXSk7CgkJZWxzZQoJCQlody0+aW9fcG9ydHNbaV0gPSBRNDBfSVNBX0lPX0IoYmFzZSArIG9mZnNldHNbaV0pOwoJfQoJCglody0+aXJxID0gaXJxOwoJaHctPmRtYSA9IE5PX0RNQTsKCWh3LT5hY2tfaW50ciA9IGFja19pbnRyOwovKgogKglody0+aW9wcyA9IGlvcHM7CiAqLwp9CgoKCi8qIAogKiB0aGUgc3RhdGljIGFycmF5IGlzIG5lZWRlZCB0byBoYXZlIHRoZSBuYW1lIHJlcG9ydGVkIGluIC9wcm9jL2lvcG9ydHMsCiAqIGh3aWYtPm5hbWUgdW5mb3J0dW5hdGVseSBpc260dCBhdmFpbGFibGUgeWV0CiAqLwpzdGF0aWMgY29uc3QgY2hhciAqcTQwX2lkZV9uYW1lc1tRNDBJREVfTlVNX0hXSUZTXT17CgkiaWRlMCIsICJpZGUxIgp9OwoKLyoKICogIFByb2JlIGZvciBRNDAgSURFIGludGVyZmFjZXMKICovCgp2b2lkIHE0MGlkZV9pbml0KHZvaWQpCnsKICAgIGludCBpOwogICAgaWRlX2h3aWZfdCAqaHdpZjsKICAgIGludCBpbmRleDsKICAgIGNvbnN0IGNoYXIgKm5hbWU7CgogICAgaWYgKCFNQUNIX0lTX1E0MCkKICAgICAgcmV0dXJuIDsKCiAgICBmb3IgKGkgPSAwOyBpIDwgUTQwSURFX05VTV9IV0lGUzsgaSsrKSB7Cglod19yZWdzX3QgaHc7CgoJbmFtZSA9IHE0MF9pZGVfbmFtZXNbaV07CglpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaWRlX2Jhc2VzW2ldLCA4LCBuYW1lKSkgewoJCXByaW50aygiY291bGQgbm90IHJlc2VydmUgcG9ydHMgJWx4LSVseCBmb3IgJXNcbiIsCgkJICAgICAgIHBjaWRlX2Jhc2VzW2ldLHBjaWRlX2Jhc2VzW2ldKzgsbmFtZSk7CgkJY29udGludWU7Cgl9CglpZiAoIXJlcXVlc3RfcmVnaW9uKHBjaWRlX2Jhc2VzW2ldKzB4MjA2LCAxLCBuYW1lKSkgewoJCXByaW50aygiY291bGQgbm90IHJlc2VydmUgcG9ydCAlbHggZm9yICVzXG4iLAoJCSAgICAgICBwY2lkZV9iYXNlc1tpXSsweDIwNixuYW1lKTsKCQlyZWxlYXNlX3JlZ2lvbihwY2lkZV9iYXNlc1tpXSwgOCk7CgkJY29udGludWU7Cgl9CglxNDBfaWRlX3NldHVwX3BvcnRzKCZodywodW5zaWduZWQgbG9uZykgcGNpZGVfYmFzZXNbaV0sIChpbnQgKilwY2lkZV9vZmZzZXRzLCAKCQkJcGNpZGVfYmFzZXNbaV0rMHgyMDYsIAoJCQkwLCBOVUxMLAovLwkJCW02OGtpZGVfaW9wcywKCQkJcTQwaWRlX2RlZmF1bHRfaXJxKHBjaWRlX2Jhc2VzW2ldKSk7CglpbmRleCA9IGlkZV9yZWdpc3Rlcl9odygmaHcsIDEsICZod2lmKTsKCS8vICoqRklYTUUqKgoJaWYgKGluZGV4ICE9IC0xKQoJCWh3aWYtPm1taW8gPSAxOwogICAgfQp9Cgo=