LyoKICogaXNkbmhkbGMuaCAgLS0gIEdlbmVyYWwgcHVycG9zZSBJU0ROIEhETEMgZGVjb2Rlci4KICoKICogSW1wbGVtZW50YXRpb24gb2YgYSBIRExDIGRlY29kZXIvZW5jb2RlciBpbiBzb2Z0d2FyZS4KICogTmVjY2Vzc2FyeSBiZWNhdXNlIHNvbWUgSVNETiBkZXZpY2VzIGRvbid0IGhhdmUgSERMQwogKiBjb250cm9sbGVycy4gQWxzbyBpbmNsdWRlZDogYSBiaXQgcmV2ZXJzYWwgdGFibGUuCiAqCiAqQ29weXJpZ2h0IChDKSAyMDAyICAgIFdvbGZnYW5nIE38ZXMgICAgICA8d29sZmdhbmdAaWtzdy1tdWVlcy5kZT4KICoJCTIwMDEgCUZyb2RlIElzYWtzZW4gICAgICA8ZmlzYWtzZW5AYmV3YW4uY29tPgogKiAgICAgICAgICAgICAgMjAwMSAJS2FpIEdlcm1hc2NoZXdza2kgIDxrYWkuZ2VybWFzY2hld3NraUBnbXguZGU+CiAqCiAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCiAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KICovCgojaWZuZGVmIF9fSVNETkhETENfSF9fCiNkZWZpbmUgX19JU0ROSERMQ19IX18KCnN0cnVjdCBpc2RuaGRsY192YXJzIHsKCWludCBiaXRfc2hpZnQ7CglpbnQgaGRsY19iaXRzMTsKCWludCBkYXRhX2JpdHM7CglpbnQgZmZiaXRfc2hpZnQ7IAkvLyBlbmNvZGluZyBvbmx5CglpbnQgc3RhdGU7CglpbnQgZHN0cG9zOwoKCXVuc2lnbmVkIHNob3J0IGNyYzsKCgl1bnNpZ25lZCBjaGFyIGNiaW47Cgl1bnNpZ25lZCBjaGFyIHNoaWZ0X3JlZzsKCXVuc2lnbmVkIGNoYXIgZmZ2YWx1ZTsKCgl1bnNpZ25lZCBpbnQgZGF0YV9yZWNlaXZlZDoxOyAJLy8gc2V0IGlmIHRyYW5zZmVycmluZyBkYXRhCgl1bnNpZ25lZCBpbnQgZGNoYW5uZWw6MTsgCS8vIHNldCBpZiBEIGNoYW5uZWwgKHNlbmQgaWRsZSBpbnN0ZWFkIG9mIGZsYWdzKQoJdW5zaWduZWQgaW50IGRvX2FkYXB0NTY6MTsgCS8vIHNldCBpZiA1NksgYWRhcHRhdGlvbgoJdW5zaWduZWQgaW50IGRvX2Nsb3Npbmc6MTsgCS8vIHNldCBpZiBpbiBjbG9zaW5nIHBoYXNlIChuZWVkIHRvIHNlbmQgQ1JDICsgZmxhZwp9OwoKCi8qCiAgVGhlIHJldHVybiB2YWx1ZSBmcm9tIGlzZG5oZGxjX2RlY29kZSBpcwogIHRoZSBmcmFtZSBsZW5ndGgsIDAgaWYgbm8gY29tcGxldGUgZnJhbWUgd2FzIGRlY29kZWQsCiAgb3IgYSBuZWdhdGl2ZSBlcnJvciBudW1iZXIKKi8KI2RlZmluZSBIRExDX0ZSQU1JTkdfRVJST1IgICAgIDEKI2RlZmluZSBIRExDX0NSQ19FUlJPUiAgICAgICAgIDIKI2RlZmluZSBIRExDX0xFTkdUSF9FUlJPUiAgICAgIDMKCmV4dGVybiB2b2lkIGlzZG5oZGxjX3Jjdl9pbml0IChzdHJ1Y3QgaXNkbmhkbGNfdmFycyAqaGRsYywgaW50IGRvX2FkYXB0NTYpOwoKZXh0ZXJuIGludCBpc2RuaGRsY19kZWNvZGUgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzbGVuLGludCAqY291bnQsCgkgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzaXplKTsKCmV4dGVybiB2b2lkIGlzZG5oZGxjX291dF9pbml0IChzdHJ1Y3QgaXNkbmhkbGNfdmFycyAqaGRsYyxpbnQgaXNfZF9jaGFubmVsLGludCBkb19hZGFwdDU2KTsKCmV4dGVybiBpbnQgaXNkbmhkbGNfZW5jb2RlIChzdHJ1Y3QgaXNkbmhkbGNfdmFycyAqaGRsYyxjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsdW5zaWduZWQgc2hvcnQgc2xlbixpbnQgKmNvdW50LAoJICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpkc3QsaW50IGRzaXplKTsKCiNlbmRpZiAvKiBfX0lTRE5IRExDX0hfXyAqLwo=