LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgovKgogKiBzY2FwaS5jCiAqCiAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmZGVmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWZkZWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9ETUFMTE9DX0gKI2luY2x1ZGUgPGRtYWxsb2MuaD4KI2VuZGlmCgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL291dHB1dF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3V0aWxpdGllcy5oPgoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHVzbV9zdXBwb3J0LCBsaWJuZXRzbm1wKQpuZXRzbm1wX2ZlYXR1cmVfY2hpbGRfb2YodXNtX3NjYXBpLCB1c21fc3VwcG9ydCkKCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9VU01fU0NBUEkKCiNpZmRlZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbWQ1Lmg+CiNlbmRpZgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9jYWxsYmFjay5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wX3NlY21vZC5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9zbm1wdXNtLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2tleXRvb2xzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NjYXBpLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L21pYi5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS90cmFuc2Zvcm1fb2lkcy5oPgoKI2lmZGVmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9vcGVuc3NsX21kNS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9vcGVuc3NsX3NoYS5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9vcGVuc3NsX2Rlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9vcGVuc3NsX2Flcy5oPgojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1VTRV9PUEVOU1NMCiNpbmNsdWRlIDxvcGVuc3NsL2htYWMuaD4KI2luY2x1ZGUgPG9wZW5zc2wvZXZwLmg+CiNpbmNsdWRlIDxvcGVuc3NsL3JhbmQuaD4KI2luY2x1ZGUgPG9wZW5zc2wvZGVzLmg+CiNpZmRlZiBIQVZFX0FFUwojaW5jbHVkZSA8b3BlbnNzbC9hZXMuaD4KI2VuZGlmCgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKI2lmZGVmIEhBVkVfU1RSVUNUX0RFU19LU19TVFJVQ1RfV0VBS19LRVkKLyogdGhlc2UgYXJlIG9sZGVyIG5hbWVzIGZvciBuZXdlciBzdHJ1Y3R1cmVzIHRoYXQgZXhpc3QgaW4gb3BlbnNzbCAuOS43ICovCiNkZWZpbmUgREVTX2tleV9zY2hlZHVsZSAgICBkZXNfa2V5X3NjaGVkdWxlIAojZGVmaW5lIERFU19jYmxvY2sgICAgICAgICAgZGVzX2NibG9jayAKI2RlZmluZSBERVNfa2V5X3NjaGVkICAgICAgIGRlc19rZXlfc2NoZWQgCiNkZWZpbmUgREVTX25jYmNfZW5jcnlwdCAgICBkZXNfbmNiY19lbmNyeXB0CiNkZWZpbmUgREVTX2NiY19lbmNyeXB0ICAgIGRlc19jYmNfZW5jcnlwdAojZGVmaW5lIE9MRF9ERVMKI2VuZGlmCiNlbmRpZgoKI2VuZGlmIC8qIEhBVkVfT1BFTlNTTCAqLwoKI2lmZGVmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1VTRV9QS0NTMTEKI2luY2x1ZGUgPHNlY3VyaXR5L2NyeXB0b2tpLmg+CiNlbmRpZgoKI2lmZGVmIFFVSVRGVU4KI3VuZGVmIFFVSVRGVU4KI2RlZmluZSBRVUlURlVOKGUsIGwpCQkJCQlcCglpZiAoZSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsJCQlcCgkJcnZhbCA9IFNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFOwlcCgkJZ290byBsIDsJCQkJXAoJfQojZW5kaWYKCiNpZmRlZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8Kc3RhdGljCmludCBTSEExX2htYWMoY29uc3QgdV9jaGFyICogZGF0YSwgc2l6ZV90IGxlbiwgdV9jaGFyICogbWFjLCBzaXplX3QgbWFjbGVuLAogICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIHNlY3JldCwgc2l6ZV90IHNlY3JldGxlbik7CgpzdGF0aWMKaW50IE1ENV9obWFjKGNvbnN0IHVfY2hhciAqIGRhdGEsIHNpemVfdCBsZW4sIHVfY2hhciAqIG1hYywgc2l6ZV90IG1hY2xlbiwKICAgICAgICAgICAgIGNvbnN0IHVfY2hhciAqIHNlY3JldCwgc2l6ZV90IHNlY3JldGxlbik7CiNlbmRpZgoKLyoKICogc2NfZ2V0X3Byb3Blcmxlbmd0aChvaWQgKmhhc2h0eXBlLCB1X2ludCBoYXNodHlwZV9sZW4pOgogKiAKICogR2l2ZW4gYSBoYXNoaW5nIHR5cGUgKCJoYXNodHlwZSIgYW5kIGl0cyBsZW5ndGggaGFzaHR5cGVfbGVuKSwgcmV0dXJuCiAqIHRoZSBsZW5ndGggb2YgdGhlIGhhc2ggcmVzdWx0LgogKiAKICogUmV0dXJucyBlaXRoZXIgdGhlIGxlbmd0aCBvciBTTk1QRVJSX0dFTkVSUiBmb3IgYW4gdW5rbm93biBoYXNoaW5nIHR5cGUuCiAqLwppbnQKc2NfZ2V0X3Byb3Blcmxlbmd0aChjb25zdCBvaWQgKiBoYXNodHlwZSwgdV9pbnQgaGFzaHR5cGVfbGVuKQp7CiAgICBERUJVR1RSQUNFOwogICAgLyoKICAgICAqIERldGVybWluZSB0cmFuc2Zvcm0gdHlwZSBoYXNoIGxlbmd0aC4KICAgICAqLwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NRDUKICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ01ENUF1dGgpKSB7CiAgICAgICAgcmV0dXJuIEJZVEVTSVpFKFNOTVBfVFJBTlNfQVVUSExFTl9ITUFDTUQ1KTsKICAgIH0gZWxzZQojZW5kaWYKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNTSEExQXV0aCkpIHsKICAgICAgICByZXR1cm4gQllURVNJWkUoU05NUF9UUkFOU19BVVRITEVOX0hNQUNTSEExKTsKICAgIH0KICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKfQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHNjYXBpX2dldF9wcm9wZXJfcHJpdl9sZW5ndGgsIG5ldHNubXBfdW51c2VkKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU0NBUElfR0VUX1BST1BFUl9QUklWX0xFTkdUSAppbnQKc2NfZ2V0X3Byb3Blcl9wcml2X2xlbmd0aChjb25zdCBvaWQgKiBwcml2dHlwZSwgdV9pbnQgcHJpdnR5cGVfbGVuKQp7CiAgICBpbnQgcHJvcGVybGVuZ3RoID0gMDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIERFU1ByaXYpKSB7CiAgICAgICAgcHJvcGVybGVuZ3RoID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVMpOwogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIEFFU1ByaXYpKSB7CiAgICAgICAgcHJvcGVybGVuZ3RoID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOX0FFUyk7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIHByb3Blcmxlbmd0aDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TQ0FQSV9HRVRfUFJPUEVSX1BSSVZfTEVOR1RIICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogc2NfaW5pdAogKgogKiBSZXR1cm5zOgogKglTTk1QRVJSX1NVQ0NFU1MJCQlTdWNjZXNzLgogKi8KaW50CnNjX2luaXQodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHJ2YWwgPSBTTk1QRVJSX1NVQ0NFU1M7CgojaWYgIWRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTykKICAgIHN0cnVjdCB0aW1ldmFsICB0djsKCiAgICBERUJVR1RSQUNFOwoKICAgIGdldHRpbWVvZmRheSgmdHYsIChzdHJ1Y3QgdGltZXpvbmUgKikgMCk7CgogICAgc3JhbmRvbSgodW5zaWduZWQpKHR2LnR2X3NlYyBeIHR2LnR2X3VzZWMpKTsKI2VsaWYgTkVUU05NUF9VU0VfUEtDUzExCiAgICBERUJVR1RSQUNFOwogICAgcnZhbCA9IHBrY3NfaW5pdCgpOwojZWxzZQogICAgcnZhbCA9IFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQ7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSAqLwogICAgLyoKICAgICAqIFhYWCBvZ3VkOiBUaGUgb25seSByZWFzb24gdG8gZG8gYW55dGhpbmcgaGVyZSB3aXRoIG9wZW5zc2wgaXMgdG8gCiAgICAgKiAqIFhYWCBvZ3VkOiBzZWVkIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIAogICAgICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWZuZGVmIE5FVFNOTVBfVVNFX09QRU5TU0wgKi8KICAgIHJldHVybiBydmFsOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBzY19pbml0KCkgKi8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNjX3JhbmRvbQogKgogKiBQYXJhbWV0ZXJzOgogKgkqYnVmCQlQcmUtYWxsb2NhdGVkIGJ1ZmZlci4KICoJKmJ1ZmxlbiAJU2l6ZSBvZiBidWZmZXIuCiAqICAgICAgCiAqIFJldHVybnM6CiAqCVNOTVBFUlJfU1VDQ0VTUwkJCVN1Y2Nlc3MuCiAqLwppbnQKc2NfcmFuZG9tKHVfY2hhciAqIGJ1Ziwgc2l6ZV90ICogYnVmbGVuKQojaWYgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9QS0NTMTEpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPKQp7CiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKI2lmICFkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpICYmICFkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkKICAgIGludCAgICAgICAgICAgICBpOwogICAgaW50ICAgICAgICAgICAgIHJuZHZhbDsKICAgIHVfY2hhciAgICAgICAgICp1Y3AgPSBidWY7CiNlbmRpZgoKICAgIERFQlVHVFJBQ0U7CgojaWZkZWYgTkVUU05NUF9VU0VfT1BFTlNTTAogICAgUkFORF9ieXRlcyhidWYsICpidWZsZW4pOyAgIC8qIHdpbGwgbmV2ZXIgZmFpbCAqLwojZWxpZiBORVRTTk1QX1VTRV9QS0NTMTEJCQkvKiBORVRTTk1QX1VTRV9QS0NTMTEgKi8KICAgIHBrY3NfcmFuZG9tKGJ1ZiwgKmJ1Zmxlbik7CiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCiAgICAvKgogICAgICogZmlsbCB0aGUgYnVmZmVyIHdpdGggcmFuZG9tIGludGVnZXJzLiAgTm90ZSB0aGF0IHJhbmRvbSgpCiAgICAgKiBpcyBkZWZpbmVkIGluIGNvbmZpZy5oIGFuZCBtYXkgbm90IGJlIHRydWx5IHRoZSByYW5kb20oKQogICAgICogc3lzdGVtIGNhbGwgaWYgc29tZXRoaW5nIGJldHRlciBleGlzdGVkIAogICAgICovCiAgICBydmFsID0gKmJ1ZmxlbiAtICpidWZsZW4gJSBzaXplb2Yocm5kdmFsKTsKICAgIGZvciAoaSA9IDA7IGkgPCBydmFsOyBpICs9IHNpemVvZihybmR2YWwpKSB7CiAgICAgICAgcm5kdmFsID0gcmFuZG9tKCk7CiAgICAgICAgbWVtY3B5KHVjcCwgJnJuZHZhbCwgc2l6ZW9mKHJuZHZhbCkpOwogICAgICAgIHVjcCArPSBzaXplb2Yocm5kdmFsKTsKICAgIH0KCiAgICBybmR2YWwgPSByYW5kb20oKTsKICAgIG1lbWNweSh1Y3AsICZybmR2YWwsICpidWZsZW4gJSBzaXplb2Yocm5kdmFsKSk7CgogICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9PUEVOU1NMICovCiAgICByZXR1cm4gcnZhbDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNjX3JhbmRvbSgpICovCgojZWxzZQpfU0NBUElfTk9UX0NPTkZJR1VSRUQKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaAogKgogKiBQYXJhbWV0ZXJzOgogKgkgYXV0aHR5cGUJVHlwZSBvZiBhdXRoZW50aWNhdGlvbiB0cmFuc2Zvcm0uCiAqCSBhdXRodHlwZWxlbgogKgkqa2V5CQlQb2ludGVyIHRvIGtleSAoS3VsKSB0byB1c2UgaW4ga2V5ZWQgaGFzaC4KICoJIGtleWxlbgkJTGVuZ3RoIG9mIGtleSBpbiBieXRlcy4KICoJKm1lc3NhZ2UJUG9pbnRlciB0byB0aGUgbWVzc2FnZSB0byBoYXNoLgogKgkgbXNnbGVuCQlMZW5ndGggb2YgdGhlIG1lc3NhZ2UuCiAqCSpNQUMJCVdpbGwgYmUgcmV0dXJuZWQgd2l0aCBhbGxvY2F0ZWQgYnl0ZXMgY29udGFpbmcgaGFzaC4KICoJKm1hY2xlbgkJTGVuZ3RoIG9mIHRoZSBoYXNoIGJ1ZmZlciBpbiBieXRlczsgYWxzbyBpbmRpY2F0ZXMKICoJCQkJd2hldGhlciB0aGUgTUFDIHNob3VsZCBiZSB0cnVuY2F0ZWQuCiAqICAgICAgCiAqIFJldHVybnM6CiAqCVNOTVBFUlJfU1VDQ0VTUwkJCVN1Y2Nlc3MuCiAqCVNOTVBFUlJfR0VORVJSCQkJQWxsIGVycnMKICoKICoKICogQSBoYXNoIG9mIHRoZSBmaXJzdCBtc2dsZW4gYnl0ZXMgb2YgbWVzc2FnZSB1c2luZyBhIGtleWVkIGhhc2ggZGVmaW5lZAogKiBieSBhdXRodHlwZSBpcyBjcmVhdGVkIGFuZCBzdG9yZWQgaW4gTUFDLiAgTUFDIGlzIEFTU1VNRUQgdG8gYmUgYSBidWZmZXIKICogb2YgYXQgbGVhc3QgbWFjbGVuIGJ5dGVzLiAgSWYgdGhlIGxlbmd0aCBvZiB0aGUgaGFzaCBpcyBncmVhdGVyIHRoYW4KICogbWFjbGVuLCBpdCBpcyB0cnVuY2F0ZWQgdG8gZml0IHRoZSBidWZmZXIuICBJZiB0aGUgbGVuZ3RoIG9mIHRoZSBoYXNoIGlzCiAqIGxlc3MgdGhhbiBtYWNsZW4sIG1hY2xlbiBzZXQgdG8gdGhlIG51bWJlciBvZiBoYXNoIGJ5dGVzIGdlbmVyYXRlZC4KICoKICogQVNTVU1FRCB0aGF0IHRoZSBudW1iZXIgb2YgaGFzaCBiaXRzIGlzIGEgbXVsdGlwbGUgb2YgOC4KICovCmludApzY19nZW5lcmF0ZV9rZXllZF9oYXNoKGNvbnN0IG9pZCAqIGF1dGh0eXBlLCBzaXplX3QgYXV0aHR5cGVsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICoga2V5LCB1X2ludCBrZXlsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogbWVzc2FnZSwgdV9pbnQgbXNnbGVuLAogICAgICAgICAgICAgICAgICAgICAgIHVfY2hhciAqIE1BQywgc2l6ZV90ICogbWFjbGVuKQojaWYgIGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1KSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTykKewogICAgaW50ICAgICAgICAgICAgIHJ2YWwgPSBTTk1QRVJSX1NVQ0NFU1M7CiAgICBpbnQgICAgICAgICAgICAgaXByb3Blcmxlbmd0aDsKICAgIHNpemVfdCAgICAgICAgICBwcm9wZXJsZW5ndGg7CgogICAgdV9jaGFyICAgICAgICAgIGJ1ZltTTk1QX01BWEJVRl9TTUFMTF07CiNpZiAgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkKICAgIHVuc2lnbmVkIGludCAgICBidWZfbGVuID0gc2l6ZW9mKGJ1Zik7CiNlbmRpZgoKICAgIERFQlVHVFJBQ0U7CgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGk7CiAgICAgICAgREVCVUdNU0coKCJzY19nZW5lcmF0ZV9rZXllZF9oYXNoIiwKICAgICAgICAgICAgICAgICAgInNjX2dlbmVyYXRlX2tleWVkX2hhc2goKToga2V5PTB4IikpOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBrZXlsZW47IGkrKykKICAgICAgICAgICAgREVCVUdNU0coKCJzY19nZW5lcmF0ZV9rZXllZF9oYXNoIiwgIiUwMngiLCBrZXlbaV0gJiAweGZmKSk7CiAgICAgICAgREVCVUdNU0coKCJzY19nZW5lcmF0ZV9rZXllZF9oYXNoIiwgIiAoJWQpXG4iLCBrZXlsZW4pKTsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUgKi8KCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiAgICBpZiAoIWF1dGh0eXBlIHx8ICFrZXkgfHwgIW1lc3NhZ2UgfHwgIU1BQyB8fCAhbWFjbGVuCiAgICAgICAgfHwgKGtleWxlbiA8PSAwKSB8fCAobXNnbGVuIDw9IDApIHx8ICgqbWFjbGVuIDw9IDApCiAgICAgICAgfHwgKGF1dGh0eXBlbGVuICE9IFVTTV9MRU5HVEhfT0lEX1RSQU5TRk9STSkpIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQoKICAgIGlwcm9wZXJsZW5ndGggPSBzY19nZXRfcHJvcGVybGVuZ3RoKGF1dGh0eXBlLCBhdXRodHlwZWxlbik7CiAgICBpZiAoaXByb3Blcmxlbmd0aCA9PSBTTk1QRVJSX0dFTkVSUikKICAgICAgICByZXR1cm4gU05NUEVSUl9HRU5FUlI7CiAgICBwcm9wZXJsZW5ndGggPSAoc2l6ZV90KWlwcm9wZXJsZW5ndGg7CiAgICBpZiAoa2V5bGVuIDwgcHJvcGVybGVuZ3RoKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KI2lmZGVmIE5FVFNOTVBfVVNFX09QRU5TU0wKICAgIC8qCiAgICAgKiBEZXRlcm1pbmUgdHJhbnNmb3JtIHR5cGUuCiAgICAgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oYXV0aHR5cGUsIEhNQUNNRDVBdXRoKSkKICAgICAgICBITUFDKEVWUF9tZDUoKSwga2V5LCBrZXlsZW4sIG1lc3NhZ2UsIG1zZ2xlbiwgYnVmLCAmYnVmX2xlbik7CiAgICBlbHNlCiNlbmRpZgogICAgICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ1NIQTFBdXRoKSkKICAgICAgICBITUFDKEVWUF9zaGExKCksIGtleSwga2V5bGVuLCBtZXNzYWdlLCBtc2dsZW4sIGJ1ZiwgJmJ1Zl9sZW4pOwogICAgZWxzZSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KICAgIGlmIChidWZfbGVuICE9IHByb3Blcmxlbmd0aCkgewogICAgICAgIFFVSVRGVU4ocnZhbCwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KICAgIGlmICgqbWFjbGVuID4gYnVmX2xlbikKICAgICAgICAqbWFjbGVuID0gYnVmX2xlbjsKICAgIG1lbWNweShNQUMsIGJ1ZiwgKm1hY2xlbik7CgojZWxpZiBORVRTTk1QX1VTRV9QS0NTMTEgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX1BLQ1MxMSAqLwoKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oYXV0aHR5cGUsIEhNQUNNRDVBdXRoKSkgewoJaWYgKHBrY3Nfc2lnbihDS01fTUQ1X0hNQUMsa2V5LCBrZXlsZW4sIG1lc3NhZ2UsCgkJCW1zZ2xlbiwgYnVmLCAmYnVmX2xlbikgIT0gU05NUEVSUl9TVUNDRVNTKSB7CiAgICAgICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdCk7CiAgICAgICAgfQogICAgfSBlbHNlCiNlbmRpZgogICAgICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ1NIQTFBdXRoKSkgewoJaWYgKHBrY3Nfc2lnbihDS01fU0hBXzFfSE1BQyxrZXksIGtleWxlbiwgbWVzc2FnZSwKCQkJbXNnbGVuLCBidWYsICZidWZfbGVuKSAhPSBTTk1QRVJSX1NVQ0NFU1MpIHsKICAgICAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZ2VuZXJhdGVfa2V5ZWRfaGFzaF9xdWl0KTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdCk7CiAgICB9CgogICAgaWYgKGJ1Zl9sZW4gIT0gcHJvcGVybGVuZ3RoKSB7CiAgICAgICAgUVVJVEZVTihydmFsLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQogICAgaWYgKCptYWNsZW4gPiBidWZfbGVuKQogICAgICAgICptYWNsZW4gPSBidWZfbGVuOwogICAgbWVtY3B5KE1BQywgYnVmLCAqbWFjbGVuKTsKCiNlbGlmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwogICAgaWYgKCptYWNsZW4gPiBwcm9wZXJsZW5ndGgpCiAgICAgICAgKm1hY2xlbiA9IHByb3Blcmxlbmd0aDsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oYXV0aHR5cGUsIEhNQUNNRDVBdXRoKSkKICAgICAgICBydmFsID0gTUQ1X2htYWMobWVzc2FnZSwgbXNnbGVuLCBNQUMsICptYWNsZW4sIGtleSwga2V5bGVuKTsKICAgIGVsc2UKI2VuZGlmCiAgICAgICAgIGlmIChJU1RSQU5TRk9STShhdXRodHlwZSwgSE1BQ1NIQTFBdXRoKSkKICAgICAgICBydmFsID0gU0hBMV9obWFjKG1lc3NhZ2UsIG1zZ2xlbiwgTUFDLCAqbWFjbGVuLCBrZXksIGtleWxlbik7CiAgICBlbHNlIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoX3F1aXQpOwogICAgfQogICAgaWYgKHJ2YWwgIT0gMCkgewogICAgICAgIHJ2YWwgPSBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBnb3RvIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdDsKICAgIH0gICAgCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSAqLwogICAgaWYgKCptYWNsZW4gPiBwcm9wZXJsZW5ndGgpCiAgICAgICAgKm1hY2xlbiA9IHByb3Blcmxlbmd0aDsKICAgIGlmIChNRHNpZ24obWVzc2FnZSwgbXNnbGVuLCBNQUMsICptYWNsZW4sIGtleSwga2V5bGVuKSkgewogICAgICAgIHJ2YWwgPSBTTk1QRVJSX0dFTkVSUjsKICAgICAgICBnb3RvIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdDsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9PUEVOU1NMICovCgojaWZkZWYgTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFCiAgICB7CiAgICAgICAgY2hhciAgICAgICAgICAgKnM7CiAgICAgICAgaW50ICAgICAgICAgICAgIGxlbiA9IGJpbmFyeV90b19oZXgoTUFDLCAqbWFjbGVuLCAmcyk7CgogICAgICAgIERFQlVHTVNHVEwoKCJzY2FwaSIsICJGdWxsIHYzIG1lc3NhZ2UgaGFzaDogJXNcbiIsIHMpKTsKICAgICAgICBTTk1QX1pFUk8ocywgbGVuKTsKICAgICAgICBTTk1QX0ZSRUUocyk7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCgogIHNjX2dlbmVyYXRlX2tleWVkX2hhc2hfcXVpdDoKICAgIG1lbXNldChidWYsIDAsIFNOTVBfTUFYQlVGX1NNQUxMKTsKICAgIHJldHVybiBydmFsOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBzY19nZW5lcmF0ZV9rZXllZF9oYXNoKCkgKi8KCiNlbHNlCiAgICAgICAgICAgICAgICBfU0NBUElfTk9UX0NPTkZJR1VSRUQKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwovKgogKiBzY19oYXNoKCk6IGEgZ2VuZXJpYyB3cmFwcGVyIGFyb3VuZCB3aGF0ZXZlciBoYXNoaW5nIHBhY2thZ2Ugd2UgYXJlIHVzaW5nLgogKiAKICogSU46CiAqIGhhc2h0eXBlICAgIC0gb2lkIHBvaW50ZXIgdG8gYSBoYXNoIHR5cGUKICogaGFzaHR5cGVsZW4gLSBsZW5ndGggb2Ygb2lkIHBvaW50ZXIKICogYnVmICAgICAgICAgLSB1X2NoYXIgYnVmZmVyIHRvIGJlIGhhc2hlZAogKiBidWZfbGVuICAgICAtIGludGVnZXIgbGVuZ3RoIG9mIGJ1ZiBkYXRhCiAqIE1BQ19sZW4gICAgIC0gbGVuZ3RoIG9mIHRoZSBwYXNzZWQgTUFDIGJ1ZmZlciBzaXplLgogKiAKICogT1VUOiAgICAKICogTUFDICAgICAgICAgLSBwcmUtbWFsbG9jZWQgc3BhY2UgdG8gc3RvcmUgaGFzaCBvdXRwdXQuCiAqIE1BQ19sZW4gICAgIC0gbGVuZ3RoIG9mIE1BQyBvdXRwdXQgdG8gdGhlIE1BQyBidWZmZXIuCiAqIAogKiBSZXR1cm5zOgogKiBTTk1QRVJSX1NVQ0NFU1MgICAgICAgICAgICAgIFN1Y2Nlc3MuCiAqIFNOTVBfU0NfR0VORVJBTF9GQUlMVVJFICAgICAgQW55IGVycm9yLgogKiBTTk1QRVJSX1NDX05PVF9DT05GSUdVUkVEICAgIEhhc2ggdHlwZSBub3Qgc3VwcG9ydGVkLgogKi8KaW50CnNjX2hhc2goY29uc3Qgb2lkICogaGFzaHR5cGUsIHNpemVfdCBoYXNodHlwZWxlbiwgY29uc3QgdV9jaGFyICogYnVmLAogICAgICAgIHNpemVfdCBidWZfbGVuLCB1X2NoYXIgKiBNQUMsIHNpemVfdCAqIE1BQ19sZW4pCiNpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCnsKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9QS0NTMTEpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPKQogICAgaW50ICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKI2VuZGlmCiNpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfUEtDUzExKQogICAgdW5zaWduZWQgaW50ICAgdG1wX2xlbjsKI2VuZGlmCiAgICBpbnQgICAgICAgICAgICByZXQ7CgojaWZkZWYgTkVUU05NUF9VU0VfT1BFTlNTTAogICAgY29uc3QgRVZQX01EICAgKmhhc2hmbjsKICAgIEVWUF9NRF9DVFggICAgICpjcHRyOwojZW5kaWYKI2lmZGVmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX0NSWVBUTwogICAgTUQ1X0NUWCAgICAgICAgY21kNTsKICAgIFNIQV9DVFggICAgICAgIGNzaGExOwojZW5kaWYKICAgIERFQlVHVFJBQ0U7CgogICAgaWYgKGhhc2h0eXBlID09IE5VTEwgfHwgYnVmID09IE5VTEwgfHwgYnVmX2xlbiA8PSAwIHx8CiAgICAgICAgTUFDID09IE5VTEwgfHwgTUFDX2xlbiA9PSBOVUxMICkKICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsKICAgIHJldCA9IHNjX2dldF9wcm9wZXJsZW5ndGgoaGFzaHR5cGUsIGhhc2h0eXBlbGVuKTsKICAgIGlmICgoIHJldCA8IDAgKSB8fCAoKk1BQ19sZW4gPCAoc2l6ZV90KXJldCApKQogICAgICAgIHJldHVybiAoU05NUEVSUl9HRU5FUlIpOwoKI2lmZGVmIE5FVFNOTVBfVVNFX09QRU5TU0wKICAgIC8qCiAgICAgKiBEZXRlcm1pbmUgdHJhbnNmb3JtIHR5cGUuCiAgICAgKi8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNNRDVBdXRoKSkgewogICAgICAgIGhhc2hmbiA9IChjb25zdCBFVlBfTUQgKikgRVZQX21kNSgpOwogICAgfSBlbHNlCiNlbmRpZgogICAgICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ1NIQTFBdXRoKSkgewogICAgICAgIGhhc2hmbiA9IChjb25zdCBFVlBfTUQgKikgRVZQX3NoYTEoKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIChTTk1QRVJSX0dFTkVSUik7CiAgICB9CgovKiogaW5pdGlhbGl6ZSB0aGUgcG9pbnRlciAqLwojaWZkZWYgSEFWRV9FVlBfTURfQ1RYX0NSRUFURQogICAgY3B0ciA9IEVWUF9NRF9DVFhfY3JlYXRlKCk7CiNlbHNlCiAgICBjcHRyID0gbWFsbG9jKHNpemVvZigqY3B0cikpOwojaWYgZGVmaW5lZChPTERfREVTKQogICAgbWVtc2V0KGNwdHIsIDAsIHNpemVvZigqY3B0cikpOwojZWxzZQogICAgRVZQX01EX0NUWF9pbml0KGNwdHIpOwojZW5kaWYKI2VuZGlmCiAgICBpZiAoIUVWUF9EaWdlc3RJbml0KGNwdHIsIGhhc2hmbikpIHsKICAgICAgICAvKiByZXF1ZXN0ZWQgaGFzaCBmdW5jdGlvbiBpcyBub3QgYXZhaWxhYmxlICovCiAgICAgICAgcmV0dXJuIFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQ7CiAgICB9CgovKiogcGFzcyB0aGUgZGF0YSAqLwogICAgRVZQX0RpZ2VzdFVwZGF0ZShjcHRyLCBidWYsIGJ1Zl9sZW4pOwoKLyoqIGRvIHRoZSBmaW5hbCBwYXNzICovCiAgICBFVlBfRGlnZXN0RmluYWwoY3B0ciwgTUFDLCAmdG1wX2xlbik7CiAgICAqTUFDX2xlbiA9IHRtcF9sZW47CiNpZmRlZiBIQVZFX0VWUF9NRF9DVFhfREVTVFJPWQogICAgRVZQX01EX0NUWF9kZXN0cm95KGNwdHIpOwojZWxzZQojaWYgIWRlZmluZWQoT0xEX0RFUykKICAgIEVWUF9NRF9DVFhfY2xlYW51cChjcHRyKTsKI2VuZGlmCiAgICBmcmVlKGNwdHIpOwojZW5kaWYKICAgIHJldHVybiAocnZhbCk7CgojZWxpZiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8KI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUQ1CiAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNNRDVBdXRoKSkgewogICAgICAgIGlmICgqTUFDX2xlbiA8IE1ENV9ESUdFU1RfTEVOR1RIKQogICAgICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsgICAgICAvKiB0aGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggKi8KCU1ENV9Jbml0KCZjbWQ1KTsKICAgICAgICBNRDVfVXBkYXRlKCZjbWQ1LCBidWYsIGJ1Zl9sZW4pOwogICAgICAgIE1ENV9GaW5hbChNQUMsICZjbWQ1KTsKICAgICAgICAqTUFDX2xlbiA9IE1ENV9ESUdFU1RfTEVOR1RIOwogICAgfSBlbHNlIAojZW5kaWYKICAgIGlmIChJU1RSQU5TRk9STShoYXNodHlwZSwgSE1BQ1NIQTFBdXRoKSkgewogICAgICAgIGlmICgqTUFDX2xlbiA8IFNIQV9ESUdFU1RfTEVOR1RIKQogICAgICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsgICAgICAvKiB0aGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggKi8KCVNIQTFfSW5pdCgmY3NoYTEpOwogICAgICAgIFNIQTFfVXBkYXRlKCZjc2hhMSwgYnVmLCBidWZfbGVuKTsKICAgICAgICBTSEExX0ZpbmFsKE1BQywgJmNzaGExKTsKICAgICAgICAqTUFDX2xlbiA9IFNIQV9ESUdFU1RfTEVOR1RIOwogICAgICAgICAgICAKICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIChTTk1QRVJSX0dFTkVSUik7CiAgICB9CiAgICByZXR1cm4gKHJ2YWwpOwojZWxpZiBORVRTTk1QX1VTRV9QS0NTMTEgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9QS0NTMTEgKi8KCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX01ENQogICAgaWYgKElTVFJBTlNGT1JNKGhhc2h0eXBlLCBITUFDTUQ1QXV0aCkpIHsKCXJ2YWwgPSBwa2NzX2RpZ2VzdChDS01fTUQ1LCBidWYsIGJ1Zl9sZW4sIE1BQywgJnRtcF9sZW4pOwogICAgICAgICpNQUNfbGVuID0gdG1wX2xlbjsKICAgIH0gZWxzZQojZW5kaWYKICAgICAgICBpZiAoSVNUUkFOU0ZPUk0oaGFzaHR5cGUsIEhNQUNTSEExQXV0aCkpIHsKCXJ2YWwgPSBwa2NzX2RpZ2VzdChDS01fU0hBXzEsIGJ1ZiwgYnVmX2xlbiwgTUFDLCAmdG1wX2xlbik7CiAgICAgICAgKk1BQ19sZW4gPSB0bXBfbGVuOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gKFNOTVBFUlJfR0VORVJSKTsKICAgIH0KCiAgICAgcmV0dXJuIChydmFsKTsKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCgogICAgaWYgKE1EY2hlY2tzdW0oYnVmLCBidWZfbGVuLCBNQUMsICpNQUNfbGVuKSkgewogICAgICAgIHJldHVybiBTTk1QRVJSX0dFTkVSUjsKICAgIH0KICAgIGlmICgqTUFDX2xlbiA+IDE2KQogICAgICAgICpNQUNfbGVuID0gMTY7CiAgICByZXR1cm4gU05NUEVSUl9TVUNDRVNTOwoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9PUEVOU1NMICovCn0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSAmJiAhZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9NRDUpICovCl9TQ0FQSV9OT1RfQ09ORklHVVJFRAojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpICYmICFkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogc2NfY2hlY2tfa2V5ZWRfaGFzaAogKgogKiBQYXJhbWV0ZXJzOgogKgkgYXV0aHR5cGUJVHJhbnNmb3JtIHR5cGUgb2YgYXV0aGVudGljYXRpb24gaGFzaC4KICoJKmtleQkJS2V5IGJpdHMgaW4gYSBzdHJpbmcgb2YgYnl0ZXMuCiAqCSBrZXlsZW4JCUxlbmd0aCBvZiBrZXkgaW4gYnl0ZXMuCiAqCSptZXNzYWdlCU1lc3NhZ2UgZm9yIHdoaWNoIHRvIGNoZWNrIHRoZSBoYXNoLgogKgkgbXNnbGVuCQlMZW5ndGggb2YgbWVzc2FnZS4KICoJKk1BQwkJR2l2ZW4gaGFzaC4KICoJIG1hY2xlbgkJTGVuZ3RoIG9mIGdpdmVuIGhhc2g7IGluZGljYXRlcyB0cnVuY2F0aW9uIGlmIGl0IGlzCiAqCQkJCXNob3J0ZXIgdGhhbiB0aGUgbm9ybWFsIHNpemUgb2Ygb3V0cHV0IGZvcgogKgkJCQlnaXZlbiBoYXNoIHRyYW5zZm9ybS4KICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQlTdWNjZXNzLgogKglTTk1QX1NDX0dFTkVSQUxfRkFJTFVSRQlBbnkgZXJyb3IKICoKICoKICogQ2hlY2sgdGhlIGhhc2ggZ2l2ZW4gaW4gTUFDIGFnYWluc3QgdGhlIGhhc2ggb2YgbWVzc2FnZS4gIElmIHRoZSBsZW5ndGgKICogb2YgTUFDIGlzIGxlc3MgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSB0cmFuc2Zvcm0gaGFzaCBvdXRwdXQsIG9ubHkgbWFjbGVuCiAqIGJ5dGVzIGFyZSBjb21wYXJlZC4gIFRoZSBsZW5ndGggb2YgTUFDIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlCiAqIGxlbmd0aCBvZiB0aGUgaGFzaCB0cmFuc2Zvcm0gb3V0cHV0LgogKi8KaW50CnNjX2NoZWNrX2tleWVkX2hhc2goY29uc3Qgb2lkICogYXV0aHR5cGUsIHNpemVfdCBhdXRodHlwZWxlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBrZXksIHVfaW50IGtleWxlbiwKICAgICAgICAgICAgICAgICAgICBjb25zdCB1X2NoYXIgKiBtZXNzYWdlLCB1X2ludCBtc2dsZW4sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdV9jaGFyICogTUFDLCB1X2ludCBtYWNsZW4pCiNpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9PUEVOU1NMKSB8fCBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCnsKICAgIGludCAgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwogICAgc2l6ZV90ICAgICAgICAgIGJ1Zl9sZW4gPSBTTk1QX01BWEJVRl9TTUFMTDsKCiAgICB1X2NoYXIgICAgICAgICAgYnVmW1NOTVBfTUFYQlVGX1NNQUxMXTsKCiAgICBERUJVR1RSQUNFOwoKI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgewogICAgICAgIGludCAgICAgICAgICAgICBpOwogICAgICAgIERFQlVHTVNHKCgic2NhcGkiLCAic2NfY2hlY2tfa2V5ZWRfaGFzaCgpOiAgICBrZXk9MHgiKSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGtleWxlbjsgaSsrKQogICAgICAgICAgICBERUJVR01TRygoInNjYXBpIiwgIiUwMngiLCBrZXlbaV0gJiAweGZmKSk7CiAgICAgICAgREVCVUdNU0coKCJzY2FwaSIsICIgKCVkKVxuIiwga2V5bGVuKSk7CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCgogICAgLyoKICAgICAqIFNhbml0eSBjaGVjay4KICAgICAqLwogICAgaWYgKCFhdXRodHlwZSB8fCAha2V5IHx8ICFtZXNzYWdlIHx8ICFNQUMKICAgICAgICB8fCAoa2V5bGVuIDw9IDApIHx8IChtc2dsZW4gPD0gMCkgfHwgKG1hY2xlbiA8PSAwKQogICAgICAgIHx8IChhdXRodHlwZWxlbiAhPSBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfY2hlY2tfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KCgogICAgaWYgKG1hY2xlbiAhPSBVU01fTUQ1X0FORF9TSEFfQVVUSF9MRU4pIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19jaGVja19rZXllZF9oYXNoX3F1aXQpOwogICAgfQogICAgCiAgICAvKgogICAgICogR2VuZXJhdGUgYSBmdWxsIGhhc2ggb2YgdGhlIG1lc3NhZ2UsIHRoZW4gY29tcGFyZQogICAgICogdGhlIHJlc3VsdCB3aXRoIHRoZSBnaXZlbiBNQUMgd2hpY2ggbWF5IHNob3J0ZXIgdGhhbgogICAgICogdGhlIGZ1bGwgaGFzaCBsZW5ndGguCiAgICAgKi8KICAgIHJ2YWwgPSBzY19nZW5lcmF0ZV9rZXllZF9oYXNoKGF1dGh0eXBlLCBhdXRodHlwZWxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwga2V5bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgbXNnbGVuLCBidWYsICZidWZfbGVuKTsKICAgIFFVSVRGVU4ocnZhbCwgc2NfY2hlY2tfa2V5ZWRfaGFzaF9xdWl0KTsKCiAgICBpZiAobWFjbGVuID4gbXNnbGVuKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfY2hlY2tfa2V5ZWRfaGFzaF9xdWl0KTsKCiAgICB9IGVsc2UgaWYgKG1lbWNtcChidWYsIE1BQywgbWFjbGVuKSAhPSAwKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfY2hlY2tfa2V5ZWRfaGFzaF9xdWl0KTsKICAgIH0KCgogIHNjX2NoZWNrX2tleWVkX2hhc2hfcXVpdDoKICAgIG1lbXNldChidWYsIDAsIFNOTVBfTUFYQlVGX1NNQUxMKTsKCiAgICByZXR1cm4gcnZhbDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNjX2NoZWNrX2tleWVkX2hhc2goKSAqLwoKI2Vsc2UKX1NDQVBJX05PVF9DT05GSUdVUkVECiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNjX2VuY3J5cHQKICoKICogUGFyYW1ldGVyczoKICoJIHByaXZ0eXBlCVR5cGUgb2YgcHJpdmFjeSBjcnlwdG9ncmFwaGljIHRyYW5zZm9ybS4KICoJKmtleQkJS2V5IGJpdHMgZm9yIGNyeXB0aW5nLgogKgkga2V5bGVuCQlMZW5ndGggb2Yga2V5IChidWZmZXIpIGluIGJ5dGVzLgogKgkqaXYJCUlWIGJpdHMgZm9yIGNyeXB0aW5nLgogKgkgaXZsZW4JCUxlbmd0aCBvZiBpdiAoYnVmZmVyKSBpbiBieXRlcy4KICoJKnBsYWludGV4dAlQbGFpbnRleHQgdG8gY3J5cHQuCiAqCSBwdGxlbgkJTGVuZ3RoIG9mIHBsYWludGV4dC4KICoJKmNpcGhlcnRleHQJQ2lwaGVydGV4dCB0byBjcnlwdC4KICoJKmN0bGVuCQlMZW5ndGggb2YgY2lwaGVydGV4dC4KICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJU3VjY2Vzcy4KICoJU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRAlFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAqCVNOTVBFUlJfU0NfR0VORVJBTF9GQUlMVVJFCUFueSBvdGhlciBlcnJvcgogKgogKgogKiBFbmNyeXB0IHBsYWludGV4dCBpbnRvIGNpcGhlcnRleHQgdXNpbmcga2V5IGFuZCBpdi4KICoKICogY3RsZW4gY29udGFpbnMgYWN0dWFsIG51bWJlciBvZiBjcnlwdGVkIGJ5dGVzIGluIGNpcGhlcnRleHQgdXBvbgogKiBzdWNjZXNzZnVsIHJldHVybi4KICovCmludApzY19lbmNyeXB0KGNvbnN0IG9pZCAqIHByaXZ0eXBlLCBzaXplX3QgcHJpdnR5cGVsZW4sCiAgICAgICAgICAgdV9jaGFyICoga2V5LCB1X2ludCBrZXlsZW4sCiAgICAgICAgICAgdV9jaGFyICogaXYsIHVfaW50IGl2bGVuLAogICAgICAgICAgIGNvbnN0IHVfY2hhciAqIHBsYWludGV4dCwgdV9pbnQgcHRsZW4sCiAgICAgICAgICAgdV9jaGFyICogY2lwaGVydGV4dCwgc2l6ZV90ICogY3RsZW4pCiNpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX09QRU5TU0wpIHx8IGRlZmluZWQoTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPKQp7CiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgIHVfaW50ICAgICAgICAgICBwcm9wZXJsZW5ndGggPSAwLCBwcm9wZXJsZW5ndGhfaXYgPSAwOwogICAgdV9jaGFyICAgICAgICAgIHBhZF9ibG9ja1sxMjhdOyAgICAgIC8qIGJpZ2dlciB0aGFuIGFueXRoaW5nIEkgbmVlZCAqLwogICAgdV9jaGFyICAgICAgICAgIG15X2l2WzEyOF07ICAvKiBkaXR0byAqLwogICAgaW50ICAgICAgICAgICAgIHBhZCwgcGxhc3QsIHBhZF9zaXplID0gMDsKICAgIGludCAgICAgICAgICAgICBoYXZlX3RyYW5zOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKI2lmZGVmIE9MRF9ERVMKICAgIERFU19rZXlfc2NoZWR1bGUga2V5X3NjaDsKI2Vsc2UKICAgIERFU19rZXlfc2NoZWR1bGUga2V5X3NjaGVkX3N0b3JlOwogICAgREVTX2tleV9zY2hlZHVsZSAqa2V5X3NjaCA9ICZrZXlfc2NoZWRfc3RvcmU7CiNlbmRpZgogICAgREVTX2NibG9jayAgICAgICBrZXlfc3RydWN0OwojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBBRVNfS0VZIGFlc19rZXk7CiAgICBpbnQgbmV3X2l2bGVuID0gMDsKI2VuZGlmCgogICAgREVCVUdUUkFDRTsKCiAgICAvKgogICAgICogU2FuaXR5IGNoZWNrLgogICAgICovCiNpZgkhZGVmaW5lZChORVRTTk1QX0VOQUJMRV9TQ0FQSV9BVVRIUFJJVikKICAgIHNubXBfbG9nKExPR19FUlIsICJFbmNyeXB0aW9uIHN1cHBvcnQgbm90IGVuYWJsZWQuXG4iKTsKICAgIHJldHVybiBTTk1QRVJSX1NDX05PVF9DT05GSUdVUkVEOwojZW5kaWYKCiAgICBpZiAoIXByaXZ0eXBlIHx8ICFrZXkgfHwgIWl2IHx8ICFwbGFpbnRleHQgfHwgIWNpcGhlcnRleHQgfHwgIWN0bGVuCiAgICAgICAgfHwgKGtleWxlbiA8PSAwKSB8fCAoaXZsZW4gPD0gMCkgfHwgKHB0bGVuIDw9IDApIHx8ICgqY3RsZW4gPD0gMCkKICAgICAgICB8fCAocHJpdnR5cGVsZW4gIT0gVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNKSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7CiAgICB9IGVsc2UgaWYgKHB0bGVuID4gKmN0bGVuKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsKICAgIH0KI2lmZGVmIE5FVFNOTVBfRU5BQkxFX1RFU1RJTkdfQ09ERQogICAgewogICAgICAgIHNpemVfdCAgICAgICAgICBidWZfbGVuID0gMTI4LCBvdXRfbGVuID0gMDsKICAgICAgICB1X2NoYXIgICAgICAgICAqYnVmID0gKHVfY2hhciAqKSBtYWxsb2MoYnVmX2xlbik7CgogICAgICAgIGlmIChidWYgIT0gTlVMTCkgewogICAgICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdiwgaXZsZW4pKSB7CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic2NhcGkiLCAiZW5jcnlwdDogSVY6ICVzLyIsIGJ1ZikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgImVuY3J5cHQ6IElWOiAlcyBbVFJVTkNBVEVEXS8iLCBidWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRfbGVuID0gMDsKICAgICAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LCBrZXlsZW4pKSB7CiAgICAgICAgICAgICAgICBERUJVR01TRygoInNjYXBpIiwgIiVzXG4iLCBidWYpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHKCgic2NhcGkiLCAiJXMgW1RSVU5DQVRFRF1cbiIsIGJ1ZikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dF9sZW4gPSAwOwogICAgICAgICAgICBpZiAoc3ByaW50X3JlYWxsb2NfaGV4c3RyaW5nKCZidWYsICZidWZfbGVuLCAmb3V0X2xlbiwgMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbnRleHQsIDE2KSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgImVuY3J5cHQ6IHN0cmluZzogJXNcbiIsIGJ1ZikpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgImVuY3J5cHQ6IHN0cmluZzogJXMgW1RSVU5DQVRFRF1cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVuY3J5cHQ6IG1hbGxvYyBmYWlsIGZvciBkZWJ1ZyBvdXRwdXRcbiIpKTsKICAgICAgICB9CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCgoKICAgIC8qCiAgICAgKiBEZXRlcm1pbmUgcHJpdmFjeSB0cmFuc2Zvcm0uCiAgICAgKi8KICAgIGhhdmVfdHJhbnMgPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKICAgICAgICBwcm9wZXJsZW5ndGggPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVNfSVYpOwogICAgICAgIHBhZF9zaXplID0gcHJvcGVybGVuZ3RoOwogICAgICAgIGhhdmVfdHJhbnMgPSAxOwogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIEFFU1ByaXYpKSB7CiAgICAgICAgcHJvcGVybGVuZ3RoID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOX0FFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOX0FFU19JVik7CiAgICAgICAgaGF2ZV90cmFucyA9IDE7CiAgICB9CiNlbmRpZgogICAgaWYgKCFoYXZlX3RyYW5zKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsKICAgIH0KCiAgICBpZiAoKGtleWxlbiA8IHByb3Blcmxlbmd0aCkgfHwgKGl2bGVuIDwgcHJvcGVybGVuZ3RoX2l2KSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7CiAgICB9CgogICAgbWVtc2V0KG15X2l2LCAwLCBzaXplb2YobXlfaXYpKTsKCiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewoKICAgICAgICAvKgogICAgICAgICAqIG5vdyBjYWxjdWxhdGUgdGhlIHBhZGRpbmcgbmVlZGVkIAogICAgICAgICAqLwogICAgICAgIHBhZCA9IHBhZF9zaXplIC0gKHB0bGVuICUgcGFkX3NpemUpOwogICAgICAgIHBsYXN0ID0gKGludCkgcHRsZW4gLSAocGFkX3NpemUgLSBwYWQpOwogICAgICAgIGlmIChwYWQgPT0gcGFkX3NpemUpCiAgICAgICAgICAgIHBhZCA9IDA7CiAgICAgICAgaWYgKHB0bGVuICsgcGFkID4gKmN0bGVuKSB7CiAgICAgICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2VuY3J5cHRfcXVpdCk7ICAgIC8qIG5vdCBlbm91Z2ggc3BhY2UgKi8KICAgICAgICB9CiAgICAgICAgaWYgKHBhZCA+IDApIHsgICAgICAgICAgICAgIC8qIGNvcHkgZGF0YSBpbnRvIHBhZCBibG9jayBpZiBuZWVkZWQgKi8KICAgICAgICAgICAgbWVtY3B5KHBhZF9ibG9jaywgcGxhaW50ZXh0ICsgcGxhc3QsIHBhZF9zaXplIC0gcGFkKTsKICAgICAgICAgICAgbWVtc2V0KCZwYWRfYmxvY2tbcGFkX3NpemUgLSBwYWRdLCBwYWQsIHBhZCk7ICAgLyogZmlsbGluZyBpbiBwYWRibG9jayAqLwogICAgICAgIH0KCiAgICAgICAgbWVtY3B5KGtleV9zdHJ1Y3QsIGtleSwgc2l6ZW9mKGtleV9zdHJ1Y3QpKTsKICAgICAgICAodm9pZCkgREVTX2tleV9zY2hlZCgma2V5X3N0cnVjdCwga2V5X3NjaCk7CgogICAgICAgIG1lbWNweShteV9pdiwgaXYsIGl2bGVuKTsKICAgICAgICAvKgogICAgICAgICAqIGVuY3J5cHQgdGhlIGRhdGEgCiAgICAgICAgICovCiAgICAgICAgREVTX25jYmNfZW5jcnlwdChwbGFpbnRleHQsIGNpcGhlcnRleHQsIHBsYXN0LCBrZXlfc2NoLAogICAgICAgICAgICAgICAgICAgICAgICAgKERFU19jYmxvY2sgKikgbXlfaXYsIERFU19FTkNSWVBUKTsKICAgICAgICBpZiAocGFkID4gMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiB0aGVuIGVuY3J5cHQgdGhlIHBhZCBibG9jayAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIERFU19uY2JjX2VuY3J5cHQocGFkX2Jsb2NrLCBjaXBoZXJ0ZXh0ICsgcGxhc3QsIHBhZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9zY2gsIChERVNfY2Jsb2NrICopIG15X2l2LCBERVNfRU5DUllQVCk7CiAgICAgICAgICAgICpjdGxlbiA9IHBsYXN0ICsgcGFkX3NpemU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgKmN0bGVuID0gcGxhc3Q7CiAgICAgICAgfQogICAgfQojZW5kaWYKI2lmZGVmIEhBVkVfQUVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIEFFU1ByaXYpKSB7CiAgICAgICAgKHZvaWQpIEFFU19zZXRfZW5jcnlwdF9rZXkoa2V5LCBwcm9wZXJsZW5ndGgqOCwgJmFlc19rZXkpOwoKICAgICAgICBtZW1jcHkobXlfaXYsIGl2LCBpdmxlbik7CiAgICAgICAgLyoKICAgICAgICAgKiBlbmNyeXB0IHRoZSBkYXRhIAogICAgICAgICAqLwogICAgICAgIEFFU19jZmIxMjhfZW5jcnlwdChwbGFpbnRleHQsIGNpcGhlcnRleHQsIHB0bGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAmYWVzX2tleSwgbXlfaXYsICZuZXdfaXZsZW4sIEFFU19FTkNSWVBUKTsKICAgICAgICAqY3RsZW4gPSBwdGxlbjsKICAgIH0KI2VuZGlmCiAgc2NfZW5jcnlwdF9xdWl0OgogICAgLyoKICAgICAqIGNsZWFyIG1lbW9yeSBqdXN0IGluIGNhc2UgCiAgICAgKi8KICAgIG1lbXNldChteV9pdiwgMCwgc2l6ZW9mKG15X2l2KSk7CiAgICBtZW1zZXQocGFkX2Jsb2NrLCAwLCBzaXplb2YocGFkX2Jsb2NrKSk7CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwogICAgbWVtc2V0KGtleV9zdHJ1Y3QsIDAsIHNpemVvZihrZXlfc3RydWN0KSk7CiNpZmRlZiBPTERfREVTCiAgICBtZW1zZXQoJmtleV9zY2gsIDAsIHNpemVvZihrZXlfc2NoKSk7CiNlbHNlCiAgICBtZW1zZXQoJmtleV9zY2hlZF9zdG9yZSwgMCwgc2l6ZW9mKGtleV9zY2hlZF9zdG9yZSkpOwojZW5kaWYKI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgbWVtc2V0KCZhZXNfa2V5LDAsc2l6ZW9mKGFlc19rZXkpKTsKI2VuZGlmCiAgICByZXR1cm4gcnZhbDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNjX2VuY3J5cHQoKSAqLwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfVVNFX1BLQ1MxMSkKewogICAgaW50ICAgICAgICAgICAgIHJ2YWwgPSBTTk1QRVJSX1NVQ0NFU1M7CiAgICB1X2ludCAgICAgICAgICAgcHJvcGVybGVuZ3RoLCBwcm9wZXJsZW5ndGhfaXY7CiAgICB1X2NoYXIJICAgIHBrY3NfZGVzX2tleVs4XTsKCiAgICBERUJVR1RSQUNFOwoKICAgIC8qCiAgICAgKiBTYW5pdHkgY2hlY2suCiAgICAgKi8KI2lmCSFkZWZpbmVkKE5FVFNOTVBfRU5BQkxFX1NDQVBJX0FVVEhQUklWKQogICAgc25tcF9sb2coTE9HX0VSUiwgIkVuY3J5cHRpb24gc3VwcG9ydCBub3QgZW5hYmxlZC5cbiIpOwogICAgcmV0dXJuIFNOTVBFUlJfU0NfTk9UX0NPTkZJR1VSRUQ7CiNlbmRpZgoKICAgIGlmICghcHJpdnR5cGUgfHwgIWtleSB8fCAhaXYgfHwgIXBsYWludGV4dCB8fCAhY2lwaGVydGV4dCB8fCAhY3RsZW4KICAgICAgICB8fCAoa2V5bGVuIDw9IDApIHx8IChpdmxlbiA8PSAwKSB8fCAocHRsZW4gPD0gMCkgfHwgKCpjdGxlbiA8PSAwKQogICAgICAgIHx8IChwcml2dHlwZWxlbiAhPSBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZW5jcnlwdF9xdWl0KTsKICAgIH0gZWxzZSBpZiAocHRsZW4gPiAqY3RsZW4pIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfQoKICAgIC8qCiAgICAgKiBEZXRlcm1pbmUgcHJpdmFjeSB0cmFuc2Zvcm0uCiAgICAgKi8KICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKICAgICAgICBwcm9wZXJsZW5ndGggPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVNfSVYpOwogICAgfSBlbHNlIHsKICAgICAgICBRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfQoKICAgIGlmICgoa2V5bGVuIDwgcHJvcGVybGVuZ3RoKSB8fCAoaXZsZW4gPCBwcm9wZXJsZW5ndGhfaXYpKSB7CglRVUlURlVOKFNOTVBFUlJfR0VORVJSLCBzY19lbmNyeXB0X3F1aXQpOwogICAgfQoKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKCW1lbXNldChwa2NzX2Rlc19rZXksIDAsIHNpemVvZihwa2NzX2Rlc19rZXkpKTsKCW1lbWNweShwa2NzX2Rlc19rZXksIGtleSwgc2l6ZW9mKHBrY3NfZGVzX2tleSkpOwoJcnZhbCA9IHBrY3NfZW5jcnB5dChDS01fREVTX0NCQywgcGtjc19kZXNfa2V5LAoJCXNpemVvZihwa2NzX2Rlc19rZXkpLCBpdiwgaXZsZW4sIHBsYWludGV4dCwgcHRsZW4sCgkJY2lwaGVydGV4dCwgY3RsZW4pOwogICAgfQoKICBzY19lbmNyeXB0X3F1aXQ6CiAgICByZXR1cm4gcnZhbDsKfQojZWxzZQp7CiMJaWYgTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1CiAgICB7CiAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIkVuY3J5cHRpb24gc3VwcG9ydCBub3QgZW5hYmxlZC5cbiIpOwogICAgICAgIERFQlVHTVNHVEwoKCJzY2FwaSIsICJFbmNyeXB0IGZ1bmN0aW9uIG5vdCBkZWZpbmVkLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NDX0dFTkVSQUxfRkFJTFVSRTsKICAgIH0KCiMJZWxzZQogICAgX1NDQVBJX05PVF9DT05GSUdVUkVECiMJZW5kaWYgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzY19kZWNyeXB0CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBwcml2dHlwZQogKgkqa2V5CiAqCSBrZXlsZW4KICoJKml2CiAqCSBpdmxlbgogKgkqY2lwaGVydGV4dAogKgkgY3RsZW4KICoJKnBsYWludGV4dAogKgkqcHRsZW4KICogICAgICAKICogUmV0dXJuczoKICoJU05NUEVSUl9TVUNDRVNTCQkJU3VjY2Vzcy4KICoJU05NUEVSUl9TQ19OT1RfQ09ORklHVVJFRAlFbmNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAqICAgICAgU05NUEVSUl9TQ19HRU5FUkFMX0ZBSUxVUkUgICAgICBBbnkgb3RoZXIgZXJyb3IKICoKICoKICogRGVjcnlwdCBjaXBoZXJ0ZXh0IGludG8gcGxhaW50ZXh0IHVzaW5nIGtleSBhbmQgaXYuCiAqCiAqIHB0bGVuIGNvbnRhaW5zIGFjdHVhbCBudW1iZXIgb2YgcGxhaW50ZXh0IGJ5dGVzIGluIHBsYWludGV4dCB1cG9uCiAqIHN1Y2Nlc3NmdWwgcmV0dXJuLgogKi8KaW50CnNjX2RlY3J5cHQoY29uc3Qgb2lkICogcHJpdnR5cGUsIHNpemVfdCBwcml2dHlwZWxlbiwKICAgICAgICAgICB1X2NoYXIgKiBrZXksIHVfaW50IGtleWxlbiwKICAgICAgICAgICB1X2NoYXIgKiBpdiwgdV9pbnQgaXZsZW4sCiAgICAgICAgICAgdV9jaGFyICogY2lwaGVydGV4dCwgdV9pbnQgY3RsZW4sCiAgICAgICAgICAgdV9jaGFyICogcGxhaW50ZXh0LCBzaXplX3QgKiBwdGxlbikKI2lmIGRlZmluZWQoTkVUU05NUF9VU0VfT1BFTlNTTCkgfHwgZGVmaW5lZChORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8pCnsKCiAgICBpbnQgICAgICAgICAgICAgcnZhbCA9IFNOTVBFUlJfU1VDQ0VTUzsKICAgIHVfY2hhciAgICAgICAgICBteV9pdlsxMjhdOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKI2lmZGVmIE9MRF9ERVMKICAgIERFU19rZXlfc2NoZWR1bGUga2V5X3NjaDsKI2Vsc2UKICAgIERFU19rZXlfc2NoZWR1bGUga2V5X3NjaGVkX3N0b3JlOwogICAgREVTX2tleV9zY2hlZHVsZSAqa2V5X3NjaCA9ICZrZXlfc2NoZWRfc3RvcmU7CiNlbmRpZgogICAgREVTX2NibG9jayAgICAgIGtleV9zdHJ1Y3Q7CiNlbmRpZgogICAgdV9pbnQgICAgICAgICAgIHByb3Blcmxlbmd0aCA9IDAsIHByb3Blcmxlbmd0aF9pdiA9IDA7CiAgICBpbnQgICAgICAgICAgICAgaGF2ZV90cmFuc2Zvcm07CiNpZmRlZiBIQVZFX0FFUwogICAgaW50IG5ld19pdmxlbiA9IDA7CiAgICBBRVNfS0VZIGFlc19rZXk7CiNlbmRpZgoKICAgIERFQlVHVFJBQ0U7CgogICAgaWYgKCFwcml2dHlwZSB8fCAha2V5IHx8ICFpdiB8fCAhcGxhaW50ZXh0IHx8ICFjaXBoZXJ0ZXh0IHx8ICFwdGxlbgogICAgICAgIHx8IChjdGxlbiA8PSAwKSB8fCAoKnB0bGVuIDw9IDApIHx8ICgqcHRsZW4gPCBjdGxlbikKICAgICAgICB8fCAocHJpdnR5cGVsZW4gIT0gVVNNX0xFTkdUSF9PSURfVFJBTlNGT1JNKSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2RlY3J5cHRfcXVpdCk7CiAgICB9CiNpZmRlZiBORVRTTk1QX0VOQUJMRV9URVNUSU5HX0NPREUKICAgIHsKICAgICAgICBzaXplX3QgICAgICAgICAgYnVmX2xlbiA9IDEyOCwgb3V0X2xlbiA9IDA7CiAgICAgICAgdV9jaGFyICAgICAgICAgKmJ1ZiA9ICh1X2NoYXIgKikgbWFsbG9jKGJ1Zl9sZW4pOwoKICAgICAgICBpZiAoYnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgaWYgKHNwcmludF9yZWFsbG9jX2hleHN0cmluZygmYnVmLCAmYnVmX2xlbiwgJm91dF9sZW4sIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYsIGl2bGVuKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwgImRlY3J5cHQ6IElWOiAlcy8iLCBidWYpKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzY2FwaSIsICJkZWNyeXB0OiBJVjogJXMgW1RSVU5DQVRFRF0vIiwgYnVmKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0X2xlbiA9IDA7CiAgICAgICAgICAgIGlmIChzcHJpbnRfcmVhbGxvY19oZXhzdHJpbmcoJmJ1ZiwgJmJ1Zl9sZW4sICZvdXRfbGVuLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSwga2V5bGVuKSkgewogICAgICAgICAgICAgICAgREVCVUdNU0coKCJzY2FwaSIsICIlc1xuIiwgYnVmKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBERUJVR01TRygoInNjYXBpIiwgIiVzXG4iLCBidWYpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoInNjYXBpIiwKICAgICAgICAgICAgICAgICAgICAgICAgImRlY3J5cHQ6IG1hbGxvYyBmYWlsIGZvciBkZWJ1ZyBvdXRwdXRcbiIpKTsKICAgICAgICB9CiAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9FTkFCTEVfVEVTVElOR19DT0RFICovCgogICAgLyoKICAgICAqIERldGVybWluZSBwcml2YWN5IHRyYW5zZm9ybS4KICAgICAqLwogICAgaGF2ZV90cmFuc2Zvcm0gPSAwOwojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERVMKICAgIGlmIChJU1RSQU5TRk9STShwcml2dHlwZSwgREVTUHJpdikpIHsKICAgICAgICBwcm9wZXJsZW5ndGggPSBCWVRFU0laRShTTk1QX1RSQU5TX1BSSVZMRU5fMURFUyk7CiAgICAgICAgcHJvcGVybGVuZ3RoX2l2ID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVNfSVYpOwogICAgICAgIGhhdmVfdHJhbnNmb3JtID0gMTsKICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBBRVNQcml2KSkgewogICAgICAgIHByb3Blcmxlbmd0aCA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl9BRVMpOwogICAgICAgIHByb3Blcmxlbmd0aF9pdiA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl9BRVNfSVYpOwogICAgICAgIGhhdmVfdHJhbnNmb3JtID0gMTsKICAgIH0KI2VuZGlmCiAgICBpZiAoIWhhdmVfdHJhbnNmb3JtKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KCiAgICBpZiAoKGtleWxlbiA8IHByb3Blcmxlbmd0aCkgfHwgKGl2bGVuIDwgcHJvcGVybGVuZ3RoX2l2KSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2RlY3J5cHRfcXVpdCk7CiAgICB9CgogICAgbWVtc2V0KG15X2l2LCAwLCBzaXplb2YobXlfaXYpKTsKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfREVTCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIERFU1ByaXYpKSB7CiAgICAgICAgbWVtY3B5KGtleV9zdHJ1Y3QsIGtleSwgc2l6ZW9mKGtleV9zdHJ1Y3QpKTsKICAgICAgICAodm9pZCkgREVTX2tleV9zY2hlZCgma2V5X3N0cnVjdCwga2V5X3NjaCk7CgogICAgICAgIG1lbWNweShteV9pdiwgaXYsIGl2bGVuKTsKICAgICAgICBERVNfY2JjX2VuY3J5cHQoY2lwaGVydGV4dCwgcGxhaW50ZXh0LCBjdGxlbiwga2V5X3NjaCwKICAgICAgICAgICAgICAgICAgICAgICAgKERFU19jYmxvY2sgKikgbXlfaXYsIERFU19ERUNSWVBUKTsKICAgICAgICAqcHRsZW4gPSBjdGxlbjsKICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX0FFUwogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBBRVNQcml2KSkgewogICAgICAgICh2b2lkKSBBRVNfc2V0X2VuY3J5cHRfa2V5KGtleSwgcHJvcGVybGVuZ3RoKjgsICZhZXNfa2V5KTsKCiAgICAgICAgbWVtY3B5KG15X2l2LCBpdiwgaXZsZW4pOwogICAgICAgIC8qCiAgICAgICAgICogZW5jcnlwdCB0aGUgZGF0YSAKICAgICAgICAgKi8KICAgICAgICBBRVNfY2ZiMTI4X2VuY3J5cHQoY2lwaGVydGV4dCwgcGxhaW50ZXh0LCBjdGxlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFlc19rZXksIG15X2l2LCAmbmV3X2l2bGVuLCBBRVNfREVDUllQVCk7CiAgICAgICAgKnB0bGVuID0gY3RsZW47CiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBleGl0IGNvbmQgCiAgICAgKi8KICBzY19kZWNyeXB0X3F1aXQ6CiNpZm5kZWYgTkVUU05NUF9ESVNBQkxFX0RFUwojaWZkZWYgT0xEX0RFUwogICAgbWVtc2V0KCZrZXlfc2NoLCAwLCBzaXplb2Yoa2V5X3NjaCkpOwojZWxzZQogICAgbWVtc2V0KCZrZXlfc2NoZWRfc3RvcmUsIDAsIHNpemVvZihrZXlfc2NoZWRfc3RvcmUpKTsKI2VuZGlmCiAgICBtZW1zZXQoa2V5X3N0cnVjdCwgMCwgc2l6ZW9mKGtleV9zdHJ1Y3QpKTsKI2VuZGlmCiAgICBtZW1zZXQobXlfaXYsIDAsIHNpemVvZihteV9pdikpOwogICAgcmV0dXJuIHJ2YWw7Cn0JCQkJLyogVVNFIE9QRU5fU1NMICovCiNlbGlmIE5FVFNOTVBfVVNFX1BLQ1MxMSAgICAgICAgICAgICAgICAgIC8qIFVTRSBQS0NTICovCnsKICAgIGludCAgICAgICAgICAgICBydmFsID0gU05NUEVSUl9TVUNDRVNTOwogICAgdV9pbnQgICAgICAgICAgIHByb3Blcmxlbmd0aCwgcHJvcGVybGVuZ3RoX2l2OwogICAgdV9jaGFyCSAgICBwa2NzX2Rlc19rZXlbOF07CgogICAgREVCVUdUUkFDRTsKCiAgICBpZiAoIXByaXZ0eXBlIHx8ICFrZXkgfHwgIWl2IHx8ICFwbGFpbnRleHQgfHwgIWNpcGhlcnRleHQgfHwgIXB0bGVuCiAgICAgICAgfHwgKGN0bGVuIDw9IDApIHx8ICgqcHRsZW4gPD0gMCkgfHwgKCpwdGxlbiA8IGN0bGVuKQogICAgICAgIHx8IChwcml2dHlwZWxlbiAhPSBVU01fTEVOR1RIX09JRF9UUkFOU0ZPUk0pKSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KCiAgICAvKgogICAgICogRGV0ZXJtaW5lIHByaXZhY3kgdHJhbnNmb3JtLgogICAgICovCiAgICBpZiAoSVNUUkFOU0ZPUk0ocHJpdnR5cGUsIERFU1ByaXYpKSB7CiAgICAgICAgcHJvcGVybGVuZ3RoID0gQllURVNJWkUoU05NUF9UUkFOU19QUklWTEVOXzFERVMpOwogICAgICAgIHByb3Blcmxlbmd0aF9pdiA9IEJZVEVTSVpFKFNOTVBfVFJBTlNfUFJJVkxFTl8xREVTX0lWKTsKICAgIH0gZWxzZSB7CiAgICAgICAgUVVJVEZVTihTTk1QRVJSX0dFTkVSUiwgc2NfZGVjcnlwdF9xdWl0KTsKICAgIH0KCiAgICBpZiAoKGtleWxlbiA8IHByb3Blcmxlbmd0aCkgfHwgKGl2bGVuIDwgcHJvcGVybGVuZ3RoX2l2KSkgewogICAgICAgIFFVSVRGVU4oU05NUEVSUl9HRU5FUlIsIHNjX2RlY3J5cHRfcXVpdCk7CiAgICB9CgogICAgaWYgKElTVFJBTlNGT1JNKHByaXZ0eXBlLCBERVNQcml2KSkgewoJbWVtc2V0KHBrY3NfZGVzX2tleSwgMCwgc2l6ZW9mKHBrY3NfZGVzX2tleSkpOwoJbWVtY3B5KHBrY3NfZGVzX2tleSwga2V5LCBzaXplb2YocGtjc19kZXNfa2V5KSk7CglydmFsID0gcGtjc19kZWNycHl0KENLTV9ERVNfQ0JDLCBwa2NzX2Rlc19rZXksIAoJCXNpemVvZihwa2NzX2Rlc19rZXkpLCBpdiwgaXZsZW4sIGNpcGhlcnRleHQsCgkJY3RsZW4sIHBsYWludGV4dCwgcHRsZW4pOwogICAgICAgICpwdGxlbiA9IGN0bGVuOwogICAgfQoKICBzY19kZWNyeXB0X3F1aXQ6CiAgICByZXR1cm4gcnZhbDsKfQkJCQkvKiBVU0UgUEtDUyAqLwojZWxzZQp7CiNpZgkhZGVmaW5lZChORVRTTk1QX0VOQUJMRV9TQ0FQSV9BVVRIUFJJVikKICAgIHNubXBfbG9nKExPR19FUlIsICJFbmNyeXB0aW9uIHN1cHBvcnQgbm90IGVuYWJsZWQuXG4iKTsKICAgIHJldHVybiBTTk1QRVJSX1NDX05PVF9DT05GSUdVUkVEOwojZWxzZQojCWlmIE5FVFNOTVBfVVNFX0lOVEVSTkFMX01ENQogICAgewogICAgICAgIERFQlVHTVNHVEwoKCJzY2FwaSIsICJEZWNyeXB0aW9uIGZ1bmN0aW9uIG5vdCBkZWZpbmVkLlxuIikpOwogICAgICAgIHJldHVybiBTTk1QRVJSX1NDX0dFTkVSQUxfRkFJTFVSRTsKICAgIH0KCiMJZWxzZQogICAgX1NDQVBJX05PVF9DT05GSUdVUkVECiMJZW5kaWYgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfSU5URVJOQUxfTUQ1ICovCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICovCn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9PUEVOU1NMICovCgojaWZkZWYgTkVUU05NUF9VU0VfSU5URVJOQUxfQ1JZUFRPCgovKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGJhc2ljYWxseSBjb3BpZXMgb2YgdGhlIE1EU2lnbigpIHJvdXRpbmUgaW4KICAgbWQ1LmMgbW9kaWZpZWQgdG8gYmUgdXNlZCB3aXRoIHRoZSBPcGVuU1NMIGhhc2hpbmcgZnVuY3Rpb25zLiAgVGhlCiAgIGNvcHlyaWdodCBiZWxvdyBpcyBmcm9tIHRoZSBtZDUuYyBmaWxlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIHdlcmUKICAgdGFrZW4gZnJvbTogKi8KCi8qCiAqICoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICoqIG1kNS5jIC0tIEltcGxlbWVudGF0aW9uIG9mIE1ENSBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gICAgICAgICAgICAgICAgICoqCiAqICoqIFVwZGF0ZWQ6IDIvMTYvOTAgYnkgUm9uYWxkIEwuIFJpdmVzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCiAqICoqIChDKSAxOTkwIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCiAqICoqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwoKLyoKICogTUQ1X2htYWMoZGF0YSwgbGVuLCBNRDUpOiBkbyBhIGNoZWNrc3VtIG9uIGFuIGFyYmlydHJhcnkgYW1vdW50CiAqIG9mIGRhdGEsIGFuZCBwcmVwZW5kZWQgd2l0aCBhIHNlY3JldCBpbiB0aGUgc3RhbmRhcmQgZmFzaGlvbiAKICovCnN0YXRpYyBpbnQKTUQ1X2htYWMoY29uc3QgdV9jaGFyICogZGF0YSwgc2l6ZV90IGxlbiwgdV9jaGFyICogbWFjLCBzaXplX3QgbWFjbGVuLAogICAgICAgICBjb25zdCB1X2NoYXIgKiBzZWNyZXQsIHNpemVfdCBzZWNyZXRsZW4pCnsKI2RlZmluZSBNRDVfSEFTSEtFWUxFTiA2NAojZGVmaW5lIE1ENV9TRUNSRVRLRVlMRU4gMTYKCiAgICBNRDVfQ1RYICAgICAgICAgY21kNTsKICAgIHVfY2hhciAgICAgICAgICBLMVtNRDVfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgSzJbTUQ1X0hBU0hLRVlMRU5dOwogICAgdV9jaGFyICAgICAgICAgIGV4dGVuZGVkQXV0aEtleVtNRDVfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgYnVmW01ENV9IQVNIS0VZTEVOXTsKICAgIHNpemVfdCAgICAgICAgICBpOwogICAgY29uc3QgdV9jaGFyICAgKmNwOwogICAgdV9jaGFyICAgICAgICAgKm5ld2RhdGEgPSBOVUxMOwogICAgaW50ICAgICAgICAgICAgIHJjID0gMDsKCiAgICAvKgogICAgICogbWVtc2V0KEsxLDAsTUQ1X0hBU0hLRVlMRU4pOwogICAgICogbWVtc2V0KEsyLDAsTUQ1X0hBU0hLRVlMRU4pOwogICAgICogbWVtc2V0KGJ1ZiwwLE1ENV9IQVNIS0VZTEVOKTsKICAgICAqIG1lbXNldChleHRlbmRlZEF1dGhLZXksMCxNRDVfSEFTSEtFWUxFTik7CiAgICAgKi8KCiAgICBpZiAoc2VjcmV0bGVuICE9IE1ENV9TRUNSRVRLRVlMRU4gfHwgc2VjcmV0ID09IE5VTEwgfHwKICAgICAgICBtYWMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwgfHwKICAgICAgICBsZW4gPD0gMCB8fCBtYWNsZW4gPD0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogREVCVUdNU0dUTCgoIm1kNSIsIk1ENSBzaWduaW5nIG5vdCBwcm9wZXJseSBpbml0aWFsaXplZCIpKTsgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIG1lbXNldChleHRlbmRlZEF1dGhLZXksIDAsIE1ENV9IQVNIS0VZTEVOKTsKICAgIG1lbWNweShleHRlbmRlZEF1dGhLZXksIHNlY3JldCwgc2VjcmV0bGVuKTsKICAgIGZvciAoaSA9IDA7IGkgPCBNRDVfSEFTSEtFWUxFTjsgaSsrKSB7CiAgICAgICAgSzFbaV0gPSBleHRlbmRlZEF1dGhLZXlbaV0gXiAweDM2OwogICAgICAgIEsyW2ldID0gZXh0ZW5kZWRBdXRoS2V5W2ldIF4gMHg1YzsKICAgIH0KCiAgICBNRDVfSW5pdCgmY21kNSk7CiAgICByYyA9ICFNRDVfVXBkYXRlKCZjbWQ1LCBLMSwgTUQ1X0hBU0hLRVlMRU4pOwogICAgaWYgKHJjKQogICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKCiAgICBpID0gbGVuOwogICAgaWYgKCgodWludHB0cl90KSBkYXRhKSAlIHNpemVvZihsb25nKSAhPSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGlzIHJlbGllcyBvbiB0aGUgYWJpbGl0eSB0byB1c2UgaW50ZWdlciBtYXRoIGFuZCB0aHVzIHdlCiAgICAgICAgICogbXVzdCByZWx5IG9uIGRhdGEgdGhhdCBhbGlnbnMgb24gMzItYml0LXdvcmQtYm91bmRyaWVzIAogICAgICAgICAqLwogICAgICAgIG5ld2RhdGEgPSBuZXRzbm1wX21lbWR1cChkYXRhLCBsZW4pOwogICAgICAgIGNwID0gbmV3ZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3AgPSBkYXRhOwogICAgfQoKICAgIHdoaWxlIChpID49IDY0KSB7CiAgICAgICAgcmMgPSAhTUQ1X1VwZGF0ZSgmY21kNSwgY3AsIDY0KTsKICAgICAgICBpZiAocmMpCiAgICAgICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKICAgICAgICBjcCArPSA2NDsKICAgICAgICBpIC09IDY0OwogICAgfQoKICAgIHJjID0gIU1ENV9VcGRhdGUoJmNtZDUsIGNwLCBpKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CgogICAgbWVtc2V0KGJ1ZiwgMCwgTUQ1X0hBU0hLRVlMRU4pOwogICAgTUQ1X0ZpbmFsKGJ1ZiwgJmNtZDUpOwoKICAgIE1ENV9Jbml0KCZjbWQ1KTsKICAgIHJjID0gIU1ENV9VcGRhdGUoJmNtZDUsIEsyLCBNRDVfSEFTSEtFWUxFTik7CiAgICBpZiAocmMpCiAgICAgICAgZ290byB1cGRhdGVfZW5kOwogICAgcmMgPSAhTUQ1X1VwZGF0ZSgmY21kNSwgYnVmLCBNRDVfU0VDUkVUS0VZTEVOKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CgogICAgLyoKICAgICAqIGNvcHkgdGhlIHNpZ24gY2hlY2tzdW0gdG8gdGhlIG91dGdvaW5nIHBvaW50ZXIgCiAgICAgKi8KICAgIE1ENV9GaW5hbChidWYsICZjbWQ1KTsKICAgIG1lbWNweShtYWMsIGJ1ZiwgbWFjbGVuKTsKCiAgdXBkYXRlX2VuZDoKICAgIG1lbXNldChidWYsIDAsIE1ENV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldChLMSwgMCwgTUQ1X0hBU0hLRVlMRU4pOwogICAgbWVtc2V0KEsyLCAwLCBNRDVfSEFTSEtFWUxFTik7CiAgICBtZW1zZXQoZXh0ZW5kZWRBdXRoS2V5LCAwLCBNRDVfSEFTSEtFWUxFTik7CiAgICBtZW1zZXQoJmNtZDUsIDAsIHNpemVvZihjbWQ1KSk7CgogICAgaWYgKG5ld2RhdGEpCiAgICAgICAgZnJlZShuZXdkYXRhKTsKICAgIHJldHVybiByYzsKfQoKc3RhdGljIGludApTSEExX2htYWMoY29uc3QgdV9jaGFyICogZGF0YSwgc2l6ZV90IGxlbiwgdV9jaGFyICogbWFjLCBzaXplX3QgbWFjbGVuLAogICAgICAgICAgY29uc3QgdV9jaGFyICogc2VjcmV0LCBzaXplX3Qgc2VjcmV0bGVuKQp7CiNkZWZpbmUgU0hBMV9IQVNIS0VZTEVOICAgNjQKI2RlZmluZSBTSEExX1NFQ1JFVEtFWUxFTiAyMAoKICAgIFNIQV9DVFggICAgICAgICBjc2hhMTsKICAgIHVfY2hhciAgICAgICAgICBLMVtTSEExX0hBU0hLRVlMRU5dOwogICAgdV9jaGFyICAgICAgICAgIEsyW1NIQTFfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgZXh0ZW5kZWRBdXRoS2V5W1NIQTFfSEFTSEtFWUxFTl07CiAgICB1X2NoYXIgICAgICAgICAgYnVmW1NIQTFfSEFTSEtFWUxFTl07CiAgICBzaXplX3QgICAgICAgICAgaTsKICAgIGNvbnN0IHVfY2hhciAgICpjcDsKICAgIHVfY2hhciAgICAgICAgICpuZXdkYXRhID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICByYyA9IDA7CgogICAgLyoKICAgICAqIG1lbXNldChLMSwwLFNIQTFfSEFTSEtFWUxFTik7CiAgICAgKiBtZW1zZXQoSzIsMCxTSEExX0hBU0hLRVlMRU4pOwogICAgICogbWVtc2V0KGJ1ZiwwLFNIQTFfSEFTSEtFWUxFTik7CiAgICAgKiBtZW1zZXQoZXh0ZW5kZWRBdXRoS2V5LDAsU0hBMV9IQVNIS0VZTEVOKTsKICAgICAqLwoKICAgIGlmIChzZWNyZXRsZW4gIT0gU0hBMV9TRUNSRVRLRVlMRU4gfHwgc2VjcmV0ID09IE5VTEwgfHwKICAgICAgICBtYWMgPT0gTlVMTCB8fCBkYXRhID09IE5VTEwgfHwKICAgICAgICBsZW4gPD0gMCB8fCBtYWNsZW4gPD0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogREVCVUdNU0dUTCgoInNoYTEiLCJTSEExIHNpZ25pbmcgbm90IHByb3Blcmx5IGluaXRpYWxpemVkIikpOyAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgbWVtc2V0KGV4dGVuZGVkQXV0aEtleSwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIG1lbWNweShleHRlbmRlZEF1dGhLZXksIHNlY3JldCwgc2VjcmV0bGVuKTsKICAgIGZvciAoaSA9IDA7IGkgPCBTSEExX0hBU0hLRVlMRU47IGkrKykgewogICAgICAgIEsxW2ldID0gZXh0ZW5kZWRBdXRoS2V5W2ldIF4gMHgzNjsKICAgICAgICBLMltpXSA9IGV4dGVuZGVkQXV0aEtleVtpXSBeIDB4NWM7CiAgICB9CgogICAgU0hBMV9Jbml0KCZjc2hhMSk7CiAgICByYyA9ICFTSEExX1VwZGF0ZSgmY3NoYTEsIEsxLCBTSEExX0hBU0hLRVlMRU4pOwogICAgaWYgKHJjKQogICAgICAgIGdvdG8gdXBkYXRlX2VuZDsKCiAgICBpID0gbGVuOwogICAgaWYgKCgodWludHB0cl90KSBkYXRhKSAlIHNpemVvZihsb25nKSAhPSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiB0aGlzIHJlbGllcyBvbiB0aGUgYWJpbGl0eSB0byB1c2UgaW50ZWdlciBtYXRoIGFuZCB0aHVzIHdlCiAgICAgICAgICogbXVzdCByZWx5IG9uIGRhdGEgdGhhdCBhbGlnbnMgb24gMzItYml0LXdvcmQtYm91bmRyaWVzIAogICAgICAgICAqLwogICAgICAgIG5ld2RhdGEgPSBuZXRzbm1wX21lbWR1cChkYXRhLCBsZW4pOwogICAgICAgIGNwID0gbmV3ZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgICAgY3AgPSBkYXRhOwogICAgfQoKICAgIHdoaWxlIChpID49IDY0KSB7CiAgICAgICAgcmMgPSAhU0hBMV9VcGRhdGUoJmNzaGExLCBjcCwgNjQpOwogICAgICAgIGlmIChyYykKICAgICAgICAgICAgZ290byB1cGRhdGVfZW5kOwogICAgICAgIGNwICs9IDY0OwogICAgICAgIGkgLT0gNjQ7CiAgICB9CgogICAgcmMgPSAhU0hBMV9VcGRhdGUoJmNzaGExLCBjcCwgaSk7CiAgICBpZiAocmMpCiAgICAgICAgZ290byB1cGRhdGVfZW5kOwoKICAgIG1lbXNldChidWYsIDAsIFNIQTFfSEFTSEtFWUxFTik7CiAgICBTSEExX0ZpbmFsKGJ1ZiwgJmNzaGExKTsKCiAgICBTSEExX0luaXQoJmNzaGExKTsKICAgIHJjID0gIVNIQTFfVXBkYXRlKCZjc2hhMSwgSzIsIFNIQTFfSEFTSEtFWUxFTik7CiAgICBpZiAocmMpCiAgICAgICAgZ290byB1cGRhdGVfZW5kOwogICAgcmMgPSAhU0hBMV9VcGRhdGUoJmNzaGExLCBidWYsIFNIQTFfU0VDUkVUS0VZTEVOKTsKICAgIGlmIChyYykKICAgICAgICBnb3RvIHVwZGF0ZV9lbmQ7CgogICAgLyoKICAgICAqIGNvcHkgdGhlIHNpZ24gY2hlY2tzdW0gdG8gdGhlIG91dGdvaW5nIHBvaW50ZXIgCiAgICAgKi8KICAgIFNIQTFfRmluYWwoYnVmLCAmY3NoYTEpOwogICAgbWVtY3B5KG1hYywgYnVmLCBtYWNsZW4pOwoKICB1cGRhdGVfZW5kOgogICAgbWVtc2V0KGJ1ZiwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldChLMSwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldChLMiwgMCwgU0hBMV9IQVNIS0VZTEVOKTsKICAgIG1lbXNldChleHRlbmRlZEF1dGhLZXksIDAsIFNIQTFfSEFTSEtFWUxFTik7CiAgICBtZW1zZXQoJmNzaGExLCAwLCBzaXplb2YoY3NoYTEpKTsKCiAgICBpZiAobmV3ZGF0YSkKICAgICAgICBmcmVlKG5ld2RhdGEpOwogICAgcmV0dXJuIHJjOwp9CiNlbmRpZiAvKiBORVRTTk1QX1VTRV9JTlRFUk5BTF9DUllQVE8gKi8KI2VuZGlmIC8qICBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1VTTV9TQ0FQSSAgKi8K