LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KI2luY2x1ZGUgPGFzbS9yZWFsbW9kZS5oPgoKCiNkZWZpbmUgUkVBTE1PREVfQkFTRSAgICAoKGNoYXIqKTB4N2MwKQojZGVmaW5lIFJFQUxNT0RFX01BSUxCT1ggKChjaGFyKikweGUwMCkKCgpleHRlcm4gY2hhciByZWFsbW9kZV9lbnRlcjsKCmludCByZWFsbW9kZV9zZXR1cCh2b2lkKQp7CgkvKiBjb3B5IHRoZSByZWFsbW9kZSBzd2l0Y2ggY29kZSAqLwoJaWYgKGkzODZib290X3JlYWxtb2RlX3NpemUgPiAoUkVBTE1PREVfTUFJTEJPWC1SRUFMTU9ERV9CQVNFKSkgewoJCXByaW50ZigicmVhbG1vZGUgc3dpdGNoIHRvbyBsYXJnZSAoJWxkIGJ5dGVzLCBtYXggaXMgJWQpXG4iLCAKCQkgICAgICAgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSwgKFJFQUxNT0RFX01BSUxCT1gtUkVBTE1PREVfQkFTRSkpOwoJCXJldHVybiAtMTsKCX0KCQoJbWVtY3B5KFJFQUxNT0RFX0JBU0UsICh2b2lkKilpMzg2Ym9vdF9yZWFsbW9kZSwgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSk7Cglhc20oIndiaW52ZFxuIik7CgkKCXJldHVybiAwOwp9CgkJCmludCBlbnRlcl9yZWFsbW9kZSh1MTYgc2VnLCB1MTYgb2ZmLCBzdHJ1Y3QgcHRfcmVncyAqaW4sIHN0cnVjdCBwdF9yZWdzICpvdXQpCnsKCQoJLyogc2V0dXAgb3V0IHRoaW4gYmlvcyBlbXVsYXRpb24gKi8KCWlmIChiaW9zX3NldHVwKCkpIHsKCQlyZXR1cm4gLTE7Cgl9CgkKCWlmIChyZWFsbW9kZV9zZXR1cCgpKSB7CgkJcmV0dXJuIC0xOwoJfQoJCSAgICAgICAJCglpbi0+ZWlwID0gb2ZmOwoJaW4tPnhjcyA9IHNlZzsKCWlmICgzPihpbi0+ZXNwICYgMHhmZmZmKSkgewoJCXByaW50ZigiV2FybmluZzogZW50ZXJpbmcgcmVhbG1vZGUgd2l0aCBzcCA8IDQgd2lsbCBmYWlsXG4iKTsKCX0KCQoJbWVtY3B5KFJFQUxNT0RFX01BSUxCT1gsIGluLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKCWFzbSgid2JpbnZkXG4iKTsKCQoJX19hc21fXyB2b2xhdGlsZSAoIAoJCSAibGNhbGwgJDB4MjAsJTBcbiIgIDogOiAgImkiICgmcmVhbG1vZGVfZW50ZXIpICk7CgoJYXNtKCJ3YmludmRcbiIpOwoJbWVtY3B5KG91dCwgUkVBTE1PREVfTUFJTEJPWCwgc2l6ZW9mKHN0cnVjdCBwdF9yZWdzKSk7CgoJcmV0dXJuIG91dC0+ZWF4Owp9CgoKLyogVGhpcyBjb2RlIGlzIHN1cHBvc2VkIHRvIGFjY2VzcyBhIHJlYWxtb2RlIGludGVycnVwdAogKiBpdCBkb2VzIGN1cnJlbnRseSBub3Qgd29yayBmb3IgbWUgKi8KaW50IGVudGVyX3JlYWxtb2RlX2ludCh1OCBsdmwsIHN0cnVjdCBwdF9yZWdzICppbiwgc3RydWN0IHB0X3JlZ3MgKm91dCkKewoJLyogcGxhY2UgdHdvIGluc3RydWN0aW9ucyBhdCAweDcwMCAqLwoJd3JpdGViKDB4Y2QsIDB4NzAwKTsgIC8qIGludCAkbHZsICovCgl3cml0ZWIobHZsLCAweDcwMSk7Cgl3cml0ZWIoMHhjYiwgMHg3MDIpOyAgLyogbHJldCAqLwoJYXNtKCJ3YmludmRcbiIpOwogICAgICAKCWVudGVyX3JlYWxtb2RlKDB4MDAsIDB4NzAwLCBpbiwgb3V0KTsJCgkKCXJldHVybiBvdXQtPmVmbGFncyYxOwp9Cgo=