LyoKICogIEhUTUwgRW50aXR5ICYgRW5jb2Rpbmcgbm9ybWFsaXphdGlvbi4KICoKICogIENvcHlyaWdodCAoQykgMjAwNiBU9nL2ayBFZHZpbiA8ZWR3aW5AY2xhbWF2Lm5ldD4KICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogKgogKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLAogKiAgTUEgMDIxMTAtMTMwMSwgVVNBLgogKgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpZm5kZWYgX0hBU0hUQUJfSAojZGVmaW5lIF9IQVNIVEFCX0gKCnR5cGVkZWYgbG9uZyBlbGVtZW50X2RhdGE7CgovKiBkZWZpbmUgdGhpcyBmb3IgZGVidWdnaW5nL3Byb2ZpbGluZyBwdXJwb3NlcyBvbmx5LCBOT1QgaW4gcHJvZHVjdGlvbi9yZWxlYXNlIGNvZGUgKi8KI2lmZGVmIFBST0ZJTEVfSEFTSFRBQkxFCgoKdHlwZWRlZiBzdHJ1Y3QgewoJc2l6ZV90IGNhbGNfaGFzaDsKCXNpemVfdCBmb3VuZDsKCXNpemVfdCBmaW5kX3JlcTsKCXNpemVfdCBmb3VuZF90cmllczsKCXNpemVfdCBub3RfZm91bmQ7CglzaXplX3Qgbm90X2ZvdW5kX3RyaWVzOwoJc2l6ZV90IGdyb3dfZm91bmQ7CglzaXplX3QgZ3Jvd19mb3VuZF90cmllczsKCXNpemVfdCBncm93OwoJc2l6ZV90IHVwZGF0ZTsKCXNpemVfdCB1cGRhdGVfdHJpZXM7CglzaXplX3QgaW5zZXJ0czsKCXNpemVfdCBpbnNlcnRfdHJpZXM7CglzaXplX3QgZGVsZXRlZF9yZXVzZTsKCXNpemVfdCBkZWxldGVkX3RyaWVzOwoJc2l6ZV90IGRlbGV0ZXM7CglzaXplX3QgY2xlYXI7CglzaXplX3QgaGFzaF9leGhhdXN0ZWQ7Cn0gUFJPRklMRV9TVFJVQ1RfOwoKI2RlZmluZSBTVFJVQ1RfUFJPRklMRSBQUk9GSUxFX1NUUlVDVF8gUFJPRklMRV9TVFJVQ1Q7CiNlbHNlCgojZGVmaW5lIFNUUlVDVF9QUk9GSUxFCgojZW5kaWYKc3RydWN0IGVsZW1lbnQgCnsKCWNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleTsKCWVsZW1lbnRfZGF0YSBkYXRhOwp9OwoKc3RydWN0IGhhc2h0YWJsZSB7CglzdHJ1Y3QgZWxlbWVudCogaHRhYmxlOwoJc2l6ZV90IGNhcGFjaXR5OwoJc2l6ZV90IHVzZWQ7CglzaXplX3QgbWF4ZmlsbDsvKiA4MCUgKi8KCglTVFJVQ1RfUFJPRklMRQp9OwoKCgppbnQgaGFzaHRhYl9nZW5lcmF0ZV9jKGNvbnN0IHN0cnVjdCBoYXNodGFibGUgKnMsY29uc3QgY2hhciogbmFtZSk7CnN0cnVjdCBlbGVtZW50KiBoYXNodGFiX2ZpbmQoY29uc3Qgc3RydWN0IGhhc2h0YWJsZSAqcyxjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksY29uc3Qgc2l6ZV90IGxlbik7CmludCBoYXNodGFiX2luaXQoc3RydWN0IGhhc2h0YWJsZSAqcyxzaXplX3QgY2FwYWNpdHkpOwppbnQgaGFzaHRhYl9pbnNlcnQoc3RydWN0IGhhc2h0YWJsZSAqcyxjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksc2l6ZV90IGxlbixlbGVtZW50X2RhdGEgZGF0YSk7CnZvaWQgaGFzaHRhYl9kZWxldGUoc3RydWN0IGhhc2h0YWJsZSAqcyxjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksY29uc3Qgc2l6ZV90IGxlbik7CnZvaWQgaGFzaHRhYl9jbGVhcihzdHJ1Y3QgaGFzaHRhYmxlICpzKTsKCmludCBoYXNodGFiX2xvYWQoRklMRSogaW4sIHN0cnVjdCBoYXNodGFibGUgKnMpOwppbnQgaGFzaHRhYl9zdG9yZShjb25zdCBzdHJ1Y3QgaGFzaHRhYmxlICpzLEZJTEUqIG91dCk7CgojZW5kaWYKCg==