LyoKICogU2NhdHRlcmxpc3QgQ3J5cHRvZ3JhcGhpYyBBUEkuCiAqCiAqIENvcHlyaWdodCAoYykgMjAwMiBKYW1lcyBNb3JyaXMgPGptb3JyaXNAaW50ZXJjb2RlLmNvbS5hdT4KICogQ29weXJpZ2h0IChjKSAyMDAyIERhdmlkIFMuIE1pbGxlciAoZGF2ZW1AcmVkaGF0LmNvbSkKICogQ29weXJpZ2h0IChjKSAyMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KICoKICogUG9ydGlvbnMgZGVyaXZlZCBmcm9tIENyeXB0b2FwaSwgYnkgQWxleGFuZGVyIEtqZWxkYWFzIDxhc3RvckBmYXN0Lm5vPgogKiBhbmQgTmV0dGxlLCBieSBOaWVscyBN9mxsZXIuCiAqIAogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAogKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQogKiBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIAogKiBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICovCiNpZm5kZWYgX0xJTlVYX0NSWVBUT19ICiNkZWZpbmUgX0xJTlVYX0NSWVBUT19ICgojaW5jbHVkZSA8YXNtL2F0b21pYy5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgojaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgoKLyoKICogQWxnb3JpdGhtIG1hc2tzIGFuZCB0eXBlcy4KICovCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX01BU0sJCTB4MDAwMDAwMGYKI2RlZmluZSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSCQkweDAwMDAwMDAxCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0RJR0VTVAkJMHgwMDAwMDAwMgojZGVmaW5lIENSWVBUT19BTEdfVFlQRV9IQVNICQkweDAwMDAwMDAzCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUgkweDAwMDAwMDA0CiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTCTB4MDAwMDAwMDUKCiNkZWZpbmUgQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSwkweDAwMDAwMDBlCgojZGVmaW5lIENSWVBUT19BTEdfTEFSVkFMCQkweDAwMDAwMDEwCiNkZWZpbmUgQ1JZUFRPX0FMR19ERUFECQkJMHgwMDAwMDAyMAojZGVmaW5lIENSWVBUT19BTEdfRFlJTkcJCTB4MDAwMDAwNDAKI2RlZmluZSBDUllQVE9fQUxHX0FTWU5DCQkweDAwMDAwMDgwCgovKgogKiBTZXQgdGhpcyBiaXQgaWYgYW5kIG9ubHkgaWYgdGhlIGFsZ29yaXRobSByZXF1aXJlcyBhbm90aGVyIGFsZ29yaXRobSBvZgogKiB0aGUgc2FtZSB0eXBlIHRvIGhhbmRsZSBjb3JuZXIgY2FzZXMuCiAqLwojZGVmaW5lIENSWVBUT19BTEdfTkVFRF9GQUxMQkFDSwkweDAwMDAwMTAwCgovKgogKiBUcmFuc2Zvcm0gbWFza3MgYW5kIHZhbHVlcyAoZm9yIGNydF9mbGFncykuCiAqLwojZGVmaW5lIENSWVBUT19URk1fTU9ERV9NQVNLCQkweDAwMDAwMGZmCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVFfTUFTSwkJMHgwMDBmZmYwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX01BU0sJCTB4ZmZmMDAwMDAKCiNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0VDQgkJMHgwMDAwMDAwMQojZGVmaW5lIENSWVBUT19URk1fTU9ERV9DQkMJCTB4MDAwMDAwMDIKI2RlZmluZSBDUllQVE9fVEZNX01PREVfQ0ZCCQkweDAwMDAwMDA0CiNkZWZpbmUgQ1JZUFRPX1RGTV9NT0RFX0NUUgkJMHgwMDAwMDAwOAoKI2RlZmluZSBDUllQVE9fVEZNX1JFUV9XRUFLX0tFWQkJMHgwMDAwMDEwMAojZGVmaW5lIENSWVBUT19URk1fUkVRX01BWV9TTEVFUAkweDAwMDAwMjAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfV0VBS19LRVkJCTB4MDAxMDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfS0VZX0xFTiAgIAkweDAwMjAwMDAwCiNkZWZpbmUgQ1JZUFRPX1RGTV9SRVNfQkFEX0tFWV9TQ0hFRCAJMHgwMDQwMDAwMAojZGVmaW5lIENSWVBUT19URk1fUkVTX0JBRF9CTE9DS19MRU4gCTB4MDA4MDAwMDAKI2RlZmluZSBDUllQVE9fVEZNX1JFU19CQURfRkxBR1MgCTB4MDEwMDAwMDAKCi8qCiAqIE1pc2NlbGxhbmVvdXMgc3R1ZmYuCiAqLwojZGVmaW5lIENSWVBUT19VTlNQRUMJCQkwCiNkZWZpbmUgQ1JZUFRPX01BWF9BTEdfTkFNRQkJNjQKCiNkZWZpbmUgQ1JZUFRPX0RJUl9FTkNSWVBUCQkxCiNkZWZpbmUgQ1JZUFRPX0RJUl9ERUNSWVBUCQkwCgovKgogKiBUaGUgbWFjcm8gQ1JZUFRPX01JTkFMSUdOX0FUVFIgKGFsb25nIHdpdGggdGhlIHZvaWQgKiB0eXBlIGluIHRoZSBhY3R1YWwKICogZGVjbGFyYXRpb24pIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNyeXB0b190Zm0gY29udGV4dCBzdHJ1Y3R1cmUgaXMKICogYWxpZ25lZCBjb3JyZWN0bHkgZm9yIHRoZSBnaXZlbiBhcmNoaXRlY3R1cmUgc28gdGhhdCB0aGVyZSBhcmUgbm8gYWxpZ25tZW50CiAqIGZhdWx0cyBmb3IgQyBkYXRhIHR5cGVzLiAgSW4gcGFydGljdWxhciwgdGhpcyBpcyByZXF1aXJlZCBvbiBwbGF0Zm9ybXMgc3VjaAogKiBhcyBhcm0gd2hlcmUgcG9pbnRlcnMgYXJlIDMyLWJpdCBhbGlnbmVkIGJ1dCB0aGVyZSBhcmUgZGF0YSB0eXBlcyBzdWNoIGFzCiAqIHU2NCB3aGljaCByZXF1aXJlIDY0LWJpdCBhbGlnbm1lbnQuCiAqLwojaWYgZGVmaW5lZChBUkNIX0tNQUxMT0NfTUlOQUxJR04pCiNkZWZpbmUgQ1JZUFRPX01JTkFMSUdOIEFSQ0hfS01BTExPQ19NSU5BTElHTgojZWxpZiBkZWZpbmVkKEFSQ0hfU0xBQl9NSU5BTElHTikKI2RlZmluZSBDUllQVE9fTUlOQUxJR04gQVJDSF9TTEFCX01JTkFMSUdOCiNlbmRpZgoKI2lmZGVmIENSWVBUT19NSU5BTElHTgojZGVmaW5lIENSWVBUT19NSU5BTElHTl9BVFRSIF9fYXR0cmlidXRlX18gKChfX2FsaWduZWRfXyhDUllQVE9fTUlOQUxJR04pKSkKI2Vsc2UKI2RlZmluZSBDUllQVE9fTUlOQUxJR05fQVRUUgojZW5kaWYKCnN0cnVjdCBzY2F0dGVybGlzdDsKc3RydWN0IGNyeXB0b19ibGtjaXBoZXI7CnN0cnVjdCBjcnlwdG9faGFzaDsKc3RydWN0IGNyeXB0b190Zm07CnN0cnVjdCBjcnlwdG9fdHlwZTsKCnN0cnVjdCBibGtjaXBoZXJfZGVzYyB7CglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtOwoJdm9pZCAqaW5mbzsKCXUzMiBmbGFnczsKfTsKCnN0cnVjdCBjaXBoZXJfZGVzYyB7CglzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtOwoJdm9pZCAoKmNyZm4pKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdW5zaWduZWQgaW50ICgqcHJmbikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLCB1OCAqZHN0LAoJCQkgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBuYnl0ZXMpOwoJdm9pZCAqaW5mbzsKfTsKCnN0cnVjdCBoYXNoX2Rlc2MgewoJc3RydWN0IGNyeXB0b19oYXNoICp0Zm07Cgl1MzIgZmxhZ3M7Cn07CgovKgogKiBBbGdvcml0aG1zOiBtb2R1bGFyIGNyeXB0byBhbGdvcml0aG0gaW1wbGVtZW50YXRpb25zLCBtYW5hZ2VkCiAqIHZpYSBjcnlwdG9fcmVnaXN0ZXJfYWxnKCkgYW5kIGNyeXB0b191bnJlZ2lzdGVyX2FsZygpLgogKi8Kc3RydWN0IGJsa2NpcGhlcl9hbGcgewoJaW50ICgqc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCWludCAoKmVuY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmRlY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywKCQkgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCSAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCgl1bnNpZ25lZCBpbnQgbWluX2tleXNpemU7Cgl1bnNpZ25lZCBpbnQgbWF4X2tleXNpemU7Cgl1bnNpZ25lZCBpbnQgaXZzaXplOwp9OwoKc3RydWN0IGNpcGhlcl9hbGcgewoJdW5zaWduZWQgaW50IGNpYV9taW5fa2V5c2l6ZTsKCXVuc2lnbmVkIGludCBjaWFfbWF4X2tleXNpemU7CglpbnQgKCpjaWFfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7Cgl2b2lkICgqY2lhX2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdm9pZCAoKmNpYV9kZWNyeXB0KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKCgl1bnNpZ25lZCBpbnQgKCpjaWFfZW5jcnlwdF9lY2IpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAoJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKCXVuc2lnbmVkIGludCAoKmNpYV9kZWNyeXB0X2VjYikoY29uc3Qgc3RydWN0IGNpcGhlcl9kZXNjICpkZXNjLAoJCQkJCXU4ICpkc3QsIGNvbnN0IHU4ICpzcmMsCgkJCQkJdW5zaWduZWQgaW50IG5ieXRlcykgX19kZXByZWNhdGVkOwoJdW5zaWduZWQgaW50ICgqY2lhX2VuY3J5cHRfY2JjKShjb25zdCBzdHJ1Y3QgY2lwaGVyX2Rlc2MgKmRlc2MsCgkJCQkJdTggKmRzdCwgY29uc3QgdTggKnNyYywKCQkJCQl1bnNpZ25lZCBpbnQgbmJ5dGVzKSBfX2RlcHJlY2F0ZWQ7Cgl1bnNpZ25lZCBpbnQgKCpjaWFfZGVjcnlwdF9jYmMpKGNvbnN0IHN0cnVjdCBjaXBoZXJfZGVzYyAqZGVzYywKCQkJCQl1OCAqZHN0LCBjb25zdCB1OCAqc3JjLAoJCQkJCXVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKfTsKCnN0cnVjdCBkaWdlc3RfYWxnIHsKCXVuc2lnbmVkIGludCBkaWFfZGlnZXN0c2l6ZTsKCXZvaWQgKCpkaWFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqZGlhX3VwZGF0ZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmRhdGEsCgkJCSAgIHVuc2lnbmVkIGludCBsZW4pOwoJdm9pZCAoKmRpYV9maW5hbCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCk7CglpbnQgKCpkaWFfc2V0a2V5KShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqa2V5LAoJICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7Cn07CgpzdHJ1Y3QgaGFzaF9hbGcgewoJaW50ICgqaW5pdCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYyk7CglpbnQgKCp1cGRhdGUpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CglpbnQgKCpmaW5hbCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgdTggKm91dCk7CglpbnQgKCpkaWdlc3QpKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKm91dCk7CglpbnQgKCpzZXRrZXkpKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtLCBjb25zdCB1OCAqa2V5LAoJCSAgICAgIHVuc2lnbmVkIGludCBrZXlsZW4pOwoKCXVuc2lnbmVkIGludCBkaWdlc3RzaXplOwp9OwoKc3RydWN0IGNvbXByZXNzX2FsZyB7CglpbnQgKCpjb2FfY29tcHJlc3MpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIGNvbnN0IHU4ICpzcmMsCgkJCSAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKCWludCAoKmNvYV9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCBjb25zdCB1OCAqc3JjLAoJCQkgICAgICB1bnNpZ25lZCBpbnQgc2xlbiwgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKfTsKCiNkZWZpbmUgY3JhX2Jsa2NpcGhlcgljcmFfdS5ibGtjaXBoZXIKI2RlZmluZSBjcmFfY2lwaGVyCWNyYV91LmNpcGhlcgojZGVmaW5lIGNyYV9kaWdlc3QJY3JhX3UuZGlnZXN0CiNkZWZpbmUgY3JhX2hhc2gJY3JhX3UuaGFzaAojZGVmaW5lIGNyYV9jb21wcmVzcwljcmFfdS5jb21wcmVzcwoKc3RydWN0IGNyeXB0b19hbGcgewoJc3RydWN0IGxpc3RfaGVhZCBjcmFfbGlzdDsKCXN0cnVjdCBsaXN0X2hlYWQgY3JhX3VzZXJzOwoKCXUzMiBjcmFfZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgY3JhX2Jsb2Nrc2l6ZTsKCXVuc2lnbmVkIGludCBjcmFfY3R4c2l6ZTsKCXVuc2lnbmVkIGludCBjcmFfYWxpZ25tYXNrOwoKCWludCBjcmFfcHJpb3JpdHk7CglhdG9taWNfdCBjcmFfcmVmY250OwoKCWNoYXIgY3JhX25hbWVbQ1JZUFRPX01BWF9BTEdfTkFNRV07CgljaGFyIGNyYV9kcml2ZXJfbmFtZVtDUllQVE9fTUFYX0FMR19OQU1FXTsKCgljb25zdCBzdHJ1Y3QgY3J5cHRvX3R5cGUgKmNyYV90eXBlOwoKCXVuaW9uIHsKCQlzdHJ1Y3QgYmxrY2lwaGVyX2FsZyBibGtjaXBoZXI7CgkJc3RydWN0IGNpcGhlcl9hbGcgY2lwaGVyOwoJCXN0cnVjdCBkaWdlc3RfYWxnIGRpZ2VzdDsKCQlzdHJ1Y3QgaGFzaF9hbGcgaGFzaDsKCQlzdHJ1Y3QgY29tcHJlc3NfYWxnIGNvbXByZXNzOwoJfSBjcmFfdTsKCglpbnQgKCpjcmFfaW5pdCkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSk7Cgl2b2lkICgqY3JhX2V4aXQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwoJdm9pZCAoKmNyYV9kZXN0cm95KShzdHJ1Y3QgY3J5cHRvX2FsZyAqYWxnKTsKCQoJc3RydWN0IG1vZHVsZSAqY3JhX21vZHVsZTsKfTsKCi8qCiAqIEFsZ29yaXRobSByZWdpc3RyYXRpb24gaW50ZXJmYWNlLgogKi8KaW50IGNyeXB0b19yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CmludCBjcnlwdG9fdW5yZWdpc3Rlcl9hbGcoc3RydWN0IGNyeXB0b19hbGcgKmFsZyk7CgovKgogKiBBbGdvcml0aG0gcXVlcnkgaW50ZXJmYWNlLgogKi8KI2lmZGVmIENPTkZJR19DUllQVE8KaW50IGNyeXB0b19hbGdfYXZhaWxhYmxlKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiBmbGFncykKCV9fZGVwcmVjYXRlZF9mb3JfbW9kdWxlczsKaW50IGNyeXB0b19oYXNfYWxnKGNvbnN0IGNoYXIgKm5hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CiNlbHNlCnN0YXRpYyBpbnQgY3J5cHRvX2FsZ19hdmFpbGFibGUoY29uc3QgY2hhciAqbmFtZSwgdTMyIGZsYWdzKQoJX19kZXByZWNhdGVkX2Zvcl9tb2R1bGVzOwpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYWxnX2F2YWlsYWJsZShjb25zdCBjaGFyICpuYW1lLCB1MzIgZmxhZ3MpCnsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2FsZyhjb25zdCBjaGFyICpuYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXJldHVybiAwOwp9CiNlbmRpZgoKLyoKICogVHJhbnNmb3JtczogdXNlci1pbnN0YW50aWF0ZWQgb2JqZWN0cyB3aGljaCBlbmNhcHN1bGF0ZSBhbGdvcml0aG1zCiAqIGFuZCBjb3JlIHByb2Nlc3NpbmcgbG9naWMuICBNYW5hZ2VkIHZpYSBjcnlwdG9fYWxsb2NfKigpIGFuZAogKiBjcnlwdG9fZnJlZV8qKCksIGFzIHdlbGwgYXMgdGhlIHZhcmlvdXMgaGVscGVycyBiZWxvdy4KICovCgpzdHJ1Y3QgYmxrY2lwaGVyX3RmbSB7Cgl2b2lkICppdjsKCWludCAoKnNldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKCQkgICAgICB1bnNpZ25lZCBpbnQga2V5bGVuKTsKCWludCAoKmVuY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKCWludCAoKmRlY3J5cHQpKHN0cnVjdCBibGtjaXBoZXJfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLCB1bnNpZ25lZCBpbnQgbmJ5dGVzKTsKfTsKCnN0cnVjdCBjaXBoZXJfdGZtIHsKCXZvaWQgKmNpdF9pdjsKCXVuc2lnbmVkIGludCBjaXRfaXZzaXplOwoJdTMyIGNpdF9tb2RlOwoJaW50ICgqY2l0X3NldGtleSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCSAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICprZXksIHVuc2lnbmVkIGludCBrZXlsZW4pOwoJaW50ICgqY2l0X2VuY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CglpbnQgKCpjaXRfZW5jcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCSAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCSAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOwoJaW50ICgqY2l0X2RlY3J5cHQpKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJICAgdW5zaWduZWQgaW50IG5ieXRlcyk7CglpbnQgKCpjaXRfZGVjcnlwdF9pdikoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpOwoJdm9pZCAoKmNpdF94b3JfYmxvY2spKHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpOwoJdm9pZCAoKmNpdF9lbmNyeXB0X29uZSkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKmRzdCwgY29uc3QgdTggKnNyYyk7Cgl2b2lkICgqY2l0X2RlY3J5cHRfb25lKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLCB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKTsKfTsKCnN0cnVjdCBoYXNoX3RmbSB7CglpbnQgKCppbml0KShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjKTsKCWludCAoKnVwZGF0ZSkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywKCQkgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKTsKCWludCAoKmZpbmFsKShzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KTsKCWludCAoKmRpZ2VzdCkoc3RydWN0IGhhc2hfZGVzYyAqZGVzYywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZywKCQkgICAgICB1bnNpZ25lZCBpbnQgbnNnLCB1OCAqb3V0KTsKCWludCAoKnNldGtleSkoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIGNvbnN0IHU4ICprZXksCgkJICAgICAgdW5zaWduZWQgaW50IGtleWxlbik7Cgl1bnNpZ25lZCBpbnQgZGlnZXN0c2l6ZTsKfTsKCnN0cnVjdCBjb21wcmVzc190Zm0gewoJaW50ICgqY290X2NvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgc2xlbiwKCSAgICAgICAgICAgICAgICAgICAgdTggKmRzdCwgdW5zaWduZWQgaW50ICpkbGVuKTsKCWludCAoKmNvdF9kZWNvbXByZXNzKShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAoJICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbik7Cn07CgojZGVmaW5lIGNydF9ibGtjaXBoZXIJY3J0X3UuYmxrY2lwaGVyCiNkZWZpbmUgY3J0X2NpcGhlcgljcnRfdS5jaXBoZXIKI2RlZmluZSBjcnRfaGFzaAljcnRfdS5oYXNoCiNkZWZpbmUgY3J0X2NvbXByZXNzCWNydF91LmNvbXByZXNzCgpzdHJ1Y3QgY3J5cHRvX3RmbSB7CgoJdTMyIGNydF9mbGFnczsKCQoJdW5pb24gewoJCXN0cnVjdCBibGtjaXBoZXJfdGZtIGJsa2NpcGhlcjsKCQlzdHJ1Y3QgY2lwaGVyX3RmbSBjaXBoZXI7CgkJc3RydWN0IGhhc2hfdGZtIGhhc2g7CgkJc3RydWN0IGNvbXByZXNzX3RmbSBjb21wcmVzczsKCX0gY3J0X3U7CgkKCXN0cnVjdCBjcnlwdG9fYWxnICpfX2NydF9hbGc7CgoJdm9pZCAqX19jcnRfY3R4W10gQ1JZUFRPX01JTkFMSUdOX0FUVFI7Cn07CgojZGVmaW5lIGNyeXB0b19jaXBoZXIgY3J5cHRvX3RmbQojZGVmaW5lIGNyeXB0b19jb21wIGNyeXB0b190Zm0KCnN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyIHsKCXN0cnVjdCBjcnlwdG9fdGZtIGJhc2U7Cn07CgpzdHJ1Y3QgY3J5cHRvX2hhc2ggewoJc3RydWN0IGNyeXB0b190Zm0gYmFzZTsKfTsKCmVudW0gewoJQ1JZUFRPQV9VTlNQRUMsCglDUllQVE9BX0FMRywKfTsKCnN0cnVjdCBjcnlwdG9fYXR0cl9hbGcgewoJY2hhciBuYW1lW0NSWVBUT19NQVhfQUxHX05BTUVdOwp9OwoKLyogCiAqIFRyYW5zZm9ybSB1c2VyIGludGVyZmFjZS4KICovCiAKc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19hbGxvY190Zm0oY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0Zm1fZmxhZ3MpOwpzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2FsbG9jX2Jhc2UoY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzayk7CnZvaWQgY3J5cHRvX2ZyZWVfdGZtKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pOwoKLyoKICogVHJhbnNmb3JtIGhlbHBlcnMgd2hpY2ggcXVlcnkgdGhlIHVuZGVybHlpbmcgYWxnb3JpdGhtLgogKi8Kc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpjcnlwdG9fdGZtX2FsZ19uYW1lKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX25hbWU7Cn0KCnN0YXRpYyBpbmxpbmUgY29uc3QgY2hhciAqY3J5cHRvX3RmbV9hbGdfZHJpdmVyX25hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfZHJpdmVyX25hbWU7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b190Zm1fYWxnX3ByaW9yaXR5KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2FsZy0+Y3JhX3ByaW9yaXR5Owp9CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b190Zm1fYWxnX21vZG5hbWUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIG1vZHVsZV9uYW1lKHRmbS0+X19jcnRfYWxnLT5jcmFfbW9kdWxlKTsKfQoKc3RhdGljIGlubGluZSB1MzIgY3J5cHRvX3RmbV9hbGdfdHlwZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9mbGFncyAmIENSWVBUT19BTEdfVFlQRV9NQVNLOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCglfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21pbl9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21pbl9rZXlzaXplOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCglfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX21heF9rZXlzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9jaXBoZXIuY2lhX21heF9rZXlzaXplOwp9CgpzdGF0aWMgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2l2c2l6ZShzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfaXZzaXplOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSkKewoJcmV0dXJuIHRmbS0+X19jcnRfYWxnLT5jcmFfYmxvY2tzaXplOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9fdGZtX2FsZ19kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0RJR0VTVCk7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9kaWdlc3QuZGlhX2RpZ2VzdHNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b190Zm1fYWxnX2FsaWdubWFzayhzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglyZXR1cm4gdGZtLT5fX2NydF9hbGctPmNyYV9hbGlnbm1hc2s7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPmNydF9mbGFnczsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b190Zm1fc2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKewoJdGZtLT5jcnRfZmxhZ3MgfD0gZmxhZ3M7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fdGZtX2NsZWFyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sIHUzMiBmbGFncykKewoJdGZtLT5jcnRfZmxhZ3MgJj0gfmZsYWdzOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgKmNyeXB0b190Zm1fY3R4KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiB0Zm0tPl9fY3J0X2N0eDsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX3RmbV9jdHhfYWxpZ25tZW50KHZvaWQpCnsKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm07CglyZXR1cm4gX19hbGlnbm9mX18odGZtLT5fX2NydF9jdHgpOwp9CgovKgogKiBBUEkgd3JhcHBlcnMuCiAqLwpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICpfX2NyeXB0b19ibGtjaXBoZXJfY2FzdCgKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKil0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKmNyeXB0b19ibGtjaXBoZXJfY2FzdCgKCXN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0JMS0NJUEhFUik7CglyZXR1cm4gX19jcnlwdG9fYmxrY2lwaGVyX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqY3J5cHRvX2FsbG9jX2Jsa2NpcGhlcigKCWNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fYmxrY2lwaGVyX2Nhc3QoY3J5cHRvX2FsbG9jX2Jhc2UoYWxnX25hbWUsIHR5cGUsIG1hc2spKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2Jsa2NpcGhlcl90Zm0oCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJnRmbS0+YmFzZTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2Jsa2NpcGhlcihzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfYmxrY2lwaGVyKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQkxLQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gY3J5cHRvX2hhc19hbGcoYWxnX25hbWUsIHR5cGUsIG1hc2spOwp9CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b19ibGtjaXBoZXJfbmFtZShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfbmFtZShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgYmxrY2lwaGVyX3RmbSAqY3J5cHRvX2Jsa2NpcGhlcl9jcnQoCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSktPmNydF9ibGtjaXBoZXI7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGJsa2NpcGhlcl9hbGcgKmNyeXB0b19ibGtjaXBoZXJfYWxnKAoJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSkKewoJcmV0dXJuICZjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLT5fX2NydF9hbGctPmNyYV9ibGtjaXBoZXI7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19ibGtjaXBoZXJfaXZzaXplKHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2FsZyh0Zm0pLT5pdnNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19ibGtjaXBoZXJfYmxvY2tzaXplKAoJc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fYWxnX2Jsb2Nrc2l6ZShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgY3J5cHRvX2Jsa2NpcGhlcl9hbGlnbm1hc2soCglzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9hbGdfYWxpZ25tYXNrKGNyeXB0b19ibGtjaXBoZXJfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHUzMiBjcnlwdG9fYmxrY2lwaGVyX2dldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX3RmbV9nZXRfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fYmxrY2lwaGVyX3NldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCSAgICAgIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9zZXRfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9jbGVhcl9mbGFncyhzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCQl1MzIgZmxhZ3MpCnsKCWNyeXB0b190Zm1fY2xlYXJfZmxhZ3MoY3J5cHRvX2Jsa2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX2Jsa2NpcGhlciAqdGZtLAoJCQkJCSAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJcmV0dXJuIGNyeXB0b19ibGtjaXBoZXJfY3J0KHRmbSktPnNldGtleShjcnlwdG9fYmxrY2lwaGVyX3RmbSh0Zm0pLAoJCQkJCQkga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCWRlc2MtPmluZm8gPSBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5pdjsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2VuY3J5cHRfaXYoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5lbmNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHQoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCWRlc2MtPmluZm8gPSBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5pdjsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5kZWNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fYmxrY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGJsa2NpcGhlcl9kZXNjICpkZXNjLAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJCSAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJCSAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9fYmxrY2lwaGVyX2NydChkZXNjLT50Zm0pLT5kZWNyeXB0KGRlc2MsIGRzdCwgc3JjLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2Jsa2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b19ibGtjaXBoZXIgKnRmbSwKCQkJCQkgICBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKQp7CgltZW1jcHkoY3J5cHRvX2Jsa2NpcGhlcl9jcnQodGZtKS0+aXYsIHNyYywgbGVuKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19ibGtjaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fYmxrY2lwaGVyICp0Zm0sCgkJCQkJICAgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikKewoJbWVtY3B5KGRzdCwgY3J5cHRvX2Jsa2NpcGhlcl9jcnQodGZtKS0+aXYsIGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKl9fY3J5cHRvX2NpcGhlcl9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19jaXBoZXIgKil0Zm07Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKmNyeXB0b19jaXBoZXJfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJcmV0dXJuIF9fY3J5cHRvX2NpcGhlcl9jYXN0KHRmbSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b19jaXBoZXIgKmNyeXB0b19hbGxvY19jaXBoZXIoY29uc3QgY2hhciAqYWxnX25hbWUsCgkJCQkJCQl1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fY2lwaGVyX2Nhc3QoY3J5cHRvX2FsbG9jX2Jhc2UoYWxnX25hbWUsIHR5cGUsIG1hc2spKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX3RmbSAqY3J5cHRvX2NpcGhlcl90Zm0oc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSkKewoJcmV0dXJuIHRmbTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2NpcGhlcihzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfY2lwaGVyKGNvbnN0IGNoYXIgKmFsZ19uYW1lLCB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gY3J5cHRvX2hhc19hbGcoYWxnX25hbWUsIHR5cGUsIG1hc2spOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjaXBoZXJfdGZtICpjcnlwdG9fY2lwaGVyX2NydChzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtKQp7CglyZXR1cm4gJmNyeXB0b19jaXBoZXJfdGZtKHRmbSktPmNydF9jaXBoZXI7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfYmxvY2tzaXplKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGNyeXB0b19jaXBoZXJfYWxpZ25tYXNrKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soY3J5cHRvX2NpcGhlcl90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b19jaXBoZXJfZ2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2dldF9mbGFncyhjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfc2V0X2ZsYWdzKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCgkJCQkJICAgdTMyIGZsYWdzKQp7CgljcnlwdG9fdGZtX3NldF9mbGFncyhjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLCBmbGFncyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2NsZWFyX2ZsYWdzKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCgkJCQkJICAgICB1MzIgZmxhZ3MpCnsKCWNyeXB0b190Zm1fY2xlYXJfZmxhZ3MoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY2lwaGVyX3NldGtleShzdHJ1Y3QgY3J5cHRvX2NpcGhlciAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQp7CglyZXR1cm4gY3J5cHRvX2NpcGhlcl9jcnQodGZtKS0+Y2l0X3NldGtleShjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLAoJCQkJCQkgIGtleSwga2V5bGVuKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19jaXBoZXJfZW5jcnlwdF9vbmUoc3RydWN0IGNyeXB0b19jaXBoZXIgKnRmbSwKCQkJCQkgICAgIHU4ICpkc3QsIGNvbnN0IHU4ICpzcmMpCnsKCWNyeXB0b19jaXBoZXJfY3J0KHRmbSktPmNpdF9lbmNyeXB0X29uZShjcnlwdG9fY2lwaGVyX3RmbSh0Zm0pLAoJCQkJCQlkc3QsIHNyYyk7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfb25lKHN0cnVjdCBjcnlwdG9fY2lwaGVyICp0Zm0sCgkJCQkJICAgICB1OCAqZHN0LCBjb25zdCB1OCAqc3JjKQp7CgljcnlwdG9fY2lwaGVyX2NydCh0Zm0pLT5jaXRfZGVjcnlwdF9vbmUoY3J5cHRvX2NpcGhlcl90Zm0odGZtKSwKCQkJCQkJZHN0LCBzcmMpOwp9Cgp2b2lkIGNyeXB0b19kaWdlc3RfaW5pdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKSBfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7CnZvaWQgY3J5cHRvX2RpZ2VzdF91cGRhdGUoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLCB1bnNpZ25lZCBpbnQgbnNnKQoJX19kZXByZWNhdGVkX2Zvcl9tb2R1bGVzOwp2b2lkIGNyeXB0b19kaWdlc3RfZmluYWwoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgdTggKm91dCkKCV9fZGVwcmVjYXRlZF9mb3JfbW9kdWxlczsKdm9pZCBjcnlwdG9fZGlnZXN0X2RpZ2VzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csIHVuc2lnbmVkIGludCBuc2csIHU4ICpvdXQpCglfX2RlcHJlY2F0ZWRfZm9yX21vZHVsZXM7CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqX19jcnlwdG9faGFzaF9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19oYXNoICopdGZtOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqY3J5cHRvX2hhc2hfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSBeIENSWVBUT19BTEdfVFlQRV9IQVNIKSAmCgkgICAgICAgQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSyk7CglyZXR1cm4gX19jcnlwdG9faGFzaF9jYXN0KHRmbSk7Cn0KCnN0YXRpYyBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwgY29uc3QgdTggKmtleSwKCQkJCXVuc2lnbmVkIGludCBrZXlsZW4pIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2RpZ2VzdF9zZXRrZXkoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKmtleSwgdW5zaWduZWQgaW50IGtleWxlbikKewoJcmV0dXJuIHRmbS0+Y3J0X2hhc2guc2V0a2V5KGNyeXB0b19oYXNoX2Nhc3QodGZtKSwga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9faGFzaCAqY3J5cHRvX2FsbG9jX2hhc2goY29uc3QgY2hhciAqYWxnX25hbWUsCgkJCQkJCSAgICB1MzIgdHlwZSwgdTMyIG1hc2spCnsKCXR5cGUgJj0gfkNSWVBUT19BTEdfVFlQRV9NQVNLOwoJdHlwZSB8PSBDUllQVE9fQUxHX1RZUEVfSEFTSDsKCW1hc2sgfD0gQ1JZUFRPX0FMR19UWVBFX0hBU0hfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9faGFzaF9jYXN0KGNyeXB0b19hbGxvY19iYXNlKGFsZ19uYW1lLCB0eXBlLCBtYXNrKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19oYXNoX3RmbShzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJcmV0dXJuICZ0Zm0tPmJhc2U7Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fZnJlZV9oYXNoKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CgljcnlwdG9fZnJlZV90Zm0oY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzX2hhc2goY29uc3QgY2hhciAqYWxnX25hbWUsIHUzMiB0eXBlLCB1MzIgbWFzaykKewoJdHlwZSAmPSB+Q1JZUFRPX0FMR19UWVBFX01BU0s7Cgl0eXBlIHw9IENSWVBUT19BTEdfVFlQRV9IQVNIOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfSEFTSF9NQVNLOwoKCXJldHVybiBjcnlwdG9faGFzX2FsZyhhbGdfbmFtZSwgdHlwZSwgbWFzayk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGhhc2hfdGZtICpjcnlwdG9faGFzaF9jcnQoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiAmY3J5cHRvX2hhc2hfdGZtKHRmbSktPmNydF9oYXNoOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9ibG9ja3NpemUoc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19ibG9ja3NpemUoY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9hbGlnbm1hc2soc3RydWN0IGNyeXB0b19oYXNoICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19hbGlnbm1hc2soY3J5cHRvX2hhc2hfdGZtKHRmbSkpOwp9CgpzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBjcnlwdG9faGFzaF9kaWdlc3RzaXplKHN0cnVjdCBjcnlwdG9faGFzaCAqdGZtKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KHRmbSktPmRpZ2VzdHNpemU7Cn0KCnN0YXRpYyBpbmxpbmUgdTMyIGNyeXB0b19oYXNoX2dldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSkKewoJcmV0dXJuIGNyeXB0b190Zm1fZ2V0X2ZsYWdzKGNyeXB0b19oYXNoX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19oYXNoX3NldF9mbGFncyhzdHJ1Y3QgY3J5cHRvX2hhc2ggKnRmbSwgdTMyIGZsYWdzKQp7CgljcnlwdG9fdGZtX3NldF9mbGFncyhjcnlwdG9faGFzaF90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2hhc2hfY2xlYXJfZmxhZ3Moc3RydWN0IGNyeXB0b19oYXNoICp0Zm0sIHUzMiBmbGFncykKewoJY3J5cHRvX3RmbV9jbGVhcl9mbGFncyhjcnlwdG9faGFzaF90Zm0odGZtKSwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9pbml0KHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MpCnsKCXJldHVybiBjcnlwdG9faGFzaF9jcnQoZGVzYy0+dGZtKS0+aW5pdChkZXNjKTsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2hhc2hfdXBkYXRlKHN0cnVjdCBoYXNoX2Rlc2MgKmRlc2MsCgkJCQkgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc2csCgkJCQkgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMpCnsKCXJldHVybiBjcnlwdG9faGFzaF9jcnQoZGVzYy0+dGZtKS0+dXBkYXRlKGRlc2MsIHNnLCBuYnl0ZXMpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9maW5hbChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLCB1OCAqb3V0KQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPmZpbmFsKGRlc2MsIG91dCk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNoX2RpZ2VzdChzdHJ1Y3QgaGFzaF9kZXNjICpkZXNjLAoJCQkJICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnLAoJCQkJICAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqb3V0KQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGRlc2MtPnRmbSktPmRpZ2VzdChkZXNjLCBzZywgbmJ5dGVzLCBvdXQpOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9faGFzaF9zZXRrZXkoc3RydWN0IGNyeXB0b19oYXNoICpoYXNoLAoJCQkJICAgICBjb25zdCB1OCAqa2V5LCB1bnNpZ25lZCBpbnQga2V5bGVuKQp7CglyZXR1cm4gY3J5cHRvX2hhc2hfY3J0KGhhc2gpLT5zZXRrZXkoaGFzaCwga2V5LCBrZXlsZW4pOwp9CgpzdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCnN0YXRpYyBpbnQgY3J5cHRvX2NpcGhlcl9lbmNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCgkJCQkgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpzcmMsCgkJCQkgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19jaXBoZXJfZW5jcnlwdF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNjYXR0ZXJsaXN0ICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBuYnl0ZXMsIHU4ICppdikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2VuY3J5cHRfaXYodGZtLCBkc3QsIHNyYywgbmJ5dGVzLCBpdik7Cn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgpzdGF0aWMgaW50IGNyeXB0b19jaXBoZXJfZGVjcnlwdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAoJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqZHN0LAoJCQkJIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAoJCQkJIHVuc2lnbmVkIGludCBuYnl0ZXMpIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcykKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCXJldHVybiB0Zm0tPmNydF9jaXBoZXIuY2l0X2RlY3J5cHQodGZtLCBkc3QsIHNyYywgbmJ5dGVzKTsKfQoKc3RhdGljIGludCBjcnlwdG9fY2lwaGVyX2RlY3J5cHRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKCQkJCSAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNyYywKCQkJCSAgICB1bnNpZ25lZCBpbnQgbmJ5dGVzLCB1OCAqaXYpIF9fZGVwcmVjYXRlZDsKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NpcGhlcl9kZWNyeXB0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzY2F0dGVybGlzdCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG5ieXRlcywgdTggKml2KQp7CglCVUdfT04oY3J5cHRvX3RmbV9hbGdfdHlwZSh0Zm0pICE9IENSWVBUT19BTEdfVFlQRV9DSVBIRVIpOwoJcmV0dXJuIHRmbS0+Y3J0X2NpcGhlci5jaXRfZGVjcnlwdF9pdih0Zm0sIGRzdCwgc3JjLCBuYnl0ZXMsIGl2KTsKfQoKc3RhdGljIHZvaWQgY3J5cHRvX2NpcGhlcl9zZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKCQkJCSBjb25zdCB1OCAqc3JjLCB1bnNpZ25lZCBpbnQgbGVuKSBfX2RlcHJlY2F0ZWQ7CnN0YXRpYyBpbmxpbmUgdm9pZCBjcnlwdG9fY2lwaGVyX3NldF9pdihzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdTggKnNyYywgdW5zaWduZWQgaW50IGxlbikKewoJQlVHX09OKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSAhPSBDUllQVE9fQUxHX1RZUEVfQ0lQSEVSKTsKCW1lbWNweSh0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBzcmMsIGxlbik7Cn0KCnN0YXRpYyB2b2lkIGNyeXB0b19jaXBoZXJfZ2V0X2l2KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0sCgkJCQkgdTggKmRzdCwgdW5zaWduZWQgaW50IGxlbikgX19kZXByZWNhdGVkOwpzdGF0aWMgaW5saW5lIHZvaWQgY3J5cHRvX2NpcGhlcl9nZXRfaXYoc3RydWN0IGNyeXB0b190Zm0gKnRmbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCBsZW4pCnsKCUJVR19PTihjcnlwdG9fdGZtX2FsZ190eXBlKHRmbSkgIT0gQ1JZUFRPX0FMR19UWVBFX0NJUEhFUik7CgltZW1jcHkoZHN0LCB0Zm0tPmNydF9jaXBoZXIuY2l0X2l2LCBsZW4pOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fY29tcCAqX19jcnlwdG9fY29tcF9jYXN0KHN0cnVjdCBjcnlwdG9fdGZtICp0Zm0pCnsKCXJldHVybiAoc3RydWN0IGNyeXB0b19jb21wICopdGZtOwp9CgpzdGF0aWMgaW5saW5lIHN0cnVjdCBjcnlwdG9fY29tcCAqY3J5cHRvX2NvbXBfY2FzdChzdHJ1Y3QgY3J5cHRvX3RmbSAqdGZtKQp7CglCVUdfT04oKGNyeXB0b190Zm1fYWxnX3R5cGUodGZtKSBeIENSWVBUT19BTEdfVFlQRV9DT01QUkVTUykgJgoJICAgICAgIENSWVBUT19BTEdfVFlQRV9NQVNLKTsKCXJldHVybiBfX2NyeXB0b19jb21wX2Nhc3QodGZtKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY3J5cHRvX2NvbXAgKmNyeXB0b19hbGxvY19jb21wKGNvbnN0IGNoYXIgKmFsZ19uYW1lLAoJCQkJCQkgICAgdTMyIHR5cGUsIHUzMiBtYXNrKQp7Cgl0eXBlICY9IH5DUllQVE9fQUxHX1RZUEVfTUFTSzsKCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gX19jcnlwdG9fY29tcF9jYXN0KGNyeXB0b19hbGxvY19iYXNlKGFsZ19uYW1lLCB0eXBlLCBtYXNrKSk7Cn0KCnN0YXRpYyBpbmxpbmUgc3RydWN0IGNyeXB0b190Zm0gKmNyeXB0b19jb21wX3RmbShzdHJ1Y3QgY3J5cHRvX2NvbXAgKnRmbSkKewoJcmV0dXJuIHRmbTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNyeXB0b19mcmVlX2NvbXAoc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCnsKCWNyeXB0b19mcmVlX3RmbShjcnlwdG9fY29tcF90Zm0odGZtKSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNyeXB0b19oYXNfY29tcChjb25zdCBjaGFyICphbGdfbmFtZSwgdTMyIHR5cGUsIHUzMiBtYXNrKQp7Cgl0eXBlICY9IH5DUllQVE9fQUxHX1RZUEVfTUFTSzsKCXR5cGUgfD0gQ1JZUFRPX0FMR19UWVBFX0NPTVBSRVNTOwoJbWFzayB8PSBDUllQVE9fQUxHX1RZUEVfTUFTSzsKCglyZXR1cm4gY3J5cHRvX2hhc19hbGcoYWxnX25hbWUsIHR5cGUsIG1hc2spOwp9CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmNyeXB0b19jb21wX25hbWUoc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCnsKCXJldHVybiBjcnlwdG9fdGZtX2FsZ19uYW1lKGNyeXB0b19jb21wX3RmbSh0Zm0pKTsKfQoKc3RhdGljIGlubGluZSBzdHJ1Y3QgY29tcHJlc3NfdGZtICpjcnlwdG9fY29tcF9jcnQoc3RydWN0IGNyeXB0b19jb21wICp0Zm0pCnsKCXJldHVybiAmY3J5cHRvX2NvbXBfdGZtKHRmbSktPmNydF9jb21wcmVzczsKfQoKc3RhdGljIGlubGluZSBpbnQgY3J5cHRvX2NvbXBfY29tcHJlc3Moc3RydWN0IGNyeXB0b19jb21wICp0Zm0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCAqZHN0LCB1bnNpZ25lZCBpbnQgKmRsZW4pCnsKCXJldHVybiBjcnlwdG9fY29tcF9jcnQodGZtKS0+Y290X2NvbXByZXNzKHRmbSwgc3JjLCBzbGVuLCBkc3QsIGRsZW4pOwp9CgpzdGF0aWMgaW5saW5lIGludCBjcnlwdG9fY29tcF9kZWNvbXByZXNzKHN0cnVjdCBjcnlwdG9fY29tcCAqdGZtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHU4ICpzcmMsIHVuc2lnbmVkIGludCBzbGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU4ICpkc3QsIHVuc2lnbmVkIGludCAqZGxlbikKewoJcmV0dXJuIGNyeXB0b19jb21wX2NydCh0Zm0pLT5jb3RfZGVjb21wcmVzcyh0Zm0sIHNyYywgc2xlbiwgZHN0LCBkbGVuKTsKfQoKI2VuZGlmCS8qIF9MSU5VWF9DUllQVE9fSCAqLwoK