LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyogc3R1ZmYgc3BlY2lmaWMgZm9yIHRoZSBzYzUyMCwgYnV0IGluZGVwZW5kZW50IG9mIGltcGxlbWVudGF0aW9uICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pYy9zc2kuaD4KI2luY2x1ZGUgPGFzbS9pYy9zYzUyMC5oPgoKaW50IHNzaV9zZXRfaW50ZXJmYWNlKGludCBmcmVxLCBpbnQgbHNiX2ZpcnN0LCBpbnQgaW52X2Nsb2NrLCBpbnQgaW52X3BoYXNlKQp7Cgl1OCB0ZW1wPTA7CgoJaWYgKGZyZXEgPj0gODE5MikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNDsKCX0gZWxzZSBpZiAoZnJlcSA+PSA0MDk2KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF84OwoJfSBlbHNlIGlmIChmcmVxID49IDIwNDgpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzE2OwoJfSBlbHNlIGlmIChmcmVxID49IDEwMjQpIHsKCQl0ZW1wIHw9IENUTF9DTEtfU0VMXzMyOwoJfSBlbHNlIGlmIChmcmVxID49IDUxMikgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNjQ7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gMjU2KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8xMjg7Cgl9IGVsc2UgaWYgKGZyZXEgPj0gMTI4KSB7CgkJdGVtcCB8PSBDVExfQ0xLX1NFTF8yNTY7Cgl9IGVsc2UgewoJCXRlbXAgfD0gQ1RMX0NMS19TRUxfNTEyOwoJfQoKCWlmICghbHNiX2ZpcnN0KSB7CgkJdGVtcCB8PSBNU0JGX0VOQjsKCX0KCglpZiAoaW52X2Nsb2NrKSB7CgkJdGVtcCB8PSBDTEtfSU5WX0VOQjsKCX0KCglpZiAoaW52X3BoYXNlKSB7CgkJdGVtcCB8PSBQSFNfSU5WX0VOQjsKCX0KCgl3cml0ZWIodGVtcCwgJnNjNTIwX21tY3ItPnNzaWN0bCk7CgoJcmV0dXJuIDA7Cn0KCnU4IHNzaV90eHJ4X2J5dGUodTggZGF0YSkKewoJd3JpdGViKGRhdGEsICZzYzUyMF9tbWNyLT5zc2l4bWl0KTsKCXdoaWxlIChyZWFkYigmc2M1MjBfbW1jci0+c3Npc3RhKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGViKFNTSUNNRF9DTURfU0VMX1hNSVRSQ1YsICZzYzUyMF9tbWNyLT5zc2ljbWQpOwoJd2hpbGUgKHJlYWRiKCZzYzUyMF9tbWNyLT5zc2lzdGEpICYgU1NJU1RBX0JTWSk7CgoJcmV0dXJuIHJlYWRiKCZzYzUyMF9tbWNyLT5zc2lyY3YpOwp9CgoKdm9pZCBzc2lfdHhfYnl0ZSh1OCBkYXRhKQp7Cgl3cml0ZWIoZGF0YSwgJnNjNTIwX21tY3ItPnNzaXhtaXQpOwoJd2hpbGUgKHJlYWRiKCZzYzUyMF9tbWNyLT5zc2lzdGEpICYgU1NJU1RBX0JTWSk7Cgl3cml0ZWIoU1NJQ01EX0NNRF9TRUxfWE1JVCwgJnNjNTIwX21tY3ItPnNzaWNtZCk7Cn0KCnU4IHNzaV9yeF9ieXRlKHZvaWQpCnsKCXdoaWxlIChyZWFkYigmc2M1MjBfbW1jci0+c3Npc3RhKSAmIFNTSVNUQV9CU1kpOwoJd3JpdGViKFNTSUNNRF9DTURfU0VMX1JDViwgJnNjNTIwX21tY3ItPnNzaWNtZCk7Cgl3aGlsZSAocmVhZGIoJnNjNTIwX21tY3ItPnNzaXN0YSkgJiBTU0lTVEFfQlNZKTsKCglyZXR1cm4gcmVhZGIoJnNjNTIwX21tY3ItPnNzaXJjdik7Cn0K