LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKiAKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KI2luY2x1ZGUgPGFzbS9yZWFsbW9kZS5oPgoKCiNkZWZpbmUgUkVBTE1PREVfQkFTRSAgICAoKGNoYXIqKTB4N2MwKQojZGVmaW5lIFJFQUxNT0RFX01BSUxCT1ggKChjaGFyKikweGUwMCkKCgpleHRlcm4gY2hhciByZWFsbW9kZV9lbnRlcjsKCgppbnQgZW50ZXJfcmVhbG1vZGUodTE2IHNlZywgdTE2IG9mZiwgc3RydWN0IHB0X3JlZ3MgKmluLCBzdHJ1Y3QgcHRfcmVncyAqb3V0KQp7CgkKCS8qIHNldHVwIG91dCB0aGluIGJpb3MgZW11bGF0aW9uICovCglpZiAoYmlvc19zZXR1cCgpKSB7CgkJcmV0dXJuIC0xOwoJfQoJCQoJLyogY29weSB0aGUgcmVhbG1vZGUgc3dpdGNoIGNvZGUgKi8KCWlmIChpMzg2Ym9vdF9yZWFsbW9kZV9zaXplID4gKFJFQUxNT0RFX01BSUxCT1gtUkVBTE1PREVfQkFTRSkpIHsKCQlwcmludGYoInJlYWxtb2RlIHN3aXRjaCB0b28gbGFyZ2UgKCVsZCBieXRlcywgbWF4IGlzICVkKVxuIiwgCgkJICAgICAgIGkzODZib290X3JlYWxtb2RlX3NpemUsIChpbnQpKFJFQUxNT0RFX01BSUxCT1gtUkVBTE1PREVfQkFTRSkpOwoJCXJldHVybiAtMTsKCX0KCQoJbWVtY3B5KFJFQUxNT0RFX0JBU0UsICh2b2lkKilpMzg2Ym9vdF9yZWFsbW9kZSwgaTM4NmJvb3RfcmVhbG1vZGVfc2l6ZSk7CgkJCgkKCWluLT5laXAgPSBvZmY7Cglpbi0+eGNzID0gc2VnOwoJaWYgKDM+KGluLT5lc3AgJiAweGZmZmYpKSB7CgkJcHJpbnRmKCJXYXJuaW5nOiBlbnRlcmluZyByZWFsbW9kZSB3aXRoIHNwIDwgNCB3aWxsIGZhaWxcbiIpOwoJfQoJCgltZW1jcHkoUkVBTE1PREVfTUFJTEJPWCwgaW4sIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOwoJCglfX2FzbV9fIHZvbGF0aWxlICggCgkJICJsY2FsbCAkMHgyMCwlMFxuIiAgOiA6ICAiaSIgKCZyZWFsbW9kZV9lbnRlcikgKTsKCgltZW1jcHkob3V0LCBSRUFMTU9ERV9NQUlMQk9YLCBzaXplb2Yoc3RydWN0IHB0X3JlZ3MpKTsKCglyZXR1cm4gb3V0LT5lYXg7Cn0KCg==